软件测试中常见的11个难题

时间:2021-03-24     来源:易思训教育 作者:易思训
分享: 更多

其实软件测试这件事情本身的难度一点都不亚于软件开发,甚至可能更难一点常见的难题主要有以下这些。

 

1测够了吗?

 

其实这是一个测试充分度的问题。

 

代码覆盖率是衡量测试充分性的起点,但远远不是终点。要回答测够了吗,至少还要考虑是否测了所有的场景、所有的状态、所有的状态转移路径、所有的事件序列、所有可能的配置、所有可能的数据等等等等。

 

即便如此,我们可能还是无法100%确信我们已经测够了。可能我们最终只能做到非常趋近于测够了。

 

2bug发现能力如何?

 

如何评价一组测试用例的发现bug的能力,属于测试有效性的问题。

 

评价测试用例有效性可以通过正向的分析进行,例如,分析测试用例是否校验了所有在测试过程中SUT落库的数据。更具有通用性的做法是变异测试(Mutation Testing),即在被测代码里注入不同的人造bug”,统计多少能被测试用例感知到。

 

3哪些测试用例是在浪费时间?

 

那么多用例,要花那么多时间去跑,这里面一定有很多时间是浪费掉的,但如何才能知道哪些是浪费掉的呢?

 

浪费的形式包括:

 

冗余步骤:有些是浪费在一些重复的步骤上,每个用例都要去做一些类似的数据准备,每个用例都要去执行一些中间过程。

 

等价类:一个支付场景,要不要在所有的国家、所有的币种、所有的商户、所有的支付渠道和卡组的排列组合都测一遍?这么测,代价太高。有没有更通用的、而且比较完备和可靠的等价类分析的技术手段?

 

N个用例,推测这N个用例里面可能存在M个用例,即使删掉这M个用例,剩下的N-M个用例的效果和之前N个用例的效果一样。如何识别是否存在这样的M个用例、如果存在的话是哪M个。

 

据说阿里内部职级晋升P9评审,曾经就出现过测试用例很多,你怎么删的问题,看似简单,其实很难。

 

4要不要做全链路回归?

 

很多团队都会纠结到底要不要做全链路回归、做到什么程度。

 

这个问题的核心点就是:有没有可能,只要把系统间的边界约定的足够好足够完整,就可以做到在改动一个系统的代码后,不需要和上下游系统进行集成测试,只要按照边界约定验证好自己的代码就可以确保没有任何regression了。

 

很多人相信那是可能的,但既无法证明,也不敢在实操中就完全不跑集成。

 

5如何减少分析遗漏?

 

分析遗漏是很多故障的原因。

 

开发做系分的时候,有一个corner case没考虑到、没有处理。测试做测分的时候,忘记考虑某个特殊场景了。兼容性评估,评估下来没有兼容性问题的,但结果是有的。

 

而且很多时候,分析遗漏属于unknown unknowns我们压根就不知道我们不知道。

 

6用例自动生成

 

Fuzz TestModel Based Test、录制回放、Traffic Bifurcation(引流)等都是自动生成用例的手段。有些已经比较成熟(例如单系统的录制回放、引流),有些多个团队都在探索(例如Fuzz),有些则一直没有大规模的成功实践(例如MBT)。

 

7问题自动排查

 

包括线上和线下。对于比较初级的问题,自动排查方案往往有两个局限性。

 

首先,方案不够通用,多多少少比较定制化。其次,比较依赖人工积累规则(说的好听点叫专家经验),主要是通过记录和重复人肉排查的步骤来实现。然而,每个问题都不完全一样,问题稍微一变,之前的排查步骤可能就不工作了。

 

8缺陷自动修复

 

阿里的PrecfixFacebookSapFix等是目前比较知名的一些工业界的做法。但总的来说,现有的技术方案,都有这样那样的局限性和不足,这个领域还在相对早期阶段,后面的路还很长。

 

9测试数据准备如何提高效率?

 

测试用例的一个重要设计原则是:测试用例之间不应该有依赖关系,一个测试用例的执行结果不应该受到其他测试用例的执行结果(包括是否执行)的影响。

 

但如果每个用例所需要用到的测试数据都是自己来从头准备的,执行效率就比较低。怎么既不违背测试用例之间不应该有依赖关系的大原则,又能减少测试数据的准备时间?

 

10兼容性测试

 

代码和数据的兼容性问题有很多形式。例如,如何确保新代码能够正确的处理所有的老数据?有时候,老数据是几个月前的老代码产生的,例如,一个正向支付单据可能会到几个月以后才发生退款退票。

 

有时候,老数据可能就是几分钟前产生的:用户的一个操作,背后的流程执行到中间的时候代码被升级了。

 

验证这些场景下的兼容性的难度在于:需要验证的可能性太多了。今天的退款请求对应的正向单据,可能是过去很多个版本的代码产生的。一个业务流程执行到中间具体什么地方代码被升级了,可能性也非常多。

 

11防错设计

 

严格来说,防错设计并不是software testing范畴内的。

 

但做测试做久了就发现,有很多bug、很多故障,如果设计的更好一点,就压根不会发生(因此也就谈不上需要测试了)。

 


相关文章

上一篇:什么是黑盒测试
下一篇:软件测试需要学什么? 上一篇:暂无

今日优惠
免费试听教程