TestNG 快速入门
IntelliJ IDEA 中默认集成了 TestNG。
maven 配置:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
快速入门
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* @Author song
* @Time 2024/5/29 11:25
*/
public class TestNgLearn01 {
@BeforeClass
public void beforeClass() {
System.out.println("@BeforeClass");
}
@Test
public void TestNgLearn() {
System.out.println("@Test TestNG test case");
}
@AfterClass
public void afterClass() {
System.out.println("@AfterClass");
}
}
运行结果:
@BeforeClass
@Test TestNG test case
@AfterClass
===============================================
Default Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================
XML 方式运行
在项目根目录下编写 testng.xml
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="TestNgLearn01" >
<classes>
<class name="com.example.TestNgLearn01" />
</classes>
</test>
</suite>
右键 XML 文件,即可运行测试。
Maven 运行
pom.xml 中添加:
<!-- 和 <dependencies> 标签同一级别 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
然后可以使用 Maven 命令 mvn test
来运行
常用注解的执行顺序
这里再添加一个测试类。
import org.testng.Assert;
import org.testng.annotations.*;
import java.util.ArrayList;
import java.util.Collection;
/**
* @Author song
* @Time 2024/5/29 13:53
*/
public class TestNgLearn03 {
private Collection collection;
@BeforeSuite
public void beforeSuite() {
System.out.println("@BeforeSuite");
}
@AfterSuite
public void afterSuite() {
System.out.println("@AfterSuite");
}
@BeforeTest
public void beforeTest() {
System.out.println("@BeforeTest");
}
@AfterTest
public void afterTest() {
System.out.println("@AfterTest");
}
@BeforeClass
public void oneTimeSetUp() {
// one-time initialization code
System.out.println("@BeforeClass");
}
@AfterClass
public void oneTimeTearDown() {
// one-time cleanup code
System.out.println("@AfterClass");
}
@BeforeMethod
public void setUp() {
collection = new ArrayList();
System.out.println("@BeforeMethod - setUp");
}
@AfterMethod
public void tearDown() {
collection.clear();
System.out.println("@AfterMethod - tearDown");
}
@Test
public void testEmptyCollection() {
Assert.assertEquals(collection.isEmpty(), true);
System.out.println("@Test - testEmptyCollection");
}
@Test
public void testOneItemCollection() {
collection.add("itemA");
Assert.assertEquals(collection.size(), 1);
System.out.println("@Test - testOneItemCollection");
}
}
修改 testng.xml,添加该测试类:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="TestNgLearn01" >
<classes>
<class name="com.example.TestNgLearn01" />
</classes>
</test>
<test name="TestNgLearn03" >
<classes>
<class name="com.example.TestNgLearn03" />
</classes>
</test>
</suite>
运行结果:
@BeforeSuite
@BeforeClass
@Test TestNG test case
@AfterClass
@BeforeTest
@BeforeClass
@BeforeMethod - setUp
@Test - testEmptyCollection
@AfterMethod - tearDown
@BeforeMethod - setUp
@Test - testOneItemCollection
@AfterMethod - tearDown
@AfterClass
@AfterTest
@AfterSuite
===============================================
Suite1
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================
@BeforeSuite、@AfterSuite 在整个测试套件(可以包含多个测试类)的前后被调用。
@BeforeTest、@AfterTest 在整个测试类运行的前后被调用(测试套件级别)。
@BeforeClass、@AfterClass 是整个测试类运行时的前后被调用(类级别)。
@BeforeMethod、@AfterMethod 则在每个测试方法(@Test)被调用前都会被调用。
异常测试
public class ExceptionTest {
// @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "NullPoint")
@Test(expectedExceptions = IllegalArgumentException.class)
public void testException() {
throw new IllegalArgumentException("NullPoint");
}
}
组测试
把测试用例分组。
public class GroupTest {
@Test(groups = {"group1"})
public void test1(){
System.out.println("test group1");
}
@Test(groups = {"group2"})
public void test2(){
System.out.println("test group2");
}
}
参数化测试
为测试方法传递参数。
XML 方式传递
<suite name="Suite">
<parameter name="test1" value="Tank"/>
<parameter name="test1" value="Xiao"/>
<test name="test12">
<classes>
<class name="com.example.ParameterizedTest"/>
</classes>
</test>
</suite>
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest {
@Test
@Parameters("test1")
public void ParaTest(String test1) {
System.out.println("get " + test1);
}
}
DataProvider
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderTest {
@DataProvider(name = "user")
public Object[][] Users() {
return new Object[][]{
{"root", "passowrd"},
{"cnblogs.com", "tankxiao"},
{"tank", "xiao"}
};
}
@Test(dataProvider = "user")
public void verifyUser(String userName, String password) {
System.out.println("Username: " + userName + " Password: " + password);
}
}
忽略测试
当测试用例未准备好或者不想运行某一个测试的时候,可以使用 @Test(enabled = false)
import org.testng.annotations.Test;
public class IgnoreTesg {
@Test(enabled = false)
public void testIgnore(){
System.out.println("ignore...");
}
}
依赖测试
测试用例存在先后关系
import org.testng.annotations.Test;
public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
更多的细节可以参考博客:https://blog.youkuaiyun.com/lovedingd/article/details/106784561