【问题标题】:Integration Test for JUnitJUnit 的集成测试
【发布时间】:2011-06-06 20:19:31
【问题描述】:

总的来说,我对 TDD 很陌生,所以如果我的问题没有多大意义,请原谅我。

看了一圈,jUnit似乎可以实现集成测试。我希望社区可以为我提供一些关于如何编写集成测试的指导。这是我的设计的简单概述。

我有Main1,它接受一个 zip 文件列表。 Main 将提取 zip 文件,编辑 zip 文件中 pdf 的内容,并将最终的 pdf 文件放入文件夹 X。如果pdf的数量达到THRESHOLD,那么Main2Processor(不是主类)将被调用并压缩所有的pdf文件,并创建一个与新创建的zip文件同名的报告文本文件。

如果我运行Main2,它也会启动Main2Processor,它将压缩pdf文件并创建文本文件报告(即使文件夹X中的pdf数量没有达到阈值)。

如何编写集成测试来测试上述设计的正确性?

【问题讨论】:

  • 如果至少能提供Main1、Main2等接口就好了。TDD不仅描述了你设计测试的方式,还描述了你设计业务代码的方式。
  • 另外,你的组件命名有点奇怪,除非你隐藏真实姓名,当然:)。通常在 Java/C 世界中 main 是一个用于启动程序的函数,但是如果您想设计可测试的代码,您可能应该将其拆分为可替换的组件。这将允许您用模拟替换一些类。
  • @Andrey:抱歉我的回复晚了。是的,我试图隐藏班级的真实姓名。如果您可以提供一些代码来证明您所说的if you want to design a testable code you probably should split it into replacable components. That will allow you to replace some of the classes with mocks,是否有可能。非常感谢。 +1
  • 互联网上有大量关于可测试性设计的资料。例如,您可以观看此演示:youtube.com/watch?v=acjvKJiOvXw&feature=player_embedded

标签: java junit tdd integration-testing


【解决方案1】:

你是对的; JUnit 可用于编写称为集成测试的测试。您所要做的就是放宽关于不涉及外部资源的测试的规则。

首先,我将重构您的应用程序的 main() 以尽可能少地做它;没有一个很好的方法来测试 main() 函数中的代码。让它构造并运行一个对象(如果您愿意,该对象可以是包含 main() 的对象),将该新对象传递给您的 ZIP 文件列表。现在可以通过实例化该对象来使用 JUnit 对其进行测试。

现在,您只需构建测试以设置一个恒定的测试环境,然后执行可重复的测试。在某处创建或清除临时目录,然后将一些测试 ZIP 文件复制到该目录中。然后,运行你的主处理器。

要检测达到阈值时是否发生了正确的行为,您只需测试 zip 文件是否存在(和/或如果未达到阈值则不存在)。

【讨论】:

  • 非常感谢。我现在有点明白了。幸运的是,我的主要是很少。主要的只是调用processor 处理所有事情。
【解决方案2】:

你真的想要一个“集成测试”(这个术语现在已经超出了理解范围,所以如果你能说出你的最终目标会有所帮助)?在验收测试中,您可以像使用具有特定输入的真实用户一样使用此控制台/GUI 应用程序并检查预期输出吗?

JUnit 只是一个测试运行器,并没有注意到测试的实际作用。所以是的,你可以用它来编写任何测试。然而,它是为单元测试而构建的,有时会泄漏......例如测试在第一个错误/第一个不成功的断言时关闭的事实。通常粗略的测试喜欢往前推进并在最后得到一堆错误。

如果您想要一个集成测试 - 您必须重新设计您的应用程序以使其可以从测试中调用(如果还没有的话)。提出编写此测试的具体障碍,我可以提供更具体的建议。

【讨论】:

  • 感谢您的意见,我会仔细考虑。看了一篇文章也说integration test is a scam,稍微改变一下思路。 tyvm 征求您的意见。
【解决方案3】:

我认为您应该为您的测试创建一些实用方法。例如运行应用程序、检查目录、清除目录等。

然后你就可以像下面这样实现测试了:

@Test
public mytest1() {
    exec(Main1.class, "f1.zip", "f2.zip");
    Assert.assertTrue(getFileCount(OUTPUT_DIR) < THRESHOLD);
    // perform verification of your files etc...
}

【讨论】:

  • 非常感谢。我非常喜欢这个主意。
【解决方案4】:

首先,您可能会从“测试序列”的角度描述您的上述规范。例如,测试一会向 Main1 提供一组 N 个 pdf 文件,其中 N 个低于阈值。然后,您的测试代码在 Main1 返回后,将检查 X 文件夹内容以及报告,以验证您的期望是否得到满足。

JUnit 本身只是帮助运行测试用例,并没有真正帮助编写测试。 并且 JUnit 是面向“单元测试”的(但您也可以将它用于集成测试,尽管某些情况不太适合;例如,当需要全局设置时,或者当测试用例预计在特定的环境中运行时订购...)。

一些额外的库可以极大地帮助与您的其余代码轻松交互:dbunit、httpunit 等。

【讨论】:

  • 非常感谢。我现在有点明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2017-12-20
  • 2014-04-04
相关资源
最近更新 更多