Unit testing “写作”;“可测试单元”;密码?
您使用什么样的实践使代码更易于单元测试?首先编写测试-这样,测试驱动您的设计。我尽可能使用测试驱动开发,因此我没有任何无法进行单元测试的代码。除非首先存在单元测试,否则它不会存在。依赖项注入似乎有帮助。最简单的方法是,除非使用它签入测试,否则不要签入代码 我不太喜欢先写测试。但有一件事我非常坚信,代码必须通过测试签入。甚至不到一个小时前,一起。我认为,只要它们放在一起,它们的书写顺序就不那么重要了Unit testing “写作”;“可测试单元”;密码?,unit-testing,language-agnostic,automated-tests,Unit Testing,Language Agnostic,Automated Tests,您使用什么样的实践使代码更易于单元测试?首先编写测试-这样,测试驱动您的设计。我尽可能使用测试驱动开发,因此我没有任何无法进行单元测试的代码。除非首先存在单元测试,否则它不会存在。依赖项注入似乎有帮助。最简单的方法是,除非使用它签入测试,否则不要签入代码 我不太喜欢先写测试。但有一件事我非常坚信,代码必须通过测试签入。甚至不到一个小时前,一起。我认为,只要它们放在一起,它们的书写顺序就不那么重要了 使用TDD 在编写代码时,尽可能使用依赖注入 编程到接口,而不是具体的类,所以您可以替换模拟实现
确保你的所有课程都遵循以下步骤。单一责任意味着每个类都应该有并且只有一个责任。这使得单元测试更加容易。小型、高度内聚的方法。我用艰苦的方式学习。假设您有一个处理身份验证的公共方法。也许你做了TDD,但是如果这个方法很大,那么调试就会很困难。相反,如果authenticate方法以一种更为伪密码的方式进行工作,调用其他小方法(可能受保护),当出现错误时,就很容易为这些小方法编写新的测试并找到错误的方法。
- TDD——首先编写测试,强制 您需要考虑可测试性和 帮助编写实际可用的代码 需要的,不是你认为你可能需要的 需要
- 对接口进行重构——使 嘲笑更容易
- 如果不使用虚拟方法,则使用公共方法 接口——使模拟更容易
- 依赖项注入——制造嘲弄 容易的
- 更小、更有针对性的方法-- 测试更集中,更容易理解 写
- 避免静态类
- 避免单身,除非 必要的
- 避免使用密封类
- 记录您的假设和排除情况
- 避免使用做不止一件事的大型复杂类——记住以下几点
- 如果可能,使用接口来解耦交互,并允许注入模拟对象
- 如果可能,将pubic方法设置为虚拟,以允许模拟对象模拟它们
- 如果可能,在设计中使用组合而不是继承-这也鼓励(并支持)将行为封装到接口中
- 如果可能,使用库(或DI实践)为实例提供外部依赖关系
<强>从您的单元测试中获得最大值,请考虑以下内容:< /强>
- 让您自己和您的开发团队了解单元测试框架、模拟库和您打算使用的测试工具的功能。当您真正开始编写测试时,了解他们能做什么和不能做什么是至关重要的
- 在开始编写测试之前,先计划好测试。确定要包含在测试中的边缘情况、约束、先决条件、后条件和排除
- 尽可能在您发现损坏的测试时修复它们。测试可以帮助您发现代码中的缺陷和潜在问题。如果你的测试失败了,你将不得不在以后修复更多的东西
- 如果您在团队中遵循代码审查流程,那么也要对单元测试进行代码审查。单元测试和任何其他代码一样,都是系统的一部分——审查有助于识别测试中的弱点,就像审查系统代码一样
它们会在培训、维护、生产开销等方面花费时间。有时值得,有时不值得,但你永远不应该蒙在鼓里,让你的代码更“可测试”。没有静态-你不能模拟静态
谷歌也有一个工具,可以测量你的代码的可测试性…我一直在努力寻找一个过程,在这个过程中,单元测试不是一件烦琐的事情,而是我真正想做的事情。根据我的经验,一个相当大的因素是你的工具。我做了很多ActionScript工作,遗憾的是,这些工具有点有限,比如没有IDE集成,也没有更高级的模拟框架(但好事即将发生,所以这里没有抱怨!)。
1.Using a framework/pattern like MVC to separate your UI from you
business logic will help a lot.
2. Use dependency injection so you can create mock test objects.
3. Use interfaces.