5

有时,我遇到的情况是,我需要测试的只是程序的执行是否达到了某个点,而没有抛出任何异常,或者程序被中断或陷入无限循环等。

我不明白的是如何为此编写单元测试。

例如,考虑以下“单元测试” -

@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 或其他类型的测试语句?

4

3 回答 3

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.
于 2012-08-21T16:00:30.693 回答
2

如果仅仅没有抛出异常就意味着测试已经通过,那么您不需要任何断言。诚然,这表明该动作没有可观察到的副作用,这有点罕见。在这种情况下,注释比断言更有用。

通常我发现只有当我有其他测试来检查实际结果时才会发生这种情况,有些测试证明输入无效,还有一些类似的测试证明输入有效。例如,如果我想验证输入必须在范围内,[0, 100]我可能会对一些中等值进行“完整”测试,然后是 -1 和 101 的无效值,然后是 0 和 100 的有效值,这只是证明它们是有效的。

于 2012-08-21T16:00:27.137 回答
2

在这种情况下,我只是插入

assertTrue(true);

在函数的最后......

于 2012-08-21T16:01:01.923 回答