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上找到。