【发布时间】:2013-12-05 12:42:08
【问题描述】:
有没有办法编写类似“单元测试”的东西来确保某些代码不会编译?
我为什么想要这样的东西?两个原因。
1) 检查我的 API 的类型安全性。我想要一种方法来确保如果有人传入一个错误的值,你会得到一个编译器错误,而不仅仅是一个运行时错误。显然,我可以只运行编译器并检查错误,但是在单元测试中将其形式化有利于避免回归和文档。
例如,考虑这个测试。有一些我用来检查类型安全性的注释掉的代码: https://github.com/squito/boxwood/blob/master/core/src/test/scala/com/quantifind/boxwood/EnumUnionTest.scala#L42 (第 42 和 48 行——在第 34 行我调用了一个不同的 API,它有一个运行时异常,我可以检查)
实际上,我花了一些时间才得到正确的类型安全,所以这些都是重要的检查。现在,如果我去修改底层实现,我不能只运行我的测试套件——我还必须记得取消注释这些行并检查编译器错误。
2) 测试宏的错误处理。如果宏有一些错误的输入,它应该会导致编译器错误。同样的问题,同样希望在易于运行的测试套件中使用它。
我使用 ScalaTest,但我很高兴这里有任何单元测试框架的解决方案。
【问题讨论】:
-
对此的明显解决方案是编写一个单元测试,在该单元测试中指定的资源上运行编译器并解析编译的输出。以这种方式查看源代码不是单元测试本身,而只是运行单元测试的资源。
标签: unit-testing scala