2011-12-18 91 views
1

我有一个采取数据结构并写入OutputStream的方法。我想编写一个单元测试,确保给定输入的该函数的输出不会意外改变。使用junit检查输出是否稳定的最佳方法是什么?

我觉得我的测试结构正确,使用JUnit理论。我的@DataPoints是一对标识符和示例数据结构,并且我有一个@Theory方法的输出将与签入到使用标识符使用getResourceAsStream获取的版本控制的文件相同。

然而,痛苦的部分首先是生成这些文件。我目前非常丑陋的解决方案是一个名为WRITE_TEST_OUTPUT的布尔常量,通常是错误的。当我想重新生成输出文件(或者是因为我更改了@DataPoints的列表,或者方法的期望行为已经改变),我将此常量设置为true,并且有一个测试,当这是真时,再次运行该函数将当前输出文件写入/ tmp中的目录。然后它断言该常数是错误的,所以我不会意外检查一个常数为真的版本。

让代人伪装成测试是非常方便的,所以我可以在Eclipse中运行它,但它看起来像一个可怕的kludge。这似乎是人们必须始终做的事情 - 其他人找到了什么样的解决方案?

回答

1

我可能会做的是检测文件的存在,而不是使用外部修改的常量。所以,你必须像

public void testMethodOutput() { 
    if (new File(expectedOutput).exists()) { 
    // check method output against file 
    } else { 
    // generate expected output from current behaviour; test passes automatically 
    // (saves output to the expected-output file) 
    } 
} 

当你要更新的预期输出,删除文件,运行测试,提交新版本到版本控制。不需要更改源代码。

看起来有点奇怪,正确的输出是通过查看给定版本的程序来确定的,而不是你自己设置的东西(如果该版本有一个微妙的错误呢?)。可能这就暗示你的测试过于粗糙,反过来可能暗示你的方法本身太粗糙了。 (测试的气味几乎总是设计的气味。)

+0

我不知道如何运行测试可以找出它应该保存在Maven模块中的文件 - getResource()将返回目标下的目录,而不是在src /测试/资源。 – 2011-12-18 10:57:36

相关问题