现在,你已经看到了适应度函数可能性的广度,让我们重用前面的两个例子,推导出它们对应的类别,将理论介绍活学活用。
在示例2-1中定义了第1版适应度函数,用于测试单元测试覆盖率。
下面是该适应度函数的分类细目。
反馈广度:原子
单元测试覆盖率只能为我们提供整个系统功能的有限反馈。
执行方式:触发式
执行位置:持续集成/持续部署流水线
每次向源码控制系统推送时都会触发执行,执行单元测试并度量单元测试覆盖率。
指标类型:特定值 ( >90% )
自动化
适应度函数会自动执行并评估。
质量属性需求:可维护性
利用这个适应度函数,可以使系统的可维护性保持在一定水平上;我们把良好的测试覆盖率视为一个指标,表明系统可以更容易地被维护(调整、更改、提升)。
静态还是动态:静态
示例2-2(集成测试覆盖率)的分类也是一样的。该适应度函数将位于金字塔的底层。
示例2-3中定义的适应度函数用于测试网络延迟情况下的特定功能,下面是该适应度函数的分类细目。
反馈的广度:原子/整体
作为整体适应度函数更难分类;这主要取决于正在执行的测试以及第三方系统对系统的重要性。
如果第三方系统被用于系统的许多用例中,那么可以将其归类为整体适应度函数;否则可以将其归类为原子适应度函数。
执行方式:触发式
执行位置:持续集成/持续部署流水线和测试环境
每晚在持续集成工作流程中触发执行,但测试是在测试环境中进行的。
指标类型:0/1(如果所有测试通过)
即关注的是所有测试的通过率,但由于我们要求所有测试都要通过,因此不是0就是1。
自动化
适应度函数将自动执行评估,每晚运行一次。
质量属性需求:可靠性
利用这个适应度函数,我们追求的目标是,即使在第三方接口响应缓慢的情况下,也要保持系统的高可靠性。
静态还是动态:静态
下面是示例2-4的分类细目。
反馈广度(原子或整体):两者都可以
这个特定的适应度函数是归类为原子适应度函数更好还是归类为整体适应度函数更好,主要取决于正在执行的测试、第三方系统对系统的重要性以及系统的整体性能。如果该系统在多个用例中使用了第三方系统,那么它就会影响整个系统的性能,因此应该将其归类为整体适应度函数。
执行方式和位置:触发式,持续集成/持续部署流水线和测试环境
每晚在持续集成工作流程中触发执行,但测试是在测试环境中进行的。
指标类型:两种类型
第一种类型,如果通过所有测试,则为0/1。即对所有测试的通过率感兴趣,但因为所有测试都必须通过,所以只能决定是0还是1。第二种类型是性能度量的特定值:在本例中,快于10分钟。
自动化:是
适应度函数将自动执行评估,每晚运行一次。
质量属性需求:可靠性,效率
利用这个适应度函数,我们追求的目标是,即使在第三方接口响应缓慢的情况下,也要保持系统的高可靠性和足够的性能。
静态还是动态:静态
这是一个静态函数,这里的两个指标是静态定义的,因为目标值不依赖于另一个适应度函数的结果。
如前文所述,我会把示例2-3和示例2-4放在适应度函数测试金字塔的中间层。