下图是具体代码,整个方法体的代码都是浅蓝色,代码都被覆盖到了。
回头看看测试数据,虽然达到了100%语句覆盖,但是依然遗漏了“闰年,366天”这样一条数据,只要我们用这条测试数据来测试,就能发现错误了。
下面来说说用VSTS做单元测试,通过一些设置来帮助我们发现类似这个死循环的BUG。在VSTS里面,可以设置每个单元测试的超时时间,默认是 30分钟,这样对于发现一些出现死循环的BUG不太有利。很多人都说过,单元测试的一个特点就是–快!因为测试只是检查一小个单元是否能正常工作。如果一个“单元测试”需要几分钟,那么几乎可以很肯定地说,这不是一个单元测试,这个测试肯定跟外界有很多交互,例如读取一个外部文件?读取数据库?请求一个 web service等等。在Test run config里面,把超时时间设置为10秒,如果一个测试会导致死循环,那么10秒后,就会提示我们该单元测试出现超时,如图:
设置好了以后运行一下单元测试:
[TestMethod()] public void AddDayTest1() { int days = 366; int year = 2008; Class1.AddDay(days, year); } |
出现结果:
很好,我们可以在比较短的时间内发现问题,而不是观察CPU占用率长期达到100%。
总结:现在的代码覆盖率工具,大部分都只有语句覆盖的功能,而语句覆盖又是众多代码覆盖标准里面最弱的一种。有时候做白盒的测试(单元,集成……),会很容易掉进一个陷阱,就是看着代码覆盖率工具给出的结果,来提高自己测试代码覆盖率。这样代码的覆盖率上去了,但是代码的质量却不见的能有提高。以后做测试的时候,也应该把精力放在关键部分的代码逻辑的验证上,不要老盯着覆盖率往上涨。