TestNG学习笔记新的
1、参考官方文档https://www.yiibai.com/html/testng/2013/0915300.html
package com.cib.testng; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeSuite; import org.testng.annotations.AfterSuite; public class TestngAnnotation { // test case 1 @Test public void testCase1() { System.out.println("in test case 1"); } // test case 2 @Test public void testCase2() { System.out.println("in test case 2"); } @BeforeMethod public void beforeMethod() { System.out.println("in beforeMethod"); } @AfterMethod public void afterMethod() { System.out.println("in afterMethod"); } @BeforeClass public void beforeClass() { System.out.println("in beforeClass"); } @AfterClass public void afterClass() { System.out.println("in afterClass"); } @BeforeTest public void beforeTest() { System.out.println("in beforeTest"); } @AfterTest public void afterTest() { System.out.println("in afterTest"); } @BeforeSuite public void beforeSuite() { System.out.println("in beforeSuite"); } @AfterSuite public void afterSuite() { System.out.println("in afterSuite"); } }
testNG.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1"> <test name="test1"> <classes> <class name="com.cib.testng.TestngAnnotation"/> </classes> </test> </suite>
程序运行的结果是:
[TestNG] Running:
D:\work_project1\TestNG\src\testNG.xml
in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
见上面的输出,TestNG是执行过程如下:
-
首先所有beforeSuite()方法只执行一次。
-
最后,afterSuite的()方法只执行一次。
-
即使方法 beforeTest(), beforeClass(), afterClass() 和afterTest() 方法只执行一次。
-
beforeMethod()方法执行每个测试用例,但在此之前执行的测试用例。
-
afterMethod()方法执行每个测试用例,但测试用例执行后。
-
In between beforeMethod() and afterMethod() each test case executes
TestNG-分组groups
TestNG可以执行复杂的测试方法分组。您不仅可以声明方法属于组,而且还可以指定包含其他组的组。然后可以在testng.xml配置一组特定的组,或同时排除另一组。
package com.kdzwy.practice; import org.testng.annotations.Test; /** * * <p> * Title: TestngGroups * </p> * * <p> * 对应配置文件testng-groups.xml * Description:使用groups进行分组测试,include和exclude的原则是保留最小集合, * </p> * * <p> * Company: * </p> * * @author : Dragon * * @date : 2014年10月13日 */ public class TestngGroups { @Test(groups = { "functest", "checkintest" }) public void testMethod1() { System.err.println("groups = { functest, checkintest }"); } @Test(groups = { "functest", "checkintest" }) public void testMethod2() { System.err.println("groups = { functest, checkintest }"); } @Test(groups = { "functest" }) public void testMethod3() { System.err.println("groups = { functest }"); } @Test(groups = { "checkintest" }) public void testMethod4() { System.err.println("groups = { checkintest }"); } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="framework_testng"> <test verbose="2" name="TestGroups"> <groups> <run> <include name="functest" /> </run> </groups> <classes> <class name="com.kdzwy.practice.TestngGroups" /> </classes> </test> </suite>
运行结果为:
[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG.xml
groups = { functest, checkintest }
groups = { functest, checkintest }
groups = { functest }
PASSED: testMethod1
PASSED: testMethod2
PASSED: testMethod3
排除组
testng.xml配置如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="framework_testng"> <test verbose="2" name="TestGroups"> <groups> <run> <include name="functest" /> <exclude name="checkintest" /> </run> </groups> <classes> <class name="com.kdzwy.practice.TestngGroups" /> </classes> </test> </suite>
[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG.xml
groups = { functest }
PASSED: testMethod3
===============================================
TestGroups
Tests run: 1, Failures: 0, Skips: 0
===============================================
===============================================
framework_testng
Total tests run: 1, Failures: 0, Skips: 0
群组
当我们的测试用例累积了很多以后,我们可能不需要测试之前的分组,只要测试刚刚写好的分组,这时候testng提供了一种新的配置方式,来实现这一功能,让测试人员只修改配置文件就完成测试
package com.kdzwy.practice; import org.testng.annotations.Test; /** * * <p> * Title: TestngGroupsOfGroups * </p> * * <p> * 参考配置文件:testng-groupsOfGroups.xml * Description:使用<define>标签将测试方法在组内再次进行分组并以name属性进行区分, * <run>通过define标签的name进行调用,以后修改测试直接修改run调用的名称即可 * * 注:<b>多个group测试时,xml文件dom顺序必须是'<groups>'标签必须在'<test>'标签内, 否则会 有空指针异常 * </p> * * <p> * Company: * </p> * * @author : Dragon * * @date : 2014年10月13日 */ public class TestngGroupsOfGroups { @Test(groups = { "windows.xp" }) public void testMethod5() { System.err.println("(groups = { windows.xp })"); } @Test(groups = { "windows.7" }) public void testMethod6() { System.err.println("(groups = { windows.7 })"); } @Test(groups = { "windows.8" }) public void testMethod7() { System.err.println("(groups = { windows.8 })"); } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="framework_testng"> <test verbose="2" name="TestGroupsOfGroups"> <groups> <define name="windows.xp"> <include name="windows.xp" /> </define> <define name="windows.7"> <include name="windows.7" /> </define> <define name="all"> <include name="windows.*" /> </define> <run> <include name="all" /> <exclude name="windows.7" /> </run> </groups> <classes> <class name="com.kdzwy.practice.TestngGroupsOfGroups" /> </classes> </test> </suite>
运行结果
[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_2.xml
(groups = { windows.xp })
(groups = { windows.8 })
PASSED: testMethod5
PASSED: testMethod7
===============================================
TestGroupsOfGroups
Tests run: 2, Failures: 0, Skips: 0
===============================================
===============================================
framework_testng
Total tests run: 2, Failures: 0, Skips: 0
===============================================
TestNG依赖测试
在TestNG的测试中,一个测试方法的执行往往需要依赖其他测试方法的先期或延后执行,这种测试方法的执行先后顺序就被称为测试方法之间的依赖关系。
1. 一个被依赖的测试方法
测试方法之间的依赖关系往往是在测试类中定义的,如下所示:
package com.kdzwy.practice; import org.testng.annotations.Test; public class TestDenpency { @Test public void serverStartedOk() { System.err.println("serverStartedOk()"); }//被依赖的测试方法 @Test(dependsOnMethods = { "serverStartedOk" }) public void method1() { System.err.println("method1()"); } }
程序的运行结果为:
[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse--1524391659\testng-customsuite.xml
serverStartedOk()
method1()
PASSED: serverStartedOk
PASSED: method1
2.多个被依赖的测试方法
一个测试方法可能依赖一个测试方法,也可能依赖多个测试方法。对于多个被依赖的测试方法,可以通过方法名直接给出,也可以通过组名给出被依赖的测试方法。
1) 在测试类中通过方法名给出被依赖的测试方法,示例如下:
package com.kdzwy.practice; import org.testng.annotations.Test; public class TestDenpency { @Test public void serverStartedOk() { System.err.println("serverStartedOk()"); }//被依赖的测试方法 @Test public void serverStartedOk2() { System.err.println("serverStartedOk2()"); }//被依赖的测试方法 @Test(dependsOnMethods = { "serverStartedOk","serverStartedOk2" }) public void method1() { System.err.println("method1()"); } }
运行的结果为
[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse--1841688552\testng-customsuite.xml
serverStartedOk()
serverStartedOk2()
method1()
PASSED: serverStartedOk
PASSED: serverStartedOk2
PASSED: method1
2) 在测试类中通过组名给出被依赖的测试方法,示例如下:
package com.kdzwy.practice; import org.testng.annotations.Test; public class TestDenpency { @Test(groups={"init"}) public void serverStartedOk() { System.err.println("serverStartedOk()"); }//被依赖的测试方法 @Test(groups={"init"}) public void serverStartedOk2() { System.err.println("serverStartedOk2()"); }//被依赖的测试方法 @Test(dependsOnGroups={"init"}) public void method1() { System.err.println("method1()"); } }
运行的结果为:
[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse-797151435\testng-customsuite.xml
serverStartedOk()
serverStartedOk2()
method1()
3) 在testng.xml配置文件中通过组名给出被依赖的测试方法,示例如下:
<test name="My Test"> <groups> <dependencies> <group name="c" depends-on="a b" /> <group name="d" depends-on="c" /> </dependencies> </groups> </test>
3.硬依赖(hard dependencies)与软依赖(soft dependencies)
顺利的情况下,被依赖的测试方法成功执行后,再执行当前测试方法。但是问题是被依赖的测试方法如果执行失败了呢?是否还要继续执行当前测试方法呢?
根据被依赖的测试方法执行失败时,是否执行当前测试方法,将依赖分为硬依赖和软依赖。对于硬依赖,被依赖的测试方法执行失败,则当前测试方法不执行,只是被标记为SKIP。对于软依赖,被依赖的测试方法执行失败,则当前测试方法继续执行。
不特别声明,默认是硬依赖,如上述示例都是硬依赖。
对于软依赖,在测试类中声明测试方法时,需要为@Test设置alwaysRun=true属性,示例如下:
TestNG参数化测试
package com.kdzwy.practice; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class ParameterizedTest1 { @Test @Parameters("myName") public void parameterTest(String myName) { System.out.println("Parameterized value is : " + myName); } }
在xml配置文件中传递参数
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1"> <test name="test1"> <parameter name="myName" value="manisha"/> <classes> <class name="com.kdzwy.practice.ParameterizedTest1" /> </classes> </test> </suite>
程序运行的结果是
[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_3.xml
Parameterized value is : manisha
TestNG 对testng.xml 的参数的类型指定的值会自动尝试转换。下面是支持的类型:
-
String
-
int/Integer
-
boolean/Boolean
-
byte/Byte
-
char/Character
-
double/Double
-
float/Float
-
long/Long
-
short/Short
传递参数与数据提供者
质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
package com.kdzwy.practice; public class PrimeNumberChecker { public Boolean validate(final Integer primeNumber) { for (int i = 2; i < (primeNumber / 2); i++) { if (primeNumber % i == 0) { return false; } } return true; } }
创建测试案例类
-
创建一个Java测试类 ParamTestWithDataProvider1.java.
-
定义方法primeNumbers(),其定义为DataProvider 使用注释。此方法返回的对象数组的数组。
-
测试方法testPrimeNumberChecker()添加到测试类中。此方法需要一个整数和布尔值作为输入参数。这个方法验证,如果传递的参数是一个素数。
-
添加注释 @Test(dataProvider = "test1") 到此方法。dataProvider的属性被映射到"test1".
package com.kdzwy.practice; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider1 { private PrimeNumberChecker primeNumberChecker; @BeforeMethod public void initialize() { primeNumberChecker = new PrimeNumberChecker(); } @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }; } // This test will run 4 times since we have 5 parameters defined @Test(dataProvider = "test1") public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { System.out.println(inputNumber + " " + expectedResult); Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); } }
程序的运行结果为:
[TestNG] Running: C:\Users\Administrator\AppData\Local\Temp\testng-eclipse-1286085733\testng-customsuite.xml 2 true 6 false 19 true 22 false 23 true PASSED: testPrimeNumberChecker(2, true) PASSED: testPrimeNumberChecker(6, false) PASSED: testPrimeNumberChecker(19, true) PASSED: testPrimeNumberChecker(22, false) PASSED: testPrimeNumberChecker(23, true)
实例 2
在这里,@DataProvider 传递对象作为参数。
创建Java类
创建一个Java类 Bean.java, 对象带有 get/set 方法, 在 C:\ > TestNG_WORKSPACE.
public class Bean { private String val; private int i; public Bean(String val, int i){ this.val=val; this.i=i; } public String getVal() { return val; } public void setVal(String val) { this.val = val; } public int getI() { return i; } public void setI(int i) { this.i = i; } }
创建测试案例类
-
创建一个Java测试类 ParamTestWithDataProvider2.java.
-
定义方法primeNumbers(),其定义为DataProvider使用注释。此方法返回的对象数组的数组。
-
添加测试类中测试方法TestMethod()。此方法需要对象的bean作为参数。
-
添加注释 @Test(dataProvider = "test1") 到此方法. dataProvider 属性被映射到 "test1".
import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider2 { @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { { new Bean("hi I am the bean", 111) } }; } @Test(dataProvider = "test1") public void testMethod(Bean myBean) { System.out.println(myBean.getVal() + " " + myBean.getI()); } }
hi I am the bean 111 =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 ===============================================
TestNG运行JUnit测试
创建JUnit测试用例类
创建一个Java类,这是一个JUnit测试类, TestJunit.java
package com.kdzwy.practice; import org.junit.Test; import static org.testng.AssertJUnit.assertEquals; public class TestJunit { @Test public void testAdd() { System.out.println("testAdd "); String str= "Junit testing using TestNG"; assertEquals("Junit testing using TestNG",str); } }
要执行JUnit测试用例定义属性 junit="true" 如上面的xml文件中. JUnit测试用例类TestJunit定义在类名。
JUnit 4中,TestNG将使用 org.junit.runner.JUnitCore 运行测试。
在这里,我已经放在了 junit-4.11.jar 在 C:\TestNG_WORKSPACE\lib\junit-4.11.jar下面.
验证输出。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Converted JUnit suite" >
<test name="JUnitTests" junit="true">
<classes>
<class name="com.kdzwy.practice.TestJunit" />
</classes>
</test>
</suite>
程序运行的结果是:
[TestNG] Running:
D:\work_project1\TestNG\src\com\kdzwy\practice\testNG_4.xml
testAdd
posted on 2018-06-25 14:14 luzhouxiaoshuai 阅读(187) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2017-06-25 c++教程网经典的c语音学习视频教程