共享变量的测试方法

Testing methods which share variables

我有一个测试:

@Test
testLogin {
   String returnValue = login(username, password)
}

此测试完成后,我将在单独的测试中测试 returnValue 的值。 returnValue 也是另一个方法的方法参数:

@Test
testVal {
   performTest(returnValue)
}

为了实现这一点,我可以将 returnValue 声明为全局变量,然后使用 @FixMethodOrder(MethodSorters.NAME_ASCENDING) 确保测试 运行 的顺序,但这似乎是一种非标准且不干净的方法?

这是否意味着正在测试的代码应该重构?

有哪些选择?

这样的测试

@Test
public void testLogin() {
   String returnValue = login(username, password)
}

没有太大价值。它唯一测试的是方法 login 不会抛出异常,我很确定这不是您想要测试的。断言在哪里?以下实现满足此测试:

public String login(Object a, Object b) {
    return null;
}

您的测试应如下所示:

@Test
public void successfulLoginReturnsExpectedResponseCode() {
   String responseCode = login(username, password)

   assertThat(responseCode, is(equalTo("SUCCESSFUL_LOGIN")));
}

如果 login 方法什么都不做,return 值将不正确。

此示例使用 hamcrest 以获得更好的诊断和可读性。您也可以使用 assertEquals.

关于您关于测试共享变量的问题,非常重要的是您的测试(无论它们是单元测试、集成测试还是验收测试)不共享任何东西并且是独立的。否则,您将 运行 陷入测试失败等问题,因为另一个测试没有 运行 或者测试 运行 的顺序不同。您应该能够 运行 以任何顺序进行任何测试子集。

您还应该考虑一个更好的测试名称,它描述了被测代码应该做什么。例如 successfulLoginReturnsExpectedResponseCode().