编写"单元可测试"代码?

Dan*_*olt 37 language-agnostic automated-tests unit-testing

您使用什么样的实践来使您的代码更适合单元测试?

tva*_*son 53

  • TDD - 首先编写测试,强制您考虑可测试性并帮助编写实际需要的代码,而不是您认为可能需要的代码

  • 重构接口 - 使模拟更容易

  • 公共方法虚拟,如果不使用接口 - 使模拟更容易

  • 依赖注入 - 使模拟更容易

  • 更小,更有针对性的方法 - 测试更集中,更容易编写

  • 避免静态类

  • 除非必要,否则请避免使用单身人士

  • 避免密封课程


dss*_*539 12

依赖注入似乎有所帮助.

  • 我认为依赖注入很关键(手动很好,你不需要使用DI框架).没有它,大多数测试都被迫进行集成测试而不是单元测试. (2认同)

Sha*_*mer 9

首先编写测试 - 这样,测试就可以推动您的设计.


Pau*_*ams 6

  1. 使用TDD
  2. 在编写代码时,尽可能利用依赖注入
  3. 编程接口,而不是具体的类,因此您可以替换模拟实现.

  • @Visage:出于好奇,如果你可以使用TDD,但是没有在任何地方使用依赖注入,并且在许多地方使用了具体的类,并且没有一直使用模拟,那该怎么办呢?做了所有这些坏事,但完成了90%或更多的代码覆盖率.这会让你成为一个坏人,还是意味着并非所有其他东西都是真正必要的质量? (2认同)

Rob*_*ino 6

确保您的所有课程都遵循单一责任原则.单一责任意味着每个班级应该只有一个责任.这使得单元测试更容易.


小智 5

编写测试时(与任何其他软件任务一样)不要重复自己(DRY原则).如果您的测试数据对多个测试有用,那么将它放在两个测试都可以使用的地方.不要将代码复制到两个测试中.我知道这似乎很明显,但我发现它一直都在发生.

  • +1大多数开发人员认为"哦,这只是测试代码,谁在乎它是不是很糟糕?" 这很难过,因为他们通常写的代码已经足够糟糕了! (2认同)

Fre*_*red 5

我敢肯定我会对此投反对票,但无论如何我都会发表意见:)

虽然这里的许多建议都很好,但我认为需要稍微调整一下。目标是编写更健壮、可更改和可维护的软件。

目标不是拥有可单元测试的代码。尽管可测试的代码不是目标,但还是付出了很多努力使代码更“可测试”。这听起来非常好,我相信它会给人们带来温暖的模糊感,但事实是所有这些技术、框架、测试等都是有代价的。

它们在培训、维护、生产力开销等方面花费时间。有时值得,有时不值得,但您永远不应该戴上眼罩,并提前使您的代码更“可测试”。

  • +1 表示常识,-1 是因为可测试的本质使代码变得更容易更改和维护 (2认同)
  • +1为了一些理智!单元测试固然很棒,但如果使用测试来覆盖“一切”,TDD 就会成为快速完成任务的一大障碍。如果您对诸如 getter/setter 之类的琐碎代码或样板代码进行测试,则更有可能由于接口更改而不是实际错误而导致测试失败。智能单元测试很好。过度的单元测试会导致代码脆弱和开发缓慢。 (2认同)
  • +1 常识。永远用你的大脑。但是我编写单元测试并不是为了让我感到困惑,并且可以编写复杂的代码来让我感觉自己很聪明,我这样做是因为它使我的代码更具可变性和可维护性,而且我知道它可以工作。如果我不必让我的代码工作,我可以更快地完成工作! (2认同)