45

现在我有两种类型的测试但是当我说“mvn test”时它只执行TestNG测试而不是Junit。我想一个接一个地执行。任何的想法 ?

4

12 回答 12

56

选择供应商的官方方式。

您还可以将多个提供程序指定为依赖项,它们都将运行并生成一个通用报告。这对于外部提供者来说可能特别方便,因为很少有用于组合包含的提供者的用例。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-testng</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
</plugin>

有关此的更多信息:在一个 Maven 模块中混合 TestNG 和 JUnit 测试 – 2013 版

maven-surefire-plugin 示例中的当前链接。搜索“运行 TestNG 和 JUnit 测试”。

您将需要配置 testng 提供程序以忽略 junit 测试,如下所示:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>        
    <properties>
        <property>
            <name>junit</name>
            <value>false</value>
         </property>
    </properties>        
    </configuration>
    [...providers as dependecies, see above...]
</plugin>
于 2013-11-12T12:03:11.063 回答
14

我有更好的解决方案

这个想法是创建两个执行maven-surefire-plugin,一个用于 JUnit,一个用于 TestNG。junitArtifactName您可以通过指定不存在或每次执行禁用 TestNG 或 JUnit 之一testNGArtifactName

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
        <execution>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <testNGArtifactName>none:none</testNGArtifactName>
            </configuration>
        </execution>
        <execution>
            <id>test-testng</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <junitArtifactName>none:none</junitArtifactName>
            </configuration>
        </execution>
    </executions>
</plugin>
于 2010-03-28T22:26:41.333 回答
11

this存在一个未解决的问题,因此没有优雅的方法可以做到这一点。

选择一个框架并坚持使用它会简单得多。

编辑:我以前的答案不起作用,因为您无法在执行中指定依赖项。我尝试了几种方法,但我能做到的最好的方法是为 TestNG 依赖项创建一个配置文件,以便您可以在 TestNG 和 JUnit 测试之间切换,似乎没有办法同时运行 TestNG 和 Junit 4 测试.

还有一点需要注意:您可以从 TestNG 启动您的 JUnit 测试,但我认为这仅适用于 JUnit 3 测试。

于 2009-08-05T12:31:26.467 回答
7

对此还有另一种出路。您也可以要求 TestNG 运行 Junit 测试用例。下面是运行所有测试用例的示例 testng.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 
<suite name="TestAll">
 
	<test name="junitTestCases" junit="true">
		<packages>
			<package name="com.test.*" />
			
		</packages>
	</test>
 
 <test name="testNGTestCases" >
		<packages>
			<package name="com.test.*" />
			
		</packages>
	</test>
</suite>

于 2015-03-23T09:25:50.787 回答
6

感谢这个链接(http://jira.codehaus.org/browse/SUREFIRE-377),这是我之前问题的解决方案(执行 3 次而不是 2 次)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
       <testNGArtifactName>none:none</testNGArtifactName>
    </configuration>
    <executions>
       <execution>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
             <junitArtifactName>none:none</junitArtifactName>
             <testNGArtifactName>org.testng:testng</testNGArtifactName>
          </configuration>
       </execution>
    </executions>
</plugin>
于 2011-10-29T17:26:30.007 回答
3

我找到了一个解决方案,可以在不更改构建工具配置的情况下使用 TestNG 运行两种测试类型。

我使用 Gradle 进行了测试,但也应该使用 Maven。

请注意,这将在 TestNG 中运行 JUnit 测试,但不会反过来。

诀窍是在测试类中使用两个框架的注释并使用 TestNG 断言来实现 JUnit 兼容性。

import static org.testng.AssertJUnit.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

@org.testng.annotations.Test
public final class ApplicationTest {

    @org.testng.annotations.BeforeClass
    @BeforeClass
    public static void setup () {}

    @org.testng.annotations.AfterClass
    @AfterClass
    public static void cleanup () {}

    @Test public void json () throws IOException {
        assertTrue (true);
    }
}

使用这个 hack,您可以轻松地使用 TestNG 运行现有的 JUnit 测试,帮助您在时间允许时迁移它们。

希望能帮助到你!

于 2015-02-10T20:58:47.427 回答
2

对于 JUnit ---

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>

同样在需要时使用 TestNG 的依赖项

于 2017-01-04T22:33:11.787 回答
1

我发现解决方案是强制万无一失的插件使用 JUnit。我通过覆盖特定项目中的surefire插件来做到这一点,如下所示。依赖项强制确保使用 JUnit。

<build>
    <plugins>
        <!-- force sure fire to use junit instead of testng -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.10</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
于 2011-10-18T11:17:53.580 回答
1

基于之前的解决方案。我发现这对我们最有效。我们面临的另一个问题是 TestNG 试图运行旧的 JUnit 测试。我们通过不同地命名所有TestNG 测试来避免这种情况(例如*TestNG.java)。下面是两次执行surefire-plugin的配置。

    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>           
                <testNGArtifactName>none:none</testNGArtifactName>   
                <excludes>
                    <exclude>**/*TestNG.java</exclude>
                </excludes> 
            </configuration>
            <executions>
                <execution>
                    <id>test-testng</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration> 
                        <junitArtifactName>none:none</junitArtifactName>          
                        <testNGArtifactName>org.testng:testng</testNGArtifactName>   
                        <includes>
                            <include>**/*TestNG.java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*Test.java</exclude>
                        </excludes> 
                    </configuration>
                </execution>
            </executions>
        </plugin>
于 2012-12-11T23:36:05.673 回答
1

如果您只指定 testng 提供程序,它将只运行一次 junit 测试和 testng 测试。
所以命名测试没有限制。

插件版本:
surefire-plugin 2.16(junit47 和 testng 提供者的版本都设置为 2.16)
testng 依赖 6.8.7
junit 依赖 4.7

于 2014-02-11T20:06:34.563 回答
1

对于Junit,这解决了我的问题

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>
于 2017-11-12T04:55:08.420 回答
0
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <!-- ********* Skip Test for Success BUILD ******** -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <!-- *********************************************** -->
    </plugins>
</build>

<profiles>
    <!-- ********** Profiles for run test cases ************ -->
    <!-- Profile for run JUnit test dependent tests -->
    <profile>
        <id>junit-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.apache.maven.surefire</groupId>
                            <artifactId>surefire-junit47</artifactId>
                            <version>2.10</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- Profile for run TestNG dependent tests -->
    <profile>
        <id>testNG-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- ***************************************************** -->
</profiles>

不仅仅是运行: mvn test -Pjunit-tests (用于基于 junit 的运行测试)或 mvn test -PtestNG-tests (用于基于 TestNG 测试)。

于 2014-05-08T11:33:11.660 回答