不可测试代码的警告标志

时间:2009-01-05 07:39:28

标签: unit-testing oop singleton

不可测试的代码真的让我烦恼。 以下事项使oo-code不可测试:

  • 全球州,例如,单身设计模式
  • 做一些奇特工作的静态方法,例如数据库访问
  • 深度继承树
  • 在构造函数中工作,例如控制声明
  • 违反单一责任原则的课程

是否有更多警示标志?

10 个答案:

答案 0 :(得分:12)

这些都不会使代码无法测试。它们可能会使查找边缘案例错误变得更加困难,但是,如果您已经完全指定了测试的成功标准(以及测试驱动的开发使这一点变得容易),那么您所要做的就是通过标准。

TDD可以应用于特定零件的行为以及整个项目,因此您可以轻松地测试非常小的组件。但是,它的意思是测试结果,获得这些结果的方法。

如果测试通过,您已满足要求。如果存在错误,则这是测试的问题,而不是正在测试的代码(在这种情况下,应该修改测试以捕获先前无法预料的问题)。

你不应该关心(在功能交付方面)你的一个构造函数中是否有while语句。你应该问问自己有哪些业务要求?我强烈怀疑您的客户会提供一系列要求,包括“继承限于4级”。他们可能会将“无错误”列为要求,但您必须在那个问题上进行协商: - )。

答案 1 :(得分:11)

请参阅MiškoHevery的以下博文:How to Write 3v1L, Untestable Code

答案 2 :(得分:6)

硬编码依赖项。

答案 3 :(得分:4)

  • 不编程接口
  • 新建对象而不是使用工厂/ IOC

答案 4 :(得分:1)

在GUI类中完成的工作与表示无关。 GUI应该与底层模型完全分离。

答案 5 :(得分:1)

代码是不可测试的,只要您无法修改它。如果你有可能重构项目,没有代码是不可测试的。通常,只需要非常小的修改就可以使测试更容易。而且它们可以被证明是合理的,因为它们可以提高代码的质量。

即使在您描述的情况下,代码也不一定是不可测试的。这个测试更加困难。例如,如果您可以隔离数据库访问并在单元测试期间避免使用它们,则更容易测试代码。但如果必须,您可以建立一个专门用于运行测试的数据库。

答案 6 :(得分:1)

我会说这些事情都不会使代码无法测试。它们确实使单元测试变得困难,因为每个都会增加实现中的耦合。

使单元测试困难的其他烦恼:

  • 与业务逻辑代码混合的图形用户界面代码
  • 所有反模式,但上帝特别反对(http://en.wikipedia.org/wiki/God_object
  • 沿着同样的路线,一个巨大的功能也很烦人

一般而言,您可能会听到有关创建更好代码的任何建议,这也是建议更容易使用单元测试代码。

答案 7 :(得分:1)

数据库!特别是有触发器的那些!

我知道你可以模拟数据库,但我总是发现我的代码中的大多数错误(主要是CRUD应用程序)都是数据/映射问题,如果你模拟数据库,你就找不到那种错误。

答案 8 :(得分:1)

Writing Testable Code上的MiškoHevery指南详细说明了使代码难以测试的缺陷。他的名单与你的名单有些重叠,但却有着令人难以置信的细节。

  • 构造函数执行实际工作
  • 深入研究合作者
  • 脆弱的全球状态&单身
  • 班级太多

答案 9 :(得分:0)

没有分层,耦合过多...即已经编写了Y类来了解X,但它不应该,X是可重用的。可测试性和可重用性之间存在密切关系。