单元测试之TestNG知识点总结及代码示例

     TestNG 是一个测试框架,用于自动化测试 Java 和 Scala 应用程序,它是 JUnit 和 NUnit 的一个强大替代品。TestNG 支持数据驱动测试、参数化测试、测试套件、依赖管理、多线程测试等特性。TestNG官网:TestNG Documentation

目录

1.TestNG 基本注解

2.TestNG 测试分组

3.TestNG 参数化测试

4.TestNG 时间依赖性测试

5.TestNG 依赖测试方法

6.TestNG 并发测试

 7.TestNG 命令行参数

8.TestNG 测试结果和断言

9.TestNG 测试套件(Suite)的配置

10.TestNG 测试方法选择器

11.TestNG 报告监听器

12.TestNG 动态依赖性

13.TestNG 跨测试方法共享数据

14.TestNG 灵活的测试运行配置

15.TestNG 测试结果的自定义

16.TestNG 软依赖性测试

17.TestNG 测试优先级

18.TestNG 测试运行工厂

19. TestNG 测试环境的配置

20.Spring Boot 项目中集成 TestNG


1.TestNG 基本注解
注解描述
@Test标记一个方法为测试方法。
@BeforeSuite在测试套件中的所有测试运行之前运行。
@AfterSuite在测试套件中的所有测试运行之后运行。
@BeforeTest在当前测试类中的所有测试运行之前运行。
@AfterTest在当前测试类中的所有测试运行之后运行。
@BeforeClass在当前类中的所有测试运行之前运行,仅运行一次。
@AfterClass在当前类中的所有测试运行之后运行,仅运行一次。
@BeforeMethod在每个测试方法运行之前运行。
@AfterMethod在每个测试方法运行之后运行。
@Parameters指定一个属性文件,TestNG 会从该文件中读取参数。
@DataProvider为测试方法提供参数。
@Listeners指定监听器类,监听器可以处理测试的执行和报告。

 代码示例:

import org.testng.annotations.*;public class BasicAnnotationsTest {@BeforeSuitepublic void beforeSuite() {System.out.println("Before Suite");}@AfterSuitepublic void afterSuite() {System.out.println("After Suite");}@Testpublic void testMethod1() {System.out.println("Test Method 1");}@Test(dependsOnMethods = "testMethod1")public void testMethod2() {System.out.println("Test Method 2");}@BeforeMethodpublic void beforeMethod() {System.out.println("Before Method");}@AfterMethodpublic void afterMethod() {System.out.println("After Method");}
}

在这个示例中,我们展示了如何使用 TestNG 的基本注解来组织测试方法的执行顺序和执行时机。

2.TestNG 测试分组
注解描述
@Test标记一个方法为测试方法,可以指定分组。
groups指定当前测试方法属于哪个测试分组。
@Groups定义一组测试分组,可以被 @Test 注解引用。

代码示例:

import org.testng.annotations.Test;
import org.testng.annotations.Groups;@Groups({ "unitTests", "smokeTests" })
public class GroupTest {@Test(groups = "unitTests")public void unitTestMethod() {System.out.println("Running unit test method");}@Test(groups = "integrationTests")public void integrationTestMethod() {System.out.println("Running integration test method");}@Test(groups = "smokeTests")public void smokeTestMethod() {System.out.println("Running smoke test method");}
}public class TestRunner {public static void main(String[] args) {org.testng.TestNG.main(new String[] {"-groups", "unitTests", "-class", "GroupTest"});}
}

在这个示例中,我们使用了 @Groups 注解来定义测试分组,然后在 @Test 注解中通过 groups 属性指定了测试方法所属的分组。TestRunner 类中的 main 方法展示了如何通过命令行运行指定分组的测试。

当然还可以通过XML 配置文件将测试方法或类分配到不同的组。这样,你可以通过指定组名来运行特定的测试集合。以下是如何使用 XML 配置文件来设置测试分组的示例:

XML配置示例:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MySuite" verbose="1"><test name="Unit Tests" annotations="JDK"><groups><run><include name="unit"/></run></groups><classes><class name="com.example.CalculatorTest"><methods><include name="testAdd"/><include name="testMultiply"/></methods></class></classes></test><test name="Integration Tests" annotations="JDK"><groups><run><include name="integration"/></run></groups><classes><class name="com.example.ApiIntegrationTest"/></classes></test></suite>

 在这个配置文件中,我们定义了一个名为 MySuite 的测试套件,它包含两个测试 Unit TestsIntegration Tests。每个测试定义了一个 groups 块,其中 run 块里的 include 元素指明了要运行的测试组的名称。

