我对TDD很新,所以如果我的问题没有多大意义,请原谅我。
看了一下之后,似乎jUnit能够实现集成测试。我希望社区可以为我提供一些如何编写集成测试的指导。这是我设计的简单概述。
我有Main1
,接受一个zip文件列表。 Main
将解压缩zip文件,编辑zip文件中pdf的内容,并将最终的pdf文件放入文件夹X
。如果pdf的数量达到THRESHOLD
,那么Main2Processor
(不是主类)将被调用并压缩所有pdf文件,并创建一个与新创建的文件同名的报告文本文件zip文件。
如果我运行Main2
,它也将启动Main2Processor
,这将压缩pdf文件并创建文本文件报告(即使文件夹X
中的pdf数量不是达到THRESHOLD)。
如何编写集成测试测试以上设计的正确性?
答案 0 :(得分:2)
你是对的; JUnit可用于编写称为集成测试的测试。您所要做的就是放宽关于不接触外部资源的测试的规则。
首先,我会重构你的应用程序的main(),尽可能少地做它;没有一种非常好的方法来测试main()函数中的代码。让它构造并运行一个对象(该对象可以是包含main()的对象,如果您愿意的话),将该新对象传递给您的ZIP文件列表。现在可以通过实例化它来使用JUnit测试该对象。
现在,您只需构建测试以设置一个恒定的测试环境,然后执行可重复的测试。在某处创建或清除临时目录,然后将一些测试ZIP文件复制到该目录中。然后,运行主处理器。
要检测达到阈值时是否发生了正确的行为,您只需测试是否存在zip文件(和/或如果未达到阈值则不存在)。
答案 1 :(得分:2)
你真的想要一个“整合测试”(这个术语现在超出理解范围,所以如果你能说明你的最终目标有帮助吗?)?接受测试如何使用此控制台/ GUI应用程序,如具有特定输入的真实用户并检查预期输出?
JUnit只是一个测试运行者,并且不知道测试实际上做了什么。所以是的,你可以用它来编写任何测试。然而,它是为单元测试而构建的,有时会泄漏。测试关闭第一个错误/第一个不成功的断言的事实。通常粗略的测试就是推进并最终得到一堆错误。
如果您想进行集成测试 - 您必须重新设计您的应用程序才能从测试中调用(如果不是这样)。提出编写此测试的具体障碍,我可以提供更具体的建议。
答案 2 :(得分:1)
我认为你应该为你的测试创建一些实用方法。例如运行应用程序,检查目录,清除目录等。
然后您将能够实施如下测试:
@Test
public mytest1() {
exec(Main1.class, "f1.zip", "f2.zip");
Assert.assertTrue(getFileCount(OUTPUT_DIR) < THRESHOLD);
// perform verification of your files etc...
}
答案 3 :(得分:1)
首先,您可以描述您的上述规范,但是从“测试序列”的角度来看。例如,测试一个将向Main1提供一组N个pdf文件,N低于阈值。然后,在Main1返回后,您的测试代码将检查X文件夹内容以及报告,以验证您的期望是否得到满足。
JUnit本身只是帮助运行测试用例,它并没有真正帮助编写测试。 JUnit是面向“单元测试”的(但你可以将它用于集成测试,尽管有些情况不适合;例如,当需要全局设置时,或者预期测试用例在特定的情况下运行时为了...)。
一些额外的库可以帮助您轻松地与其余代码进行交互:dbunit,httpunit等。