给软件工程师的12条单体测试的建议
作者:软件测试工程师 发布时间:[ 2010/7/28 15:00:42 ] 推荐标签:
6.适用Mock对象进行有效测试
设置测试不是那么简单,而且有时候第一眼的感觉是不可能做到。例如,如果在代码中适用AmazonWeb服务的代码,你如何在不影响实际系统的情况下在测试中模拟它呢?
有几种方法。你可以制造一些假数据并在测试中适用它们。如果系统有用户,可以利用特殊的专门为测试设定的帐户集合。
针对上线系统运行测试是很危险的,假使某些东西出错或者你删掉了实际用户数据。另一种选择是使用称之为Stub或Mock对象的假数据。
一个Mock对象实现了特定接口并返回预先确定的结果。例如,你可以为AmazonS3创建一个从本地硬盘读取文件的Mock对象。Mock对象在测试带有很多组件的复杂系统是很有用。对于Java,有一些框架可以帮助生成Mock对象,其中有名是JMock。
7.在重构代码时重构测试
测试只有在你真正投入时才会给你回报。你不仅需要编写测试,你还需要确保它们是新的。在你给一个组件加入一个新的方法时,你需要加入一个或多个相应的测试。正像你需要清理不用的代码。你也需要清理不再有用的测试。
单体测试在进行大规模重构的时候尤为重要。重构关注代码的持续修整以保证其正确。如果你移动代码并修改了测试,通过重新运行所有相关的测试可以确保你没有在更改系统的过程中破坏任何东西。
8.在修改缺陷前先写测试
单体测试是寻找缺陷的有效武器。当你发现你代码中的一个问题,在修改代码之前写一个可以暴露该问题的测试。这样如果同样的问题重新出现,测试可以捕捉到。
这点在你无法一次写好面面俱到的测试的情况下非常重要。在你为一个缺陷加一个测试的时候,你也在以一种训练有素的方式填补原有测试的漏洞。
9.利用单体测试确保性能
除了确保代码的正确性之外,单体测试还可以确保你的代码性能不会随着时间变迁而退化。很多系统会随着变大而变慢。
为了编写性能测试,你需要在你的testclass的基类中实现开始和结束函数。在适当的地方你可以使用时间相关的方法或代码并断言消耗的时间在期待性能的极限值之内。
10.为并发代码编写测试
并发代码很复杂并且通常是很多缺陷的根源。因此对并发代码进行单体测试很重要。进行的方法是通过使用休眠和锁系统(SystemofSleepsandLocks)。在测试中你可以在需要等待特定系统状态的时候调用休眠代码。尽管这不是正确的解决,但在多数情况下这足够了。为了在更复杂的环境中模拟并发,你需要在所测试对象之间传递锁。通过这些,你可以以顺序执行的方式模拟并发系统了。
11.持续运行测试
测试的意义在于可以不断运行它。特别对于数十人在同一个代码库上进行开发的团队中,持续的单体测试尤为重要。你可以将测试设置为每几个小时运行一次或者在每次代码签入时运行或者每天运行一次(通常在深夜)。可以根据项目确定一个合适的方法并让测试可以自动持续运行。
12.享受测试!
可能重要的建议是享受这一切!当我第一次遇见单体测试时,我有过怀疑并认为这仅仅是增加工作量。但是我给了它一次机会,因为我信任的那个聪明的家伙告诉我它很有用。
单体测试让你的大脑进入了一个和编码状态很不同的状态。想着对于特定的组件什么才是简单和正确的测试集很有挑战性。
一旦你开始写测试,你会想没有它们你会怎样?为了让测试更有趣你可以加入结对编程(PairProgramming)。无论你是和同事一切写测试代码还是帮对方写测试代码,都一定会很有趣。每天结束的时候,看着所有的测试都通过你知道你的系统真的可以工作了,你会觉得很轻松。

sales@spasvo.com