com.example.CalculatorTest 类中的 testAddtestMultiply 方法被明确包含在 Unit Tests 测试中,并且它们应该被注解为属于 "unit" 组:

import org.testng.annotations.Test;
import org.testng.annotations.Groups;@Groups({ "unit" })
public class CalculatorTest {@Testpublic void testAdd() {// ...}@Testpublic void testMultiply() {// ...}
}

com.example.ApiIntegrationTest 类应该被注解为属于 "integration" 组:

import org.testng.annotations.Test;
import org.testng.annotations.Groups;@Groups({ "integration" })
public class ApiIntegrationTest {@Testpublic void testApiEndpoint() {// ...}
}

 要运行这个配置文件,你可以使用 TestNG 的命令行工具并指定 XML 文件:

java -cp path/to/testng.jar org.testng.TestNG path/to/testng.xml

这样,TestNG 将会根据 XML 配置文件中的分组信息运行指定的测试。

3.TestNG 参数化测试
注解描述
@Test标记一个方法为测试方法,可以用于参数化测试。
@Parameters指定测试方法的参数来源于何处,如外部文件或数据提供器。
@DataProvider提供测试方法的参数。
dataProviderThreadCount设置数据提供器的线程数量。

 代码示例:

import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;public class ParameterizedTest {@Test(dataProvider = "getData", dataProviderClass = DataProviderClass.class)public void parameterizedTest(String param1, int param2) {System.out.println("Parameter 1: " + param1);System.out.println("Parameter 2: " + param2);}public static class DataProviderClass {@DataProvider(name = "getData")public Object[][] provideData() {return new Object[][] {{ "Value1", 1 },{ "Value2", 2 },{ "Value3", 3 }};}}
}

在这个示例中,我们通过 @DataProvider 注解定义了一个数据提供器类 DataProviderClass,它提供了参数化测试方法 parameterizedTest 的参数。parameterizedTest 方法使用 @Test 注解来指定数据提供器的名称和类。

还可以通过@Parameters注解,结合外部的xml文件配置,获取参数值

使用@Parameters注解的xml配置示例:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="ParameterizedTestSuite" configfailurepolicy="continue"><parameter name="endpoint" value="http://localhost:8080"/><test name="ParameterizedTests"><parameter name="username" value="testuser"/><parameter name="password" value="testpass"/><classes><class name="com.example.ParameterizedTest"/></classes></test>
</suite>

