大家好,我是阿萨。测试方法越来越多,但是阿萨觉得最经济实惠的测试方法其实是精准测试。但是今天不谈精准测试,聊一个和精准测试接近的内容,阿萨分享下代码改动影响面测试以及如何减少测试数量。
现在软件开发速度越来越快,质量要求越来越高。更快上市时间,更多实用功能,更多服务提供,这些慢慢成为一种趋势。产品交付周期越来越短。
为了满足客户的越来越快的交付诉求以及越来越快的市场变化,大部分公司已经转向敏捷开发。更迅速的交付时间,更小团队,更精细化的职能。
现在都是小团队,每个团队处理的业务更细小。一个小服务可能多个团队工作在上面。服务时间是如何影响的,那个服务调用了修改后的代码,如何正确测试修改后的服务,同时要保证交付的高质量。
因此,我们在各个层面上写了越来越多的测试。我们写单元测试,来测试代码的每个不同部分。我们还写端到端测试,以检查应用程序的行为是否符合预期,以及UI测试,以检查用户是否可以正确使用应用程序。这些都是昂贵的测试,需要资源来编写和运行它们。
这意味着,我们很快就会达到一个瓶颈,我们不能再快了。测试的数量不断增加,运行它们所需的时间也在增加。这阻碍了开发周期,而开发周期正在等待反馈结果,以了解哪些地方不工作,需要修复。
唯一的选择是开始删除测试,但由于团队并不真正了解测试的实际情况,他们担心如果他们删除任何一个测试,那么就会错过一些东西,他们会得到更多的生产问题。
继续走这条路而不做任何事情,意味着我们会遇到这个障碍,这反过来会影响我们的产品质量。典型的情况是,尽管他们不愿意这样做,但团队开始根据猜测来削减测试,或者只做单元测试,因为他们被要求或者不能全部运行。
一些经理或团队说服自己,认为单元和组件测试已经很好了,他们得到了太多的关注,因为他们的速度更快,但他们正在失去质量,因为他们正在运行低质量的测试。
软件需要被正确地测试。盲目地添加测试,而不真正了解你在哪里添加测试,并运行你所有的测试,这不是答案。它不符合我们必须尽可能快地推出一切的要求。我们需要大幅减少所需的测试数量,使用智能测试选择只执行所需的测试,并通过识别和阻止未经测试的代码变化进入生产,实现高质量。
那么,我们怎样才能做到这一点呢?我们需要一个聪明的方法来识别哪些测试是真正需要执行的,从而减少测试的数量,并在哪里增加针对高风险领域的最小数量的新测试。
在这里集中讨论一下如何减少测试的数量。
早在2017年,ThoughtWorks的首席科学家Martin Fowler写道。
"分析影响面并测试(TIA)是一种加快构建的测试自动化阶段的现代方法。它的工作原理是分析源代码的调用图,以确定在对生产代码进行修改后应该运行哪些测试。微软已经在这个方法上做了一些广泛的工作,但对于开发团队来说,也有可能以相当便宜的价格实现一些有用的东西"
因此,分析影响面并测试(TIA)是有一种方法来了解开发实际上是在哪里碰到了代码。然后利用这些知识来决定哪些测试应该根据代码的变化来运行/跳过。
以下是TIA帮助我们处理的一些挑战,即减少运行的测试数量。
当开发人员进行代码修改时,启动了CI/CD流程,他们的代码被构建、部署和测试的时间会很长,在此期间他们会转向其他事情。当他们最终得到反馈时,他们需要切换回来,所有这些上下文的来回切换都会浪费时间,造成挫败感,并最终导致低质量的代码。
因此,通过运行最小数量的测试,我们减少了这些上下文切换,并在一个允许他们更有效地处理问题的时间框架内给予开发人员反馈。
由于回归测试需要很长的时间,它们通常不是标准CI/CD流程的一部分,通常会每晚运行一次,甚至更少。测试影响分析允许你作为CI/CD过程的一部分运行部分回归周期,并在上下文切换到另一个主题之前再次向你的开发团队提供这种反馈。当然,你仍然可以每晚运行一次完整的回归,或者当你需要获得回归周期的全貌时。
对于热补丁来说,时间是最重要的。你需要尽可能快地把它们推出来。但你怎么知道要运行哪些回归测试?要么就是根本不运行,要么就是猜测,试图希望你测试本应运行的东西。
通过测试影响分析,你知道你需要运行哪些测试来最大化测试覆盖率,并更有把握地发布热点。下一个挑战是与成本有关。运行这么多测试需要大量的资源和复杂的CI来协调这一切。你要在多台机器上运行所有这些测试,在多个测试环境中尝试并行运行这些测试。
所有这些硬件都要花很多钱来维持运行。你还投入时间来编写和维护复杂的CI,这需要资源来完成,这也有很高的成本。当然,也有自动化服务可以为你做很多事情,但它们也不便宜。所以,测试影响分析允许你减少CPU时间,旋转更少的机器,既削减了开支,又减少了花费的时间。
最大的成本因素之一是手动测试。很多公司仍然有某种形式的手动测试,要么是因为他们的自动化测试不够成熟,要么是因为某些领域的自动化不值得花费。手动测试某些东西可能需要几个小时或几天的时间,所以为了减少这个时间,雇佣了很多手动测试人员来并行工作,你需要为他们提供测试环境。这可以使你的成本急剧增加。
测试影响分析使用人工智能来评估以前执行过的测试,这样手动测试人员就能准确地知道他们需要根据代码变化来运行哪些测试,从而节省大量的时间和资源。
那么一些成熟公司是如何使用TIA的呢?
一些公司的系统使用机器学习来了解每个测试所测试的代码的哪些部分。这是在任何测试阶段进行的,如部署后的回归测试,甚至包括手动测试。
每次构建开始时,会识别哪些代码被修改了,基于对哪些测试之前经历了代码修改的了解,会自动向测试框架提供反馈,指示它跳过哪些测试,而不需要修改你的测试或代码。
对于手动测试,向手动测试人员提供反馈,告诉他们需要执行哪些测试。
这就是TIA 测试, Test Impact Analysis.