2017-04-08 33 views
1

我正在为我的Java程序编写单元测试。我的程序做了很多事情,涉及从用户输入文件读取并根据输入文件的内容创建新文件。单元测试使用预制文件是否正确?

目前,我的单元测试正在使用预制文件进行测试,我已放置在资源源目录中。当它创建一个文件时,它将它放在相同的资源源目录中。

我在这里看过很多问题和答案,关于如何在单元测试中处理文件有这么多不同的意见。在单元测试中使用这些预制文件是否合适?还是有更好的解决方案?

+3

是的,它非常好。但是不要把你的测试生成的文件放在src下。他们不是消息来源,所以他们在src中无所事事。 –

+0

@JBNizet谢谢。我会改变他们创建的地方。 – ST3

+0

您也可以重构代码以仅使用'InputStream'而不是'FileInputStream',然后传递'ByteArrayInputStream'并将所有内容保存在测试中。 (编写文件也是一样:使用'OutputStream'等等。)如果你传递文件名,那么需要重构一些,但这个想法是一样的。 – Robert

回答

1

是的,标准做法是将您的静态输入文件放置在src/test/resources目录中进行测试。如果您的主代码生成输出,那么在测试过程中最干净的地方就是在您的平台特定的tmp目录中。在Java中,这是系统属性java.io.tmpdir下:

System.out.println(System.getProperty("java.io.tmpdir"));

如果您使用此目录,这将是MacOS的,Linux或Windows下运行它开发者之间的便携 - 以及任何生成服务器。

测试完成时删除这些临时文件也是一个好主意,并且测试不会对先前测试运行中可能存在的临时文件做出任何假设。

+0

对于临时文件,还可以看看JUnit的'TemporaryFolder'规则。 – JayK

0

是否适合使用静态“预制”文件在很大程度上取决于您要测试的逻辑以及如何管理测试数据。也许你需要包含一个相对于今天日期的日期的测试数据。在这种情况下,使用静态文件可能比编写代码来计算相对日期更麻烦。

正如JB Nizet在他的评论中指出的,将测试数据与源代码一起存储通常不是一个好主意。我不确定你是否熟悉maven及其standard directory layout,但你可以看看它,看看它如何帮助保持测试和源文件分离。

+0

与文件的可能性需要类似今天的日期的好点。我目前在我的程序中没有类似的东西,但请记住这一点很好。 – ST3

相关问题