有时,我遇到的情况是我需要测试的是程序的执行是否达到某个点而没有抛出任何异常,或者程序被中断或陷入无限循环或某事。
我不明白的是如何为此编写单元测试。
例如,请考虑以下“单元测试” -
@Test
public void testProgramExecution()
{
Program program = new Program();
program.executeStep1();
program.executeStep2();
program.executeStep3();
// if execution reaches this point, that means the program ran successfully.
// But what is the best practice?
// If I leave it like this, the test will "pass",
// but I am not sure if this is good practice.
}
通常,在测试结束时,我有一个像 -
这样的陈述assertEquals(expectedString, actualString);
但是如何为上述情况写一个assertEquals或其他类型的测试语句?
答案 0 :(得分:5)
您的代码看起来很好,只需删除评论,但请保留以下内容:
// If execution reaches this point, that means the program ran successfully.
因此,您的代码读者将理解为什么没有断言。
值得注意的是,你的测试中调用的每个方法都应该产生某种效果,即使你说“你不在乎”,这种效果应该被认为是正确发生的。
如果您坚持不需要检查,请添加注释来解释原因 - 这样可以避免读者浏览您的代码,找出“无关紧要”的原因,例如:
// No assertions have been made here because the state is unpredictable.
// Any problems with execution will be detected during integration tests.
答案 1 :(得分:2)
如果仅仅抛出异常的行为意味着测试已经过去,则不需要任何断言。不可否认,这表明该行动没有可观察到的副作用,这种情况有点罕见。在这种情况下,评论比断言更有用。
通常我发现只有当我有其他测试来检查实际结果时才会发生这种情况,有些测试会证明无效输入,以及一些类似的测试证明只是有效输入。例如,如果我想验证输入必须在[0, 100]
范围内,我可能会对几个中等值进行“完整”测试,然后无效值为-1和101,则有效值为0和100只证明它们是有效的。
答案 2 :(得分:2)
在我这样的情况下,我只是插入
assertTrue(true);
在功能结束时...