【问题标题】:Maven 2 multi module pomMaven 2 多模块 pom
【发布时间】:2025-11-29 22:45:01
【问题描述】:

我最近开始将我的项目从 ant 迁移到 maven。我的应用程序中有两个模块,我可以使用 maven 构建它们。

现在我有了自动化测试项目,它使用 Web 驱动程序来测试 UI 功能。我正在尝试使用 maven 构建两个模块战争并将它们部署到 tomcat 上。然后对它们运行自动化测试,如果自动化测试通过,则通过构建。我已经像这样配置了我的 pom(仅提及重要部分):

<packaging>pom</packaging>
<modules>
        <module>../module1</module>
        <module>../module2</module>
</modules>

现在这两个项目都已构建和部署,但它不运行自动化测试。我认为的原因是包装类型是POM。但是如果我把它改成战争,它就会开始抛出错误。

我可以考虑为自动化和父 pom 创建第三个 pom 以将其作为模块也包含在内。但我在想这是否是正确的方法。这应该是一个非常常见的场景,maven 应该直接支持它。

【问题讨论】:

  • 你的测试模块是不同的项目还是只是打包结构的一部分?
  • 然后我建议为该项目创建一个 pom 并将其正确设置在层次结构中,然后运行 ​​mvn compile test
  • 如何正确设置层次结构。我唯一要确保的是,每当我运行这个构建时,它应该构建两个依赖项目,然后运行这些测试。
  • 有问题的自动化模块是什么?测试地点在哪里?你如何部署到tomcat服务器?很多重要的细节都没有得到 IMO 的答案。
  • 嗨 Pascal,自动化模块是基于 WebDriver 的自动化测试,用于测试 UI。它依赖于网络战争,但没有包依赖。我正在使用 cargo maven 插件部署到 tomcat。我想在运行自动化测试之前从源代码构建网络战争,然后在tomcat上部署,然后运行测试。我可以使用 ant build 完成所有这些操作,但无法使用 maven。

标签: java testing maven-2 functional-testing cargo


【解决方案1】:

(...) 自动化模块是基于 WebDriver 的自动化测试,用于测试 UI。它依赖于网络战争,但没有包依赖。我正在使用 cargo maven 插件部署到 tomcat。我想在运行自动化测试之前从源代码构建网络战争,然后在tomcat上部署,然后运行测试。我可以使用 ant build 完成所有这些操作,但无法使用 maven

这绝对是可行的(我已经做过很多次了)。但是我不确定您当前的项目结构(尤其是测试所在的位置)。

这是我建议的结构:

. ├── 功能测试 │   ├── pom.xml // 这里我们配置 maven 运行 cargo & it 测试 │   └── src │      └── 它 │      ├── java │      │   └── ... // 功能测试将在这里进行 │      └── 资源 ├── pom.xml // 聚合 pom └── mywebapp // 被测应用 ├── pom.xml └── 源 ├── 主要 │   ├── java │ ├── 资源 │   └── webapp └── 测试 ├── java └── 资源

有关 pom 设置的详细信息,请查看 Functional testing with Maven, Cargo and Selenium,它包含所需的所有详细信息。

【讨论】:

    【解决方案2】:

    我不认为带有共享集成测试模块的 2 个战争模块是一个非常常见的场景。

    但是,您可以使用 Hudson 来实现这一点。

    • 在 Hudson 中设置一个作业来部署您的父级 pom,这将导致按照您当前的方式部署战争模块。
    • 上一个作业成功后,触发另一个作业来运行集成测试。

    您可能希望使用profiles 来激活集成测试,或者更具体地说是防止在第一个作业期间执行集成测试。

    我今年早些时候在大约一个小时内设置了一个基本的 Hudson 服务器。
    Hudson 直接支持 maven 构建,还为您的项目 maven 站点提供位置,包括所有质量报告等。
    您还可以将 Hudson 配置为“监视”您的 SCM,并在识别到提交时启动构建。

    【讨论】:

    • 谢谢crowne。我也在考虑采用类似的方法。我正在使用巡航控制进行持续集成。我想了解构建网络战争并从自动化测试的构建文件中部署它们(我们目前正在使用 ant)是一个好主意,如果是这样,那么如何使用 maven 来做到这一点。
    【解决方案3】:

    “我可以考虑创建第三个 pom”
    你只有两个 POM 吗?每个项目/模块都需要自己的 POM。

    在此处查看有关使用 maven 进行集成测试的更多信息:http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing

    编辑: 我不完全了解您的项目布局是什么样的。但我想它应该看起来像这样:

    文件结构

    myWebApp/
        pom.xml
        myWebApp-web/
            pom.xml
        myWebApp-integration-tests/
            pom.xml
    

    /myWebApp/pom.xml

    <packaging>pom</packaging>
    <modules>
        <!-- packaging: war; here are the sources and unit tests -->
        <module>myWebApp-web</module>
    
        <!-- packaging: java; here are the integration tests -->
        <module>myWebApp-integration-tests</module>
    </modules>
    

    通过此设置,/myWebApp/mvn deploy 将执行以下步骤:

    1. 构建根项目(什么都不做,因为没有源)
    2. 构建 myWebApp-web
    3. 部署myWebApp-web(必须在/myWebApp/myWebApp-web/pom.xml中配置)
    4. 在 myWebApp-integration-tests 中执行测试

    这应该做你想做的。

    【讨论】:

    • 感谢阿里安的回复。我已经有三个pom了。我想要实现的是第三个项目构建应该构建前两个,然后只触发测试。
    • 我相应地扩展了我的答案。
    • 非常感谢 Arian... 但这无济于事。我试图让我的问题更有意义。看看我现在能不能解释清楚。我认为您提供的解决方案对我的情况没有帮助。