1. 概述

在这个简短的教程中,我们将学习如何从命令行启动 TestNG 测试。这对于构建或在开发过程中直接运行单个测试非常有用。我们可以使用像 Maven 这样的构建工具来执行测试,也可以直接通过 java 命令运行它们。让我们来看看这两种方法。

2. 示例项目概述

以一个包含一个将日期格式化为字符串的服务的代码为例:

public class DateSerializerService {
    public String serializeDate(Date date, String format) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.format(date);
    }
}

对于测试,我们有一个测试检查当将 null 日期传递给服务时,会抛出 NullPointerException

@Test(testName = "Date Serializer")
public class DateSerializerServiceUnitTest {
    private DateSerializerService toTest;

    @BeforeClass
    public void beforeClass() {
        toTest = new DateSerializerService();
    }

    @Test(expectedExceptions = { NullPointerException.class })
    void givenNullDate_whenSerializeDate_thenThrowsException() {
        Date dateToTest = null;

        toTest.serializeDate(dateToTest, "yyyy/MM/dd HH:mm:ss.SSS");
    }
}

我们还将创建一个 pom.xml 文件,定义从命令行执行 TestNG 所需的依赖。首先,我们需要的是 TestNG

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.4.0</version>
    <scope>test</scope>
</dependency>

接下来,我们需要 JCommander,TestNG 使用它来解析命令行:

<dependency>
    <groupId>com.beust</groupId>
    <artifactId>jcommander</artifactId>
    <version>1.81</version>
    <scope>test</scope>
</dependency>

最后,如果我们希望 TestNG 写入HTML测试报告,我们需要添加 WebJar for JQuery 的依赖:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.5.1</version>
    <scope>test</scope>
</dependency>

3. 设置运行TestNG命令

3.1. 使用Maven下载依赖

由于我们有Maven项目,让我们构建它:

c:\> mvn test

这个命令应该输出:

[INFO] Scanning for projects...
[INFO] 
[INFO] ----------< com.baeldung.testing_modules:testng_command_line >----------
[INFO] Building testng_command_line 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.639 s
[INFO] Finished at: 2021-12-19T15:16:52+01:00
[INFO] ------------------------------------------------------------------------

现在,我们已经准备好从命令行运行TestNG测试了。所有依赖项都将被下载到Maven本地仓库,通常位于用户的*.m2文件夹内。

3.2. 获取类路径

为了通过java命令执行命令,我们需要添加一个-classpath选项

$ java -cp "~/.m2/repository/org/testng/testng/7.4.0/testng-7.4.0.jar;~/.m2/repository/com/beust/jcommander/1.81/jcommander-1.81.jar;~/.m2/repository/org/webjars/jquery/3.5.1/jquery-3.5.1.jar;target/classes;target/test-classes" org.testng.TestNG ...

在后续的命令行示例中,我们将将其缩写为-cp <CLASSPATH>

4. 检查TestNG命令行

让我们检查我们能否通过java访问TestNG:

$ java -cp <CLASSPATH> org.testng.TestNG

如果一切正常,控制台将显示消息:

You need to specify at least one testng.xml, one class or one method
Usage: <main class> [options] The XML suite files to run
Options:
...

5. 启动TestNG单个测试

5.1. 通过java命令运行单个测试

现在,我们可以快速地 不需要配置单个测试套件文件,只需使用以下命令行即可运行单个测试:

$ java -cp <CLASSPATH> org.testng.TestNG -testclass "com.baeldung.testng.DateSerializerServiceUnitTest"

5.2. 通过Maven运行单个测试

如果我们希望Maven只执行这个测试,我们可以在pom.xml文件中配置maven-surefire-plugin

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/DateSerializerServiceUnitTest.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

在示例中,我们有一个名为ExecuteSingleTest的配置,用于执行DateSerializerServiceUnitTest.java。我们可以运行这个配置:

$ mvn -P ExecuteSingleTest test

如我们所见,与简单的TestNG命令行执行相比,Maven在执行单个测试时需要更多的配置

6. 启动TestNG测试套件

6.1. 通过java命令运行测试套件

测试套件文件定义了测试应该如何运行。我们可以根据需要拥有多个。我们可以通过指向定义测试套件的XML文件来运行测试套件

$ java -cp <CLASSPATH> org.testng.TestNG testng.xml

6.2. 通过Maven运行测试套件

如果我们想使用Maven执行测试套件,我们应该配置maven-surefire-plugin插件

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

这里,我们有一个名为ExecuteTestSuite的Maven配置,它将配置maven-surefire plugin来启动testng.xml测试套件。我们可以使用以下命令运行这个配置:

$ mvn -P ExecuteTestSuite test

7. 总结

在这篇文章中,我们了解到TestNG命令行对于运行单个测试文件很有帮助,而Maven则应用于配置和启动完整的测试集
如往常一样,本文的示例代码可在GitHub上找到。