 在这个配置文件中,我们定义了一个测试套件 ParameterizedTestSuite,其中包含了两个参数:endpointusernamepassword。这些参数可以在测试方法中通过 @Parameters 注解引用

代码示例:

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;public class ParameterizedTest {String username;String password;@Parameters({ "username", "password" })public void setParameters(String username, String password) {this.username = username;this.password = password;}@Testpublic void testLogin() {// 使用提供的参数来执行测试boolean success = login(username, password);assert success : "Login failed for " + username;}private boolean login(String username, String password) {// 模拟登录过程return "testuser".equals(username) && "testpass".equals(password);}
}

 在这个代码示例中,setParameters 方法使用了 @Parameters 注解,它允许方法接收来自 XML 配置文件中定义的参数。然后,testLogin 方法使用这些参数来执行测试。

要运行参数化测试,你需要确保 TestNG 的命令行工具指向了包含参数定义的 XML 文件:

java -cp path/to/testng.jar org.testng.TestNG path/to/testng.xml

这样,TestNG 将会加载参数并在测试运行时将它们传递给相应的测试方法。

4.TestNG 时间依赖性测试
注解描述
@Test标记一个方法为测试方法,可以指定时间依赖性。
timeOut指定测试方法的最大执行时间,单位为毫秒。
expectedExceptions期望抛出的异常类型,如果测试方法抛出了指定的异常,则测试通过。
expectedExceptionsMessageRegExp期望异常消息匹配的正则表达式。

代码示例:

import org.testng.annotations.Test;
import org.testng.Assert;
import java.util.concurrent.TimeUnit;public class TimeDependencyTest {@Test(timeOut = 1000) // 测试方法最多执行1秒public void timeOutTest() throws InterruptedException {TimeUnit.SECONDS.sleep(2); // 模拟耗时操作}@Test(expectedExceptions = ArithmeticException.class)public void expectedExceptionTest() {int result = 10 / 0; // 故意抛出异常}@Test(expectedExceptions = ArithmeticException.class, expectedExceptionsMessageRegExp = "divide by zero")public void expectedExceptionMessageTest() {int result = 10 / 0; // 异常消息包含 "divide by zero"}
}

 在这个示例中,timeOutTest 方法演示了如何使用 timeOut 属性来限制测试方法的执行时间。如果方法执行时间超过指定的时间限制,TestNG 将报告该测试失败。

expectedExceptionTest 方法演示了如何使用 expectedExceptions 属性来指定一个测试方法应该抛出的异常类型。如果测试方法没有抛出指定的异常,TestNG 将报告该测试失败。

expectedExceptionMessageTest 方法演示了如何使用 expectedExceptionsMessageRegExp 属性来指定一个正则表达式,该表达式用于匹配异常消息。如果异常消息不匹配正则表达式,TestNG 将报告该测试失败。

5.TestNG 依赖测试方法
注解描述
@Test标记一个方法为测试方法,可以指定依赖关系。
dependsOnMethods指定当前测试方法依赖的其他方法。
dependsOnGroups指定当前测试方法依赖的测试分组。

代码示例:

import org.testng.annotations.Test;public class DependencyTest {@Testpublic void methodOne() {System.out.println("Method One");}@Test(dependsOnMethods = "methodOne")public void methodTwo() {System.out.println("Method Two");}@Test(dependsOnGroups = "groupOne")public void methodThree() {System.out.println("Method Three");}
}

 在这个示例中,methodTwo 依赖于 methodOne,这意味着 methodOne 必须先运行,然后 methodTwo 才能执行。methodThree 依赖于名为 groupOne 的测试分组,这意味着属于 groupOne 分组的所有测试方法必须先运行,然后 methodThree 才能执行。

6.TestNG 并发测试
注解描述
@Test标记一个方法为测试方法,可以指定并发执行的属性。
invocationCount指定测试方法应该被调用的次数。
threadPoolSize指定用于并发执行测试方法的线程池大小。
parallel指定测试是否可以并行执行。

 代码示例:

import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;public class ConcurrencyTest {@Test(invocationCount = 5, threadPoolSize = 3)public void testMethod() {System.out.println("Test method executed by thread: " + Thread.currentThread().getName());}@Test(invocationCount = 10, threadPoolSize = 2, parallel = true)public void testMethodWithDataProvider(@SuppressWarnings("unused") int i) {System.out.println("Test method with data provider executed by thread: " + Thread.currentThread().getName());}@DataProvider(name = "numbers")public Object[][] provideNumbers() {return new Object[][] {{1}, {2}, {3}, {4}, {5}};}
}

 在这个示例中,testMethod 使用了 invocationCountthreadPoolSize 属性来指定测试方法应该被调用 5 次,并且使用一个大小为 3 的线程池来并发执行这些调用。

testMethodWithDataProvider 方法演示了如何结合 DataProvider 和并发执行。它将被调用 10 次,每次调用都由线程池中的线程执行,且线程池的大小为 2。parallel 属性设置为 true,允许测试方法的调用在并行中执行。

在 TestNG 中,可以通过 XML 配置文件来设置并发测试。这允许你指定测试应该以多线程的方式运行,以及定义线程池的大小。以下是一个使用 XML 配置文件来设置并发测试的示例:

<!--tests级别:不同的test tag下的用例可以在不同的线程下执行相同的test tag下的用例只能在同一个线程中去执行classs级别:相同的class tag 下的用例在同一个线程中执行不同的class tag 下的用例可以在不同的线程中执行methods级别:所有用例都可以在不同的线程下去执行thread-count:代表了最大并发线程数xml文件配置这种方式不能指定线程池,只有方法上才可以指定线程池--><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MySuite" parallel="methods" thread-count="5"><test name="ConcurrentTests"><classes><class name="com.example.ConcurrentTest1"/><class name="com.example.ConcurrentTest2"/></classes></test></suite>

在这个配置文件中,suite 标签的 parallel 属性设置为 "methods",这表示测试方法将并发执行。thread-count 属性设置为 "5",定义了线程池的大小为 5,即最多可以有 5 个测试方法同时运行。

测试类示例:

package com.example;import org.testng.annotations.Test;public class ConcurrentTest1 {@Testpublic void testMethod1() {// 测试逻辑}
}class ConcurrentTest2 {@Testpublic void testMethod2() {// 测试逻辑}
}

在上述 Java 代码中,ConcurrentTest1ConcurrentTest2 类中的测试方法将根据 XML 配置文件中的设置并发执行。

运行并发测试

要运行这个配置文件,你可以使用 TestNG 的命令行工具并指定 XML 文件:

java -cp path/to/testng.jar;path/to/your/tests org.testng.TestNG path/to/testng.xml

确保你的类路径(Classpath)包含了 TestNG jar 文件和你的测试类。

这样,TestNG 将会根据 XML 配置文件中的设置并发地运行测试方法。

 7.TestNG 命令行参数
参数/选项描述
-suite指定要运行的测试套件文件。
-test指定要运行的测试类。
-method指定要运行的测试方法。
-groups运行指定的测试分组。
-class运行指定的测试类。
-d指定生成的测试报告的目录。
-listener指定监听器类。
-dataproviderthreadcount设置数据提供器的线程数量。
-threadcount指定并发执行的线程数量。
-p指定属性文件。
-s指定套件文件。
-c指定类文件。
-m指定方法文件。
-t指定测试文件。
-v打印 TestNG 的版本信息。
-h打印帮助信息。

示例

java -cp path/to/testng.jar org.testng.TestNG -test TestClass -method testMethod

在这个示例中,我们使用命令行参数 -test 来指定要运行的测试类 TestClass,以及 -method 来指定要运行的测试方法 testMethod

8.TestNG 测试结果和断言
注解/类描述
@Test标记测试方法,可以指定期望的异常或超时时间。
AssertTestNG 提供的断言类,包含多种断言方法。
ITestResult提供测试结果的详细信息,如状态、日志等。
ITestListener监听测试事件,可以自定义测试结果的处理。

代码示例:

import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.ITestResult;public class ResultAndAssertTest {@Testpublic void assertionExample() {int expected = 4;int actual = 2 + 2;Assert.assertEquals(actual, expected, "2 + 2 should equal 4");}@Testpublic void testResultExample(ITestResult result) {// 这里可以获取测试结果的详细信息System.out.println("Test status: " + result.getStatus());}
}

在这个示例中,assertionExample 方法使用 Assert.assertEquals 方法来验证实际结果是否等于期望结果。如果不等于,测试将失败,并打印出提供的消息。

testResultExample 方法演示了如何使用 ITestResult 接口来获取测试结果的详细信息,如测试状态。

9.TestNG 测试套件(Suite)的配置
配置项描述
suite-name定义测试套件的名称。
test-name定义测试的名称。
parallel指定测试是否可以并行执行。
thread-count指定并发执行的线程数量。
suite-filename指定测试套件的文件名。
test-filename指定测试的文件名。
groups指定要运行的测试分组。
method-selectors指定如何选择测试方法。

 在 TestNG 中,测试套件(Suite)是一个容器,它允许你将多个测试组合在一起进行批量执行。测试套件可以通过 XML 文件来配置,也可以通过注解直接在代码中定义。以下是两种定义测试套件的方法:

XML配置后方式的代码示例

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MyTestSuite" parallel="tests" thread-count="2"><test name="Unit Tests"><classes><class name="com.example.CalculatorTest"/></classes></test><test name="Integration Tests"><classes><class name="com.example.ApiIntegrationTest"/></classes></test></suite>

在这个 XML 配置文件中,我们定义了一个名为 MyTestSuite 的测试套件,它包含了两个测试 Unit TestsIntegration Tests。每个 test 标签下可以包含一个或多个 class 标签,指定了需要运行的测试类。

使用注解在代码中定义测试套件的示例:

import org.testng.annotations.SuiteBeforeClass;
import org.testng.annotations.Test;public class SuiteTest {@SuiteBeforeClasspublic void setUp() {// 初始化操作,如数据库连接等}@Testpublic void testMethod1() {// 单元测试逻辑}@Test(dependsOnGroups = "integration")public void testMethod2() {// 集成测试逻辑}
}

在这个 Java 代码示例中,我们使用了 @SuiteBeforeClass 注解来定义一个在测试套件所有测试运行之前执行的方法。虽然这个例子没有直接定义多个测试,但是可以通过组合使用 @Test 注解和分组(groups)来实现类似的效果。

运行测试套件

使用 XML 文件运行测试套件的命令如下:

java -cp path/to/testng.jar;path/to/your/tests org.testng.TestNG path/to/testng.xml

请确保将 path/to/testng.jar 替换为 TestNG jar 文件的实际路径,将 path/to/your/tests 替换为你的测试类文件所在的路径,将 path/to/testng.xml 替换为 XML 配置文件的实际路径。

使用注解定义的测试套件可以通过直接运行带有 @Test 注解的测试类来执行。TestNG 将自动识别和执行定义的测试套件。

10.TestNG 测试方法选择器
注解/类描述
IMethodSelector实现该接口的类可以自定义选择要运行的测试方法的逻辑。
XmlMethodSelector基于 XML 文件选择测试方法的内置选择器。
DefaultMethodSelector默认的选择器,按定义顺序运行测试方法。

代码示例:

import org.testng.IMethodSelector;
import org.testng.ITestContext;
import org.testng.annotations.Test;public class CustomMethodSelector implements IMethodSelector {@Overridepublic boolean includeMethod(ITestContext context, IMethod method, Object[] parameters) {String methodName = method.getMethodName();// 自定义选择逻辑,例如只运行以 "Test" 结尾的方法return methodName.endsWith("Test");}
}@Test
public class SampleTest {@Test(invocations = 1, methodSelectors = {CustomMethodSelector.class})public void testMethod1() {// 这个测试方法将被执行}@Test(invocations = 1, methodSelectors = {CustomMethodSelector.class})public void anotherTestMethod() {// 这个测试方法不会被执行,因为它的名称不以 "Test" 结尾}
}

在这个示例中,CustomMethodSelector 类实现了 IMethodSelector 接口,提供了自定义的选择逻辑,只选择方法名以 "Test" 结尾的测试方法执行。SampleTest 类中的 testMethod1 将被执行,而 anotherTestMethod 不会,因为其方法名不满足选择器的逻辑。

11.TestNG 报告监听器
注解/类描述
ITestListener实现该接口的类可以自定义测试事件的处理逻辑。
ISuiteListener监听测试套件级别的事件。
ITestListenerFactory可以创建自定义的 ITestListener 实例。
TestListenerAdapter提供了 ITestListener 接口的默认实现。

代码示例:

import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import org.testng.annotations.Test;public class CustomTestListener extends TestListenerAdapter {@Overridepublic void onTestFailure(ITestResult result) {super.onTestFailure(result);System.out.println("Custom listener: Test failed - " + result.getName());}
}@Test.listeners(CustomTestListener.class)
public class SampleTest {@Testpublic void failingTest() {throw new AssertionError("Intentional failure");}
}

在这个示例中,CustomTestListener 类继承了 TestListenerAdapter 类并重写了 onTestFailure 方法,以在测试失败时输出自定义的消息。

SampleTest 类使用了 @Test.listeners 注解来指定 CustomTestListener 作为其测试的监听器。当 failingTest 方法失败时,CustomTestListeneronTestFailure 方法会被调用,输出自定义的消息。

12.TestNG 动态依赖性
注解/类描述
IHookable允许测试方法具有动态依赖性。
ITest提供测试的详细信息,包括其依赖性

代码示例:

import org.testng.IHookable;
import org.testng.ITest;
import org.testng.annotations.Test;public class DynamicDependencyTest implements IHookable {@Overridepublic boolean skip(ITest test, ITestResult iTestResult) {// 动态决定是否跳过当前测试String testName = test.getMethodName();if (testName.contains("Skipped")) {return true; // 跳过包含 "Skipped" 的测试方法}return false;}@Testpublic void testMethod1() {System.out.println("Running testMethod1");}@Testpublic void skippedTestMethod() {System.out.println("Running skippedTestMethod");}
}

在这个示例中,DynamicDependencyTest 类实现了 IHookable 接口,通过 skip 方法提供了动态跳过测试的逻辑。如果测试方法的名称包含 "Skipped",则该方法将被跳过。

13.TestNG 跨测试方法共享数据
概念/类描述
ITestContext提供对当前测试上下文的访问,可以用于跨测试方法共享数据。
setAttribute将数据设置到测试上下文中。
getAttribute从测试上下文中获取数据。
removeAttribute从测试上下文中移除数据。

代码示例:

import org.testng.ITestContext;
import org.testng.annotations.Test;public class DataSharingTest {@Testpublic void setAttributeTest(ITestContext testContext) {// 将数据设置到测试上下文中testContext.setAttribute("sharedData", "This is shared data");}@Test(dependsOnMethods = "setAttributeTest")public void getAttributeTest(ITestContext testContext) {// 从测试上下文中获取数据String sharedData = (String) testContext.getAttribute("sharedData");System.out.println("Shared data: " + sharedData);}
}

在这个示例中,setAttributeTest 方法使用 ITestContext 将数据设置到测试上下文中。然后,getAttributeTest 方法从测试上下文中获取之前设置的数据,并打印出来。

14.TestNG 灵活的测试运行配置
参数/选项描述
-p 或 -params指定参数文件,用于为测试提供外部输入。
-D指定系统属性,可以被测试使用。
-configfailurepolicy配置失败策略,如继续执行、抛出异常等。
-groups运行指定的测试分组。
-testrunfactory指定测试运行工厂类,用于自定义测试运行逻辑。

 示例:

java -cp path/to/testng.jar org.testng.TestNG -p config.properties -Dbrowser=chrome

 在这个示例中,命令行参数 -p 用于指定一个属性文件 config.properties,该文件可以包含测试所需的参数。-D 参数用于设置系统属性 browser 的值为 chrome,这个属性可以在测试中被读取和使用。

15.TestNG 测试结果的自定义
注解/类描述
ITestResultListener允许自定义测试结果的监听器。
onTestStart当测试开始时调用。
onTestSuccess当测试成功时调用。
onTestFailure当测试失败时调用。
onTestSkipped当测试被跳过时调用。
onTestFailedButWithinSuccessPercentage当测试失败但失败率在允许的百分比内时调用。

代码示例:

import org.testng.ITestResultListener;
import org.testng.ITestResult;public class CustomTestResultListener implements ITestResultListener {@Overridepublic void onTestStart(ITestResult result) {System.out.println("Test " + result.getName() + " is starting.");}@Overridepublic void onTestSuccess(ITestResult result) {System.out.println("Test " + result.getName() + " succeeded.");}@Overridepublic void onTestFailure(ITestResult result) {System.out.println("Test " + result.getName() + " failed.");}@Overridepublic void onTestSkipped(ITestResult result) {System.out.println("Test " + result.getName() + " was skipped.");}@Overridepublic void onTestFailedButWithinSuccessPercentage(ITestResult result) {System.out.println("Test " + result.getName() + " failed but is within the success percentage.");}
}

在这个示例中,CustomTestResultListener 实现了 ITestResultListener 接口,提供了在测试的不同阶段自定义行为的方法。这些自定义的方法可以在测试执行的不同阶段提供额外的日志信息或其他自定义行为。

16.TestNG 软依赖性测试
注解/类描述
@Test标记一个方法为测试方法,可以指定软依赖性。
expectedExceptions期望抛出的异常类型,如果测试方法抛出了指定的异常,则测试通过。
dependsOnMethods可以指定当前测试方法依赖的其他方法,并且可以设置是否为软依赖。

代码示例:

import org.testng.annotations.Test;public class SoftDependencyTest {@Testpublic void methodOne() {System.out.println("Method One");}@Test(dependsOnMethods = "methodOne", alwaysRun = true)public void methodTwo() {System.out.println("Method Two");}
}

在这个示例中,methodTwo 依赖于 methodOne,但由于使用了 alwaysRun = true,即使 methodOne 失败,methodTwo 也会执行。这是软依赖性的一个例子,即依赖的方法失败不会导致当前方法跳过。

17.TestNG 测试优先级
注解/类描述
@Test标记一个方法为测试方法,可以指定优先级。
priority指定测试方法的执行优先级。

代码示例:

import org.testng.annotations.Test;public class TestPriority {@Test(priority = 1)public void highPriorityTest() {System.out.println("High priority test");}@Test(priority = 2)public void mediumPriorityTest() {System.out.println("Medium priority test");}@Test(priority = 3)public void lowPriorityTest() {System.out.println("Low priority test");}
}

在这个示例中,我们使用了 @Test 注解的 priority 属性来指定不同测试方法的执行优先级。具有较高优先级的测试方法将优先执行。如果没有指定优先级,则默认优先级为 0。

18.TestNG 测试运行工厂
注解/类描述
@Test标记一个方法为测试方法。
ITestRunnerFactory允许自定义测试运行器,以控制测试的执行方式。
TestRunnerTestNG 提供的测试运行器类。

代码示例:

import org.testng.ITestRunnerFactory;
import org.testng.TestRunner;public class CustomTestRunnerFactory implements ITestRunnerFactory {@Overridepublic TestRunner newTestRunner(ITest presentTest, XmlTest xmlTest, XmlSuite xmlSuite) {// 返回自定义的 TestRunner 实例return new CustomTestRunner(presentTest, xmlTest, xmlSuite);}static class CustomTestRunner extends TestRunner {public CustomTestRunner(ITest presentTest, XmlTest xmlTest, XmlSuite xmlSuite) {super(presentTest, xmlTest, xmlSuite);// 自定义测试运行逻辑}}
}

在这个示例中,我们创建了一个实现了 ITestRunnerFactory 接口的 CustomTestRunnerFactory 类,它返回一个自定义的 TestRunner 实例 CustomTestRunner。这样,我们可以在 CustomTestRunner 类中自定义测试的执行逻辑。

要使用自定义的测试运行工厂,需要在 TestNG 的套件配置文件中指定它:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MySuite" ><listeners><listener class-name="path.to.CustomTestRunnerFactory" /></listeners><test name="MyTest"><classes><class name="com.example.MyTestClass" /></classes></test>
</suite>
19. TestNG 测试环境的配置
注解/类描述
@BeforeSuite在测试套件中的所有测试运行之前运行的方法,用于测试环境的配置。
@AfterSuite在测试套件中的所有测试运行之后运行的方法,用于测试环境的清理。
系统属性通过系统属性来配置测试环境。
环境变量通过环境变量来配置测试环境。

代码示例:

import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;public class EnvironmentConfiguration {@BeforeSuitepublic void setUp() {// 设置测试环境,如数据库连接、服务器配置等System.setProperty("database.url", "jdbc:mysql://localhost:3306/testdb");}@AfterSuitepublic void tearDown() {// 清理测试环境// 关闭数据库连接、停止服务器等}
}

在这个示例中,setUp 方法在测试套件中的所有测试运行之前执行,用于配置测试环境。tearDown 方法在测试套件中的所有测试运行之后执行,用于清理测试环境。

此外,系统属性和环境变量也常用于配置测试环境。例如,数据库的 URL、端口号、用户名和密码等信息可以通过系统属性或环境变量来设置。

20.Spring Boot 项目中集成 TestNG

20.1 添加TestNG依赖

首先,确保你的 Spring Boot 项目包含 TestNG 依赖。如果你使用 Maven,可以在 pom.xml 文件中添加如下依赖:

<dependencies><!-- Other dependencies --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.4.0</version> <!-- 使用你需要的版本 --><scope>test</scope></dependency>
</dependencies>

对于 Gradle 用户,添加如下依赖到 build.gradle 文件中:

dependencies {// Other dependenciestestImplementation 'org.testng:testng:7.4.0' // 使用你需要的版本
}

20.2 配置TestNG

 在 src/test/resources 目录下创建 testng.xml 文件,并配置你的测试套件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Spring Boot Tests" configfailurepolicy="continue"><test name="Unit Tests"><classes><class name="com.example.MyUnitTest"/></classes></test><test name="Integration Tests"><classes><class name="com.example.MyIntegrationTest"/></classes></test>
</suite>

20.3.编写测试类

创建测试类,使用 TestNG 的注解来编写单元测试和集成测试。

import org.testng.annotations.Test;public class MyUnitTest {@Testpublic void testMethod() {// 单元测试逻辑}
}

20.4 运行测试

在 IntelliJ IDEA 或其他支持 Maven 的 IDE 中,TestNG 测试通常可以自动识别并运行。你可以直接通过 IDE 的测试运行器来执行测试。

如果你在命令行中运行测试,可以使用 Maven 的 Surefire 插件:

mvn test

20.5 Spring Boot集成

 Spring Boot 应用程序通常需要配置 Spring Test 相关的依赖来支持 Spring Boot 测试。确保你的项目中包含了如下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId></exclusion></exclusions>
</dependency>

请注意,这里我们通过 exclusions 排除了 JUnit,因为你可能想使用 TestNG 而不是 JUnit。

20.6 配置Spring Boot Test

在 TestNG 的 testng.xml 文件中,你可以配置 Spring Boot Test 的相关设置,例如:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Spring Boot Integration Tests"><listeners><listener class-name="org.springframework.test.context.TestExecutionListeners"/></listeners><test name="Spring Boot Tests"><classes><class name="com.example.MySpringBootTest"/></classes></test>
</suite>

确保你的测试类使用 Spring Test 相关的注解,如 @SpringBootTest

20.7 调试和查看报告

TestNG 生成的测试报告可以位于 target/surefire-reports 目录下,你可以通过该目录下的 HTML 文件查看测试结果。

前边提到的以xml方式配置的,放在resources下边的TestNG相关的xml配置文件,idea可以自动识别,所以其实也可以不用执行java -cp ...这样的命令来运行。

idea和eclipse都有TestNG对应的插件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCB笔记(二十六):PCB检查

前言 首先检查元器件是否100&#xff05; 放置 文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bo…

【管理咨询宝藏101】普华永道并购尽调内部培训

【管理咨询宝藏101】普华永道并购尽调内部培训 【格式】PDF版本 【关键词】普华永道、兼并收购、尽职调查 【核心观点】 - 尽职调查的目的&#xff0c;发现潜在的致命缺陷&#xff0c;判断是否继续交易进程&#xff1b;发现潜在的问题&#xff0c;制定交易前后相应的应对措施。…

C语言 | Leetcode C语言题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2--];} else if (p2 -1) {cur nu…

Kali Linux菜单中各工具功能大全

网络安全学习路线 &#xff08;2024最新整理&#xff09; 如图片过大被平台压缩导致看不清的话&#xff0c;评论区点赞和评论区留言扣1或者关注我我后台会主动发给你&#xff01; 第一阶段&#xff1a;安全基础 网络安全行业与法规 Linux操作系统 计算机网络 HTML PHP Mysql P…

【董晓算法】竞赛常用知识之字符串2

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列&#xff08;还没学完&#xff09; 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题&#xff…

用Rust打印杨辉三角

一、杨辉三角是什么&#xff1f; 杨辉三角是一个著名的数学图形&#xff0c;它展示了二项式系数的排列方式。 杨辉三角是一种将二项式系数以三角形阵列排列的数学图形&#xff0c;具有丰富的历史和数学意义。 杨辉三角的历史起源可以追溯到中国南宋时期&#xff0c;由数学家杨辉…

极端天气对气膜建筑有什么影响吗—轻空间

气膜建筑在近年来的发展迅速&#xff0c;逐渐替代了一部分传统建筑&#xff0c;展现了良好的市场前景。然而&#xff0c;面对自然环境中的极端天气&#xff0c;如暴风、暴雨和暴雪&#xff0c;气膜建筑是否能够经受住考验是大家关注的焦点。轻空间带您探讨一下这些极端天气对气…

探究NVMe SSD HMB应用场景与影响-<续>

如果需要采用HMB功能&#xff0c;需要SSD支持NVME协议且NVMe 1.2及以上版本。NVME协议中对HMB对应有2个关键参数&#xff1a; HMB建议值&#xff08;HMPRE&#xff09;&#xff1a;设定实际分配给HMB使用的主机内存容量&#xff0c;为设备提供最优性能的内存分配量。 HMB最小值…

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中&#xff0c;参数传递是一个非常重要的概念&#xff0c;它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法&#xff0c;并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…

EPS软件标注点坐标值

1、如下&#xff0c;点击右侧&#xff08;尺寸标注&#xff09;按钮&#xff1a; 2、弹出一个对话框&#xff0c;如下&#xff1a; 3、在上图对话框中设置好箭头样式和小数位数&#xff0c;然后点击图上一点&#xff0c;右击结束再鼠标指定位置&#xff0c;如下&#xff1a; 如…

CV每日论文--2024.5.10

1、Attention-Driven Training-Free Efficiency Enhancement of Diffusion Models 中文标题&#xff1a;扩散模型的注意力驱动的训练免费效率增强 简介&#xff1a;扩散模型在生成高质量和多样化图像方面取得了出色的表现,但其卓越性能是以昂贵的架构设计为代价的,特别是广泛使…

数据库——SQL SERVER(先学删库跑路)

目录 一&#xff1a;什么是数据库 二&#xff1a;为什么需要数据库 三&#xff1a;数据库的安装 四&#xff1a;学前必备知识 1. 数据库原理 2. 数据库与编程语言 3. 数据库与数据结构的区别 4. 连接 5. 有了编程语言为啥还要数据库 6. 初学者学习数据库的三个方面 …

高校推免报名|基于SSM+vue的高校推免报名系统的设计与实现(源码+数据库+文档)

高校推免报名 目录 基于SSM&#xff0b;vue的高校推免报名的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能模块 5.2.2考生功能模版 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章&#xff0c;这两篇文章套路是一样的&#xff0c;只是在不同国家进行。 在计算combined PAF或者说weighted PAF的时候&#xff0c;先建立了相关矩阵&#xff0c;再做主成分分析&#xff0c;得到communality。详细信息大家可翻阅…

el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联

Vue实现 el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联 效果展示 首先el-calendar需要自定义日程内容的话,其格式一般必须满足如下结构 dataList = [{date: 2024-05-08, content: "数学模拟试卷(3)"},{date: 2024-05-08, content: …

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

C语言(指针)6

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元&#xff1a;人类神经元中抽象出来的数学模型 MP模型 mp模型&#xff1a;1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元&#xff0c;称为M-P模型。 M-P神经元&#xff08;一个用来模拟生物行为的数学模…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…

P6397 [COI2008] GLASNICI

题目描述 一条直线上有 &#x1d45b; 个信使&#xff0c;将他们按照从左至右的顺序以 1 至 &#x1d45b; 编号。换句话说&#xff0c;设 &#x1d456; 号信使的的坐标为 &#x1d451;&#x1d456;​&#xff0c;则对于 1≤&#x1d456;<&#x1d45b;&#xff0c; &am…