Java 新的JUnit 4.8.1@Category是否使测试套件几乎过时?

Java 新的JUnit 4.8.1@Category是否使测试套件几乎过时?,java,unit-testing,junit,junit4,test-suite,Java,Unit Testing,Junit,Junit4,Test Suite,给出一个问题,下面的方法对测试组织是否更好 定义包含所有测试的主测试套件(例如使用) 设计足够的JUnit类别集(足够意味着每个理想的测试集合都可以由一个或多个类别识别) 使用相关类别对每个测试进行鉴定 基于主测试套件和类别集定义目标测试套件 例如: 确定速度(慢、快)、依赖项(模拟、数据库、, 集成等)、功能(填写适用类别)、领域(填写适用类别)等 要求每项测试都通过相关类别的适当鉴定(标记) 使用ClasspathSuite创建主测试套件(在classpath中找到的所有测试) 通过鉴定具

给出一个问题,下面的方法对测试组织是否更好

  • 定义包含所有测试的主测试套件(例如使用)
  • 设计足够的JUnit类别集(足够意味着每个理想的测试集合都可以由一个或多个类别识别)
  • 使用相关类别对每个测试进行鉴定
  • 基于主测试套件和类别集定义目标测试套件
  • 例如:

    • 确定速度(慢、快)、依赖项(模拟、数据库、, 集成等)、功能(填写适用类别)、领域(填写适用类别)等
    • 要求每项测试都通过相关类别的适当鉴定(标记)
    • 使用ClasspathSuite创建主测试套件(在classpath中找到的所有测试)
    • 通过鉴定具有类别的主测试套件来创建目标套件,例如。 模拟测试套件、快速数据库测试套件、缓慢集成域X测试套件等

    我的问题更像是为这种方法征求批准率,而不是经典的测试套件方法。一个无与伦比的好处是,每个新的测试都会立即包含在相关套件中,而无需套件维护。一个“强>关注/强”是每个测试的正确分类。

    < P>你必须考虑的一个权衡是IMHO,在测试中定义了类别,并且在外部定义了套件。这意味着,当您使用套件时,您知道将运行哪些测试,但当使用类别时,您不知道,除非您检查测试或简单地运行它们。同时,当您使用测试套件查看测试时,您不知道它包含在哪个套件中,除非检查套件,但使用类别,否则您会立即看到它。

    有效点。这取决于检查测试的一种方法或另一种方法对团队的重要性。我可以预期,随着对类别的接受,优先权会发生变化。IMHO类别更适合注释性/声明性单元测试。尽管我也喜欢它们,但类别的问题是它们比测试高出一个元级别,因此会丢失一些信息。为了表达这一点,想象一下有许多类别和一个打字错误——你不会找到它(AFAIK)。对于Suites,您需要进行类型检查以确保使用了有效的名称。我想说,这是一个可以概括为JUnit3和JUnit4讨论的问题。4更强大,但离实际语言更远(因为注释只是元数据,而不是元编程),3虽然不是那么灵活,但(相对而言)它只是另一个Java代码。注释在许多情况下是元数据转换的声明性编程。。。我同意一个人在使用它们时必须保持适当的平衡。如果您认为这个测试套件也比测试高一个级别:它们不会带来新的测试——它们只是根据目标和优先级来组织测试。这应该是JUnit 4将套件移动到注释本身的原因。我的观点是-套件在语言和对象模型中,因此现有的语言工具可以提供很多支持,但是注释在外部,不能对它们提供任何通用支持。我想说的是,偏好也是关于您的工作流程。如果您有一些在问题中提到的标准化类别,那么注释是非常好的,因为您可以在编写测试时在测试中指定类别。@GabrielŠčerbák:请注意,JUnit中的类别是经过类型检查的。提供给注释
    Category
    的值必须是类(或接口)文本,因此需要进行类型检查。添加的博客条目:我会说是。但无论如何,我从未真正理解过传统的JUnit套房这样的麻烦维护类别信息在一个单独的地方!如果不是新的@Categories&ClasspathSuite,我还是更喜欢简单+谢谢你提出了一个好问题。@Jonik-谢谢。命名模式方法对于测试来说绝对是一种攻击。因此,它不是很灵活,因为它不允许基于多个类别将测试混合和匹配到不同的套件中。我还喜欢认为测试名称反映了它的目的,而不是它的属性。