自动创建单元测试(半)?

时间:2008-12-28 16:04:15

标签: java unit-testing automation code-generation annotations

是否有支持从注释生成一些标准单元测试的框架?我想到的一个例子是:

@HasPublicDefaultConstructor
public class Foo {

}

这显然会用于自动生成一个单元测试,用于检查Foo是否具有默认构造函数。我是唯一一个想到这样的人吗? ;)虽然我对Java最感兴趣,但其他语言的解决方案肯定也很有趣。

编辑:回应S.Lott的回答,让我澄清一下:

我正在尝试测试该类是否具有默认构造函数。 (当然这只是一个例子。)我可以通过编写测试来做到这一点,但我觉得这很乏味。所以我正在寻找一种工具,可以在编译时处理注释(通过APT)并为我生成测试。 这样的事情存在吗?如果没有,你认为这是个好主意吗?

11 个答案:

答案 0 :(得分:7)

问题是,使用附加注释形式的单元测试信息“污染”生产代码是否真的是个好主意。 我个人投反对票。

答案 1 :(得分:2)

听起来你正在寻找一种比标准Java具有更多声明性表达能力的编程语言。您假设的测试填补了空白,直到编译器可以检查声明的语义。

我不知道有任何工具可以将您建议的注释类型转换为自动化测试。这听起来像是一个很好的TDD练习,尤其是最近的(-ish)编译器API。

答案 2 :(得分:2)

tl; dr:请改用代码检查工具。他们可以做你想做的事,不污染你的代码,可以很容易地构建到自动构建过程中。

这听起来不像应该用单元测试处理的东西。如果您坚持认为每个类都必须定义一个默认构造函数,那么静态代码分析器可能是更好的选择。 PMD肯定有这种东西的探测器。您也可以使用Checkstyle强制使用此类检测器。

这些都可以轻松定制,并且可以在单元测试的同时成为持续集成过程的一部分。

最关键的一点:这将允许您实现所需的功能,而不会通过额外的注释污染代码库。当我看到这个想法时,这是我的主要跳伞点:你已经创建了一个巨大的软件管理问题。

想象一下使用默认构造函数修改类是不可变的情况(因此要求在构造期间完全设置对象)。您是否记得更新该课程中的所有注释?您是否记得在其他调用此方法的类中更改相关注释?等等。

答案 3 :(得分:1)

Agitar有[商业] 产品AgitarOne,可生成JUnit测试。 我不确定它目前是否支持注释,didn't in 2005

Jtest是另一个面向Java的单元testr生成器,Parasoft还提供C++Test来生成C ++单元测试。

我从未测试过任何一个;我几年前读过C ++试卷,但不相信。

答案 4 :(得分:1)

与测试默认构造函数的描述有些类似,我使用TestUtil自动测试getter和setter。您可以使用XML文件或JavaDoc标记来调整测试选项。遗憾的是,目前似乎没有注释选项。

答案 5 :(得分:1)

“处理注释......并为我生成测试”

对于有限数量的案例,这可能会起作用。但总的来说,它无法发挥作用。

@StandardTestForClassHierarchy1
@StandardTestForClassHierarchy2
@StandardTestForClassHierarchy3
@StandardTestForSomeOtherFeature4
@AspectFeature5
@AspectFeature6
@HasPublicDefaultConstructor
@AspectX
@AspectY
class SomeClass extends SomeClassHierarchy implements SomeOtherFeature {
}

我无法将我的单元测试注释与我的真实注释区分开来。

测试注释是否描述了我的应用程序的运行时行为?

  • 如果他们描述运行时行为,那么它们是真正的AOP注释,而不是测试的描述,而是真正生成运行时代码的实际注释。注释对模拟类有自己的测试。

  • 如果注释描述运行时行为,我现在有这种奇怪的非功能性和功能性注释的混乱。我没有看到非功能性注释的价值。

答案 6 :(得分:0)

答案 7 :(得分:0)

EiffelStudio CDD有一个有趣的方法。在调试模式下运行时,IDE会收集有关被调用方法的信息,并将上下文和调用放入单元测试中。使用“按合同设计”检测故障。我知道有一些基于Java的合同扩展设计,所以这可能是一个很好的方法。

答案 8 :(得分:0)

对于您的具体示例,最好在编译时使用Java APT(编译时注释处理)来更早地检测此类问题。

答案 9 :(得分:0)

您可以在编译时使用APT检测到这一点。

http://www.javaspecialists.eu/archive/Issue167.html

答案 10 :(得分:0)

我认为你不可能为自己拯救任何东西。但是你会增加复杂性。

如果我想确定有默认构造函数,我会将以下内容添加到单元测试中。

Foo foo = new Foo();