我有一个测试:
@Test
testLogin {
String returnValue = login(username, password)
}
完成此测试后,我将在单独的测试中测试returnValue
的值。 returnValue
也是另一种方法的方法参数:
@Test
testVal {
performTest(returnValue)
}
为了达到这个目的,我可以将returnValue声明为全局变量,然后确保使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)
按顺序运行测试,但这似乎是一种非标准和不干净的方法?
这是否意味着应该重新考虑正在测试的代码?
有哪些替代方案?
答案 0 :(得分:3)
这样的测试
@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
方法什么都不做,则返回值将不正确。
此示例使用hamcrest来获得更好的诊断和可读性。您也可以使用assertEquals
。
关于测试共享变量的问题,非常重要的是您的测试(无论是单元测试,集成测试还是验收测试)不共享任何内容并且是独立的。否则,您将遇到诸如测试失败等问题,因为其他测试未运行或测试以不同顺序运行。您应该能够以任何顺序运行任何测试子集。
您还应该考虑更好的测试名称,因此它描述了测试中的代码应该做什么。例如successfulLoginReturnsExpectedResponseCode()
。