单元测试和Web应用程序 - 资源

时间:2009-01-15 19:56:49

标签: unit-testing testing web-applications integration-testing

在J2EE Web应用程序中,人们如何管理资源,以便它们对Web上下文和单元/集成测试都可见?

我发现通常你最终会在开发过程中以某种方式配置源/资源文件夹(即Maven所期望的),因此你的单元测试将在你的IDE中运行。但是,一旦构建了Web应用程序并将其打包到WAR文件中(即,当您的持续集成服务器完成构建时),您的单元测试将不再运行,因为资源位于其他位置。

您是否最终将资源保存在两个不同的位置并手动保持同步?

3 个答案:

答案 0 :(得分:2)

我们尝试在容器中使用单元测试但几年前放弃了它。更好(至少对我们来说)让每个单元测试覆盖一个类而不是别的,模拟其他类的依赖(参见JMock或其许多竞争对手)。一个好的基本规则是,如果它触及数据库,网络或文件系统,它不是单元测试。 (它可能对其他东西有用,但它不是单元测试。有关详细信息,请参阅these unit testing rules。)

以这种方式编写的单元测试可以在任何地方运行,并且它们非常快(我们有数千个并且在中等规格的硬件上在60秒内运行它们。)

您可能还希望运行检查子系统或整个应用程序的集成测试。我们发现子系统测试也可以在其边界使用模拟 - 例如,我们伪造外部定价Feed - 并且端到端测试最适合使用SeleniumWebDriver等工具您将整个应用程序部署在服务器上,然后像用户一样使用浏览器点击它。

(顺便说一句,我们的单元测试方法让我们模仿者,而非古典主义者,Martin Fowler's taxonomy中。)

答案 1 :(得分:1)

通常这就是多模块构建的原因。外部服务位于与Web应用程序不同的构建单元中。因此,在构建该模块时,您可以构建,打包和运行集成测试。

另一个模块可以包含您的域模型及其单元测试,它们也在构建时运行。

导致WAR的模块根本不包含任何Java代码,但只有与Web相关的工件,这是很常见的。虽然没有必要,但这通常是因为war模块中的代码不能包含在另一个模块中。

最后一个特例是包含网络测试的模块。此模块可能经常需要来自其他模块的测试范围的工件(因为它从外部测试应用程序,但可能需要来自内部的数据)。这可以通过在jar文件中打包测试资源来解决,为每个模块创建一组单独的“测试”jar文件。

多模块构建是maven项目的标准,也很容易设置为其他构建系统,如ant。

答案 2 :(得分:0)

我不会打包测试资源,也不会在WAR文件中测试,也不会从WAR运行单元测试。你为什么这么做?