0

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

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

您是否最终将资源保存在两个不同的地方并手动保持它们同步?

4

3 回答 3

2

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

以这种方式编写的单元测试可以在任何地方运行,而且速度极快(我们有数千个单元测试,在中等规格的硬件上运行时间不到 60 秒。)

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

(顺便说一句,在Martin Fowler 的分类法中,我们的单元测试方法使我们成为模仿者,而不是古典主义者。)

于 2009-01-15T22:34:52.987 回答
1

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

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

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

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

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

于 2009-01-15T20:48:39.737 回答
0

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

于 2009-01-15T20:22:27.620 回答