【问题标题】:Maven won't run tests from parent or child projectsMaven 不会从父项目或子项目运行测试
【发布时间】:2017-12-02 12:20:59
【问题描述】:

我有一个多模块项目。每个项目都有自己的单元测试,与父项目相同。当我使用 mvn test 时,没有运行任何测试,并且目标文件夹不包含任何测试类。父项目甚至不创建目标文件夹

结构如下:

|-module1-> pom.xml
|-module2-> pom.xml
|-module3-> pom.xml
|-src/main
|-src/test/java/MyTest.java
|-pom.xml

请参阅下面的 pom(我省略了标准 pom 样板)

父 pom.xml

<groupId>com.tests</groupId>
<artifactId>unit-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
</modules>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
        <version>RELEASE</version>
    </dependency>
<dependencies>

子 pom 有:

<parent>
    <groupId>com.tests</groupId>
    <artifactId>unit-tests</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

每当我运行mvn clean test 时,都不会运行任何测试,并且在控制台中我会得到类似:

[INFO] ------------------------------------------------------------------------
[INFO] Building unit-tests 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------

顺便说一句,父项目没有任何源代码,只是测试

【问题讨论】:

    标签: java maven testing junit


    【解决方案1】:

    您正在使用包装pom。使用这种打包方式,您只能运行少量绑定到阶段的目标(如installdeploy)。为了在父母中运行测试,您必须明确说明您的意图,如下所示:

    $mvn clean compiler:testCompile surefire:test
    
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.tests.unit_tests.TestModules
    Test1!
    [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.016 s <<< FAILURE! - in com.tests.unit_tests.TestModules
    [ERROR] test1(com.tests.unit_tests.TestModules)  Time elapsed: 0.003 s  <<< FAILURE!
    java.lang.AssertionError
        at com.tests.unit_tests.TestModules.test1(TestModules.java:11)
    
    [INFO] 
    [INFO] Results:
    [INFO] 
    [ERROR] Failures: 
    [ERROR]   TestModules.test1:11
    [INFO] 
    [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
    [INFO] 
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] 
    [INFO] unit-tests ......................................... FAILURE [  1.262 s]
    [INFO] module1 ............................................ SKIPPED
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.473 s
    [INFO] Finished at: 2017-12-02T11:04:50-02:00
    [INFO] Final Memory: 16M/207M
    [INFO] ------------------------------------------------------------------------
    

    这样你告诉maven你想要编译(生成你的目标)并在聚合器(它有父pom)中运行你的测试。否则maven 将只运行模块中的测试。

    $mvn test
    
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Build Order:
    [INFO] 
    [INFO] unit-tests
    [INFO] module1
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building unit-tests 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building module1 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ module1 ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] Copying 0 resource
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ module1 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ module1 ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] Copying 0 resource
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.2:testCompile (default-testCompile) @ module1 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] 
    [INFO] --- maven-surefire-plugin:2.17:test (default-test) @ module1 ---
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] 
    [INFO] unit-tests ......................................... SUCCESS [  0.002 s]
    [INFO] module1 ............................................ SUCCESS [  0.424 s]
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.504 s
    [INFO] Finished at: 2017-12-02T11:06:24-02:00
    [INFO] Final Memory: 9M/241M
    [INFO] ------------------------------------------------------------------------
    

    我知道这很难阅读,但您应该检查一下: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Packaging

    比如一个纯元数据的项目(打包值为 pom) 仅将目标绑定到安装和部署阶段(对于完整的 一些包装类型的目标到构建阶段绑定列表, 参考Lifecycle Reference)。

    编辑

    正如 eis 指出的那样。即使可以这样做,maven 也很难做到,因为您不应该默认这样做。您的单元测试应该在他们正在测试的模块中。分散它们不是一个好习惯。

    答案是:你可以做到,是的。但你不应该!生活中有些事情你可以做,但不应该......

    如果我们谈论的是integration tests,那将是另一回事。那是不同的讨论。

    干杯!

    【讨论】:

    • 虽然这是正确的,但 pom 打包模块不应包含定义的测试。我认为你在建议如何在一个最初不应该包含它们的模块中运行测试方面是在做坏事——从长远来看,它只会导致麻烦。
    • @eis 我同意,但可以执行它们。虽不可取。我完全同意你的看法。单元测试应该在他们正在测试的模块中。
    • @eis 我正在回答这个问题,因为你可以做到。但我会对其进行编辑并明确表示这不是一个好习惯。干杯!
    • @wleao,我将测试移至子模块。当我调用 mvn clean test -pl :module1.我得到“没有要运行的测试”。
    • @testing_kate 您是否在测试中使用了 org.junit.Test 注释?在您的问题中显示一些代码。
    【解决方案2】:

    maven surefire 插件运行所有 JUnit 测试,其中测试类的名称以 Test 结尾 - 带有大写的“T”。根据您的信息,您的测试类名为Mytest。将该类重构为 MyTest 将使其工作。

    【讨论】:

    • 这是问题中的拼写错误,遵循代码命名约定
    【解决方案3】:

    multimodule parent 有包装pom,因此,根据定义只能包含pom,不能包含任何源代码(甚至不能包含测试源代码!)。这就是您的测试无法运行并且您没有获得目标文件夹的原因:在 pom 类型的项目上无法运行或编译任何东西。多模块父级仅用于将模块组合在一起。

    【讨论】:

    • 这没有回答为什么子项目的测试没有运行
    • 这并没有削减它。检查我的答案,这会有所帮助。
    • @testing_kate 正确,它没有。如果这是这个问题的重点,您应该进行相应的编辑,删除有关 pom 项目中测试的任何误导性信息(然后我将删除这个答案)。绝对应该。
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 2018-08-14
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2021-01-16
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多