建设部网站 挂证,网页升级紧急通知在线,做枸杞的网站,微博推广的方法大家都知道#xff0c;开发软件的时候为代码编写单元测试是很好的。但实际上#xff0c;光有测试还不够#xff0c;还要编写好的测试#xff0c;这同样重要。
要做到这一点#xff0c;考虑遵循一些固执的原则#xff0c;对测试代码给予一些关爱#xff1a;
1. 保持测试… 大家都知道开发软件的时候为代码编写单元测试是很好的。但实际上光有测试还不够还要编写好的测试这同样重要。
要做到这一点考虑遵循一些固执的原则对测试代码给予一些关爱
1. 保持测试代码的紧凑和可读性
要做到这一点应该要进行毫不留情的重构就像对生产代码应该做的那样。否则让测试代码随着时间腐化就是在测试里面制造可怕的遗留代码。如果测试不能很容易重构那么生产代码也很难重构从而导致生产系统的遗留代码。始终做一个勇敢的重构者。
2. 避免编写重复累赘的断言
举个例子测试代码使用正则表达式生成内容而这个正则表达式是跟生产代码的解析器中使用的一模一样的。
一般来说我们不希望在测试和代码之间复制逻辑。因此在测试中复制正则表达式或其他内容不是一种选择。在这种情况下考虑测试输入激励/输出结果之间的关系f输入 - 输出可能会有帮助例如如果代码的目标是要做模板替换不要在测试代码里用原始值来做替换。相反在测试里面直接指定预期的计算结果。 // 使用
Assertions.assertThat(processTemplate(param1, param2)).isEqualTo(this is param1, and this is param2));// 而不要用
Assertions.assertThat(processTemplate(param1, param2)).isEqualTo(this is %s, and this is %s, param1, param2));
复制代码 3. 覆盖尽可能多的范围包括正面情况以及甚至更重要的出错的代码路径。
通常要做到这一点最好的办法试采用测试驱动开发Test Driven Development。通过TDD人们可以在设计时识别可能会出错的部分。不要羞于为一段小代码编写一个简单的测试用例。你永远不知道什么时候为什么以及以什么方式你会要用到甚至修改这段代码。 可以研究一下如何检查测试的有效性类似PIT这样的工具可以进行变更测试值得研究一下。
4. 不要Mock你不拥有的类型
这不是一个硬界限但越过这条线很可能会产生反作用力
TDD是关于设计的也是关于测试的两者一样重要在模拟外部API时测试不能用于驱动设计API属于第三方这个第三方可以并且实际上也经常会更改API的签名和行为。
想象一下Mock第三方Lib的代码。在第三方库的某次升级之后它的逻辑可能会改变但测试套件仍会执行得很好因为它被Mock了。所以后来你认为一切都很好毕竟构建墙是绿色的软件部署上去然后......嘣
如果你感觉需要Mock第三方库可能表明你当前的设计与第三方库没有足够的分离。
另一个问题是第三方库可能很复杂需要大量的Mock才能正常工作。这导致过度指定的测试和复杂的测试辅助装置这本身就损害了紧凑和可读的目标。或者由于模拟外部系统过于复杂从而导致测试代码对生产代码的覆盖不足。
取而代之的最常见的方法是围绕外部lib / 系统创建包装器尽管应该意识到抽象泄漏的风险其中过多的低级API概念或异常超出了包装器的边界。为了验证与第三方库的集成编写集成测试并使它们尽可能紧凑和可读。
5. 不要Mock一切这是一种反模式
如果一切都被Mock我们真的在测试生产代码吗该不Mock的时候不要犹豫
不要Mock值对象
为什么人们甚至想要这样做
因为实例化对象太痛苦了 不是正当理由。
如果创建新的对象太难了那么代码可能需要一些严肃的重构。另一种方法是为您的值对象创建构建器 - 有一些工具包括IDE插件Lombok和其他。还可以在测试类路径中创建有意义的工厂方法。 abstract class CustomerCreations {public static Customer customer_with_a_single_item_in_the_basket() {// long init sequence}
}
复制代码 Mockito专注于对象之间的相互操作这是面向对象编程的核心部分。