阿里妹导读:对于软件测试来说,怎么样才算测够了?如何评价测试的有效性?那么多测试用例,以后怎么删?在软件测试中会遇到非常多的问题,阿里研究员郑子颖分享了18个他总结出的难题以及相关看法,希望对同学们有所启发。
冗余步骤:有些是浪费在一些重复的步骤上,每个用例都要去做一些类似的数据准备,每个用例都要去执行一些中间过程(这样才能推进到下一步)。
等价类:一个支付场景,我要不要在所有的国家、所有的币种、所有的商户、所有的支付渠道和卡组的排列组合都测一遍?这么测,代价太高。不这么测,我担心可能某个特定商户在某个特定国家有个特定逻辑我就漏掉了。对于具体的业务,还可以进行人肉分析。有没有更通用的、而且比较完备和可靠的等价类分析的技术手段?
我有N个用例,我猜这N个用例里面可能存在M个用例,即使删掉这M个用例,剩下的N-M个用例的效果和之前N个用例的效果一样。如何识别是否存在这样的M个用例、如果存在的话是哪M个。
一次测试执行批次开始后,数据银行会看到这个批次中后面那些用例需要什么样的数据,提前先准备起来。这样,等执行到那些用例的时候,数据银行里就已经有符合条件的数据准备好了。
根据每个测试用例需要什么样的数据、以及会产生什么样的数据,数据银行可以合理的编排测试用例的执行先后次序,最大化的实现测试数据的复用,减少测试数据的量和准备开销。
正常模式:这就是和今天的编译构建是一样的,产出的构建物是拿去生产环境跑的。
Mock模式:这个模式编译出来的就是该服务的一个mock,但由于是同一套代码编译出来的,最大可能的保留了原来的业务逻辑,做到最大限度的仿真。而且由于是同一套代码编译出来的,后期也不会有“脱钩”的担心,应用代码里的业务逻辑变化都能及时反映在mock里,大大减少mock的人肉维护工作量。
压测模式:这个模式编译出来的也是一个mock,但这个mock是用来给(上游)做性能测试用的。过去在线下的性能压测中经常遇到的情况是:我们想要压的系统还没到瓶颈,这个系统的下游系统(往往是一个测试环境)反而先到瓶颈了。压测模式编译出来的这个mock牺牲了一部分的业务逻辑仿真,但能确保这个mock本身性能非常好,不会成为性能瓶颈(但对lantency仍然是仿真的)。
注: [1] 我工作中还有一些其他的测试难题,那些问题在这里没有列出来,因为那些问题和特定的业务场景或者技术栈的相关度比较高。还有一些测试领域的挑战,难度也很高,例如,回归测试达到99%以上通过率、主干开发以及做到通过代码门禁的code change就是可以进入发布的,这些也非常有难度,但难度主要是是偏工程的而不是软件测试技术本身。 [2] 测试充分度的度量和提升是两个问题。有一种观点认为,测试充分的度量和提升其实是一件事情,用同样的算法分析数据可以进行度量,也能用同样的算法来基于数据进行测试充分度的提升。我不同意这个观点。度量和提升未必是同一个算法。这样的例子非常多了:测试有效性的度量和提升、运维稳定性的度量和提升,等等。即便度量和提升可以用同一种算法,我也希望可以尽量再找一些其他方法,尽量不要用同一种算法又做度量又做提升,因为这样容易“闭环”和产生盲区和。 [3] 当然,这句话今天可能不再是那样了,但那是十几年前,那时候的在线广告和大数据还没到今天这个水平。 [4] 具体形式上,这个数据银行无需是一个平台。它不一定是一个服务,它也不一定需要有UI。它可以就是一个jar包,它可以就是在测试执行时launch的一个单独的进程。