【问题标题】:JUnit test descriptionJUnit 测试说明
【发布时间】:2012-10-31 13:38:19
【问题描述】:

是否可以在 JUnit 中为未来的读者添加一个简短的测试描述(例如,正在测试什么,一些简短的解释,预期的结果,......)?我的意思是在 ScalaTest 中我可以写的东西:

test("Testing if true holds") {
  assert(true)
}

理想的方法是使用一些注释,例如

@Test
@TestDescription("Testing if true holds")
public void testTrue() {
    assert(true);
}

因此,如果我使用 Maven(或其他类似工具)运行此类带注释的测试,我可以在使用 ScalaTest 时获得与 SBT 中类似的输出:

- Testing if entity gets saved correctly
- Testing if saving fails when field Name is not specified
- ...

目前我可以使用非常长的方法名称或编写 javadoc cmets,它们是 不存在于构建输出中。

谢谢。

【问题讨论】:

  • 一种常见的方法是在测试名称中包含描述,例如public void testIfTrueHoldsForNegativeValues()。我认为不需要特殊注释来执行此操作。
  • 我认为长名称没有任何问题,因为它们很常见。您可以巧妙地编写它们,例如entityIsSavedCorrectlysaveFailsWhenNameMissing 等。一定要去掉 test 前缀,因为它是多余的(尤其是 @Test 注释)。 ScalaTest 仅给出 JUnit 方法名称所在的字符串,因此您“丢失”的只是空格。如果你必须有描述,你总是可以把它们贴在单独的断言上。

标签: java testing junit


【解决方案1】:

在JUnit 5中,有@DisplayName注解:

@DisplayName 用于为 带注释的测试类或测试方法。通常使用显示名称 用于 IDE 和构建工具中的测试报告,可能包含空格, 特殊字符,甚至表情符号。

例子:

@Test
@DisplayName("Test if true holds")
public void checkTrue() {
    assertEquals(true, true);
}

【讨论】:

  • 有一个Android插件,如果你想使用JUnit5:github.com/mannodermaus/android-junit5
  • 包含表情符号是我使用它的卖点
  • 此注解旨在成为测试方法名称的更易读版本。是否有另一种方法可以在不借助源代码中的 cmets 的情况下在 JUnit 中传达对测试的长描述?
【解决方案2】:

TestNG 就是这样做的,对我来说这是最好的解决方案:

@Test(description="My funky test")  
public void testFunk() {  
    ...  
}  

更多信息请参见http://testng.org/javadocs/org/testng/annotations/Test.html

【讨论】:

  • 很抱歉将其标记下来。问题是关于 Junit 而不是 TestNG。我们都知道 TestNG 支持描述。
  • 相关信息。与之前所说的相反,不是每个人都知道 TestNG,也不是每个人都知道它与 JUnit 不同,它支持描述。我认为即使 OP 的问题是关于 JUnit 的,也值得提出建议。读者可能不会固定在他们使用的框架上。
  • 至少对我来说,这条评论很有帮助,而且我不知道 TestNG,因为我最近刚开始使用来自 TypeScript 的 Java,我使用的是 Mocha——我想如果你不是 JavaScript 开发人员你不会知道摩卡,对吧?
  • 我也点赞。感谢您分享超出问题范围的知识。
【解决方案3】:

不完全是您要查找的内容,但您可以提供任何assert 方法的描述。

类似:

@Test
public void testTrue() {
    assertTrue("Testing if true holds", true);
}

【讨论】:

  • 它会起作用,但我认为这不是写描述的好方法。这会给新开发者带来困惑。
【解决方案4】:

在 JUnit 中进行测试时,我更喜欢遵循标准格式。测试的名称是

test[method name]_[condition]_[outcome]

例如:

 @Test
 public void testCreateObject_nullField_errorMessage(){}

 @Test
 public void testCreateObject_validObject_objectCreated(){}

我认为这种方法在进行 TDD 时很有帮助,因为您可以开始编写所有测试名称,这样您就知道需要测试/开发什么。

我仍然欢迎来自 JUnit 的测试描述功能。

这肯定比我过去见过的其他测试更好:

@Test public void testCreateObject1(){}
@Test public void testCreateObject2(){}
@Test public void testCreateObject3(){}

@Test public void testCreateObjectWithNullFirstNameAndSecondNameTooLong(){}

【讨论】:

  • test 前缀不是遗留下来的吗?
  • 是的,“测试”可以去掉,只是我的一个坏习惯
【解决方案5】:

您可以在测试后命名测试方法:

public void testThatOnePlusOneEqualsTwo() {
  assertEquals(2, 1 + 1);
}

这将出现在 Eclipse、Surefire 和大多数其他运行程序中。

【讨论】:

    【解决方案6】:

    详细解决方案是:您可以在测试中添加Logger,将结果记录到文件中。 See log4j,例如。然后您可以读取文件中的结果并打印成功的语句,assertstatemens 不能。

    简单的解决方案:您可以为每个测试方法添加JDoc 描述,如果您生成 JavaDoc,则会对此进行概述。

    此外,每个assertstatement 都可以提供一条消息,只要assert 失败,就会打印该消息。

    /**
     * test the List#size() increasement after adding an Object to a List.
     */
    public void testAdd(){
      List<Object> list = new LinkedList<>(); 
      list.add(new Object());
      assertEquals("size should be 1, because of adding an Object", 1, list.size());
    }
    

    不要使用System.out.println("your message");,因为您不知道测试将如何执行,如果环境不提供控制台,您的消息将不会显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多