测试写到什么程度算足够?

[b]100%的测试覆盖率[/b]
这是一个很显而易见的答案。但是我不认为这是正确的答案。下面是一个小例子:
[code]
private int[] map = new int[] {
1, 3, 5, 8};
public int oddNumber(int index) {
return map[index - 1];
}
[/code]
写一个简单的测试
[code]
@Test
public void first_odd_number_should_be_one() {
assertEquals(1, oddNumber(1));
}
[/code]
这个测试是不是覆盖了100%的代码呢?我认为是覆盖了的。但是是不是真的测试了所有的执行路径呢?显然没有。oddNumber(4)应该是7,但是这个程序会返回8。我们改一个写法:
[code]
public int oddNumber(int index) {
switch(index) {
case 1: return 1;
case 2:return 3;
case 3: return 5;
case 4: return 8;
}
throw new UnsupportedOperationException();
}
[/code]
换了一种写法之后,测试覆盖率立马就下去了。差别就在于,在第二种写法把执行路径对应到了字面的静态路径上了。所以说,测试应该覆盖是否完全的标准,应该是以动态路径为准,而不是以静态路径为准。同时,也提醒我们,想要靠最后根据测试覆盖率来补测试,是不能让你做到TDD时同等程度的自信的。
在TWU上学的时候,老师给了一个简单的准则:
[b]代码增一行太多,减一行太少[/b]
当然,老师是用英文教课的,我是把意思用中文翻译了一下。这句话是说,代码不能多不能少,以恰好让所有测试通过为最佳。为了验证这个道理,据老师说,[b]Thought[/b]Works UK有一个开发人员写了一个工具用来“删代码”。如果有一行代码是能够删掉之后还能让所有测试都通过的,那么就删掉它。我觉得,这个准则很有务实,也很有用。同时,也回答了另外一个问题,[b]是不是要给所有的类写对应的测试类来覆盖其所有的行为[/b]?我认为没有根据这个准则,答案应该是没有必要。只要你的测试覆盖了这个类的所有执行路径就可以了。至于这个测试是不是针对这个类独立进行测试的,是单元测试还是功能测试,是黑盒测试还是白盒测试,都不重要。重要的是,你删掉这个类中一行或者几行,都会让所有测试中至少一个测试失败。这就能说明,你的测试是写到位了。
当然,再加一些怀疑和批评的态度。对于上面那个放之四海皆准的准则,有一个例外:那就是这个准则只关心程序的正确性,但是我要说程序的行为是由正确性和效率共同组成的。举一个空泛的例子:
[code]
if (a) {
doSomethingUnderConditionA();
} else if (b) {
doSomethingUnderConditionB();
}
[/code]
条件A和B可能在匹配的集合上是包含关系,也就是说一个是另外一个的强条件。假设A是更强的条件,那么在条件更强的情况下,我们往往可以给一个更有效率的解。但是有可能,如果没有条件A这个分支,所有情况都走条件B的分支,解仍然是正确的。所有说,A的存在不影响程序的正确性,只影响了程序在特定条件下的效率。那么,在这种情况下,就不能说代码增一行太多了。
### 选择自动化测试工具的标准和考虑因素 #### 测试需求明确化 在挑选自动化测试工具前,明确定义项目所需执行的具体测试类型至关重要。这包括但不限于功能测试、性能测试、安全测试等特定领域的要求[^2]。 #### 工具的功能匹配度 所选工具应具备满足上述定义好的各类测试活动的能力,并能良好适应被测系统的特性与环境配置要求。例如某些工具擅长Web应用界面交互操作模拟而另一些则更适合API级别的验证工作[^3]。 #### 成本效益分析 考虑到实际可用的资金状况来决定投资于何种程度上的解决方案也是必不可少的一环;既要确保不会超出预范围又要保障最终选定的产品能够带来足够的回报价值。此外还需考量长期维护成本及其对企业内部资源占用情况的影响[^1]。 #### 技术栈兼容性和易用性 团队成员对于目标平台和技术框架的熟悉程度会直接影响到后期开发效率及稳定性表现。因此建议优先考察那些可以无缝集成现有基础设施并拥有较低学习曲线选项[^4]。 #### 社区活跃度和支持服务 一个强大且积极向上的开发者社群意味着可以获得更多的第三方扩展插件以及及时有效的官方文档指导帮助解决问题。当遇到困难时也能更快找到解决办法从而减少不必要的延误风险。 ```python def evaluate_tool(tool, criteria): score = 0 # 基础得分项 if tool['supports'] >= set(criteria['required_features']): score += 5 # 加分项 if 'community_support' in tool and tool['community_support']: score += 3 if 'cost_effective' in tool and tool['cost_effective']: score += 2 return score ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值