Testng注解介绍:
配置注解的作用:用于完成测试前的准备工作【用在方法上面】
@BeforeSuite /@AfterSuite 标记的方法:在某个测试套件(suite)开始之前运行/在某个测试套件所有测试方法执行之后运行
@BeforeTest/@AfterTest标记的方法:在某个测试(test)开始之前运行/在某个测试下的所有测试类中的测试方法执行之后运行
@BeforeClass/@AfterClass标记的方法:在某个测试类(class)开始之前运行/在某个测试类中的所有测试方法执行之后运行
@BeforeMethod/@AfterMethod标记的方法:在某个测试方法(method)之前运行/在某个测试方法执行之后运行
代码演示注解使用:
1 注解作用再方法上面:不能空着写,否则其实就是作用在同一个方法上
package com.lemon.testng;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeSuite;
public class TestngDemo {
@BeforeSuite
//这里空白
@Test
public void test() {
System.out.println("这是一个测试方法");
}
}
比如上面代码, @BeforeSuite和@Test其实都是作用在test方法上的
2 同一个方法上可以有多个注解
package com.lemon.testng;
import org.testng.annotations.Test;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
public class TestngDemo {
@Test
@BeforeSuite
@AfterSuite
public void test() {
System.out.println("这是一个测试方法");
}
}
3 @BeforeSuite注解:用的最多 -----方法执行之前执行
与之对应的就是:@AfterSuite----方法执行之后执行
package com.lemon.testng;
import org.testng.annotations.Test;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
public class TestngDemo {
@BeforeSuite
public void init() {
//做初始化的工作
//如:1 文件的加载,统一的加载execl 2.解析properties文件
System.out.println("方法执行之前我要做一些初始化");
}
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@AfterSuite
public void finish() {
//资源释放
//如:统一回写excel
System.out.println("方法执行结束我要释放资源了");
}
}
4 @BeforeTest/AfterTest
package com.lemon.testng;
import org.testng.annotations.Test;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class TestngDemo {
@BeforeSuite
public void init() {
//做初始化的工作
//如:1 文件的加载,统一的加载execl 2.解析properties文件
System.out.println("方法执行之前我要做一些初始化");
}
@BeforeTest
public void btest() {
System.out.println("方法执行之前我要对模块初始化");
}
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@AfterTest
public void atest() {
System.out.println("方法执行结束了--模块执行结束");
}
@AfterSuite
public void finish() {
//资源释放
//如:统一回写excel
System.out.println("方法执行结束我要释放资源了");
}
}
5 @BeforeClass/AfterClass
package com.lemon.testng;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class TestngDemo {
@BeforeSuite
public void init() {
//做初始化的工作
//如:1 文件的加载,统一的加载execl 2.解析properties文件
System.out.println("方法执行之前我要做一些初始化");
}
@BeforeTest
public void btest() {
System.out.println("方法执行之前我要对模块初始化");
}
@BeforeClass
public void ctest() {
System.out.println("类初始化");
}
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@AfterClass
public void actest() {
System.out.println("类执行完毕");
}
@AfterTest
public void atest() {
System.out.println("方法执行结束了--模块执行结束");
}
@AfterSuite
public void finish() {
//资源释放
//如:统一回写excel
System.out.println("方法执行结束我要释放资源了");
}
}
6 @BeforeMethod/@AfterMethod---作用在有注解的方法上,没有注解的方法是不行的
如果有多个注解方法,那么@BeforeMethod/@AfterMethod会被执行多次
package com.lemon.testng;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
public class TestngDemo {
@BeforeSuite
public void init() {
// 做初始化的工作
// 如:1 文件的加载,统一的加载execl 2.解析properties文件
System.out.println("方法执行之前我要做一些初始化");
}
@BeforeTest
public void btest() {
System.out.println("方法执行之前我要对模块初始化");
}
@BeforeClass
public void ctest() {
System.out.println("类初始化");
}
@BeforeMethod
public void mtest() {
System.out.println("方法初始化");
}
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@AfterMethod
public void amtest() {
System.out.println("方法执行完毕");
}
@AfterClass
public void actest() {
System.out.println("类执行完毕");
}
@AfterTest
public void atest() {
System.out.println("方法执行结束了--模块执行结束");
}
@AfterSuite
public void finish() {
// 资源释放
// 如:统一回写excel
System.out.println("方法执行结束我要释放资源了");
}
}
上述代码执行:
[RemoteTestNG] detected TestNG version 6.9.9
[TestNG] Running:
C:\Users\TF\AppData\Local\Temp\testng-eclipse--1600931492\testng-customsuite.xml
方法执行之前我要做一些初始化
方法执行之前我要对模块初始化
类初始化
方法初始化
这是一个测试方法
方法执行完毕
类执行完毕
方法执行结束了--模块执行结束
PASSED: test
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================
方法执行结束我要释放资源了
===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 405 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 4834 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 1 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 202 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 2028 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 205 ms
注意:导包不要导错了
如:import org.junit.BeforeClass;这个是不对的
import org.testng.annotations.BeforeClass;这个才是对的
必须是org.testng.annotations这个包下面的,如果导的是org.junit,Run as->会有Junit Test
7 依赖测试:-----基本不这么用
dependsOnMethods:测试方法依赖于某方法
被依赖的方法必须加注解,否则不被testNG框架识别
package com.lemon.testng;
import org.testng.annotations.Test;
public class TestngDependency {
@Test
public void test() {
System.out.println("我要先执行,否则dependencyTest不能被执行");
}
@Test(dependsOnMethods="test")
public void dependencyTest() {
System.out.println("test被执行ok,我才能执行");
}
}
8 忽略测试:------用的比较少
当我们在测试的过程中,因为某些方面的原因,比如测试方法没有写完,或者有问题,我们暂时希望它不执行,我们就可以添加忽略设置跳过方法的执行
@Test(enabled=false)
package com.lemon.testng;
import org.testng.annotations.Test;
public class TestngDependency {
@Test
public void test() {
System.out.println("我要先执行,否则dependencyTest不能被执行");
}
@Test(dependsOnMethods="test")
public void dependencyTest() {
System.out.println("test被执行ok,我才能执行");
}
}
执行上述代码: aaa()方法没有被执行
事实上只要不加注解,该方法也是不被执行的【所以 @Test(enabled=false)这个注解用的比较少】
9 .参数化测试(数据驱动测试):------用的多,比较重要
TestNG可以通过两种方式向测试方法传递参数:
1.利用test.xml定义parameter
2.利用DataProviders
1)test.xml定义parameter
局限性:通过parameters注入的参数必须定义在testng.xml中且值是固定的
testngParameters.java文件:
package com.lemon.testng;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class testngParameters {
@Test
//value={};注解接收参数的格式
@Parameters(value= {"type","version"})
public void test( String type ,String version) {
System.out.println(type);
System.out.println(version);
}
}
testng.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="项目名" parallel="false">
<test name="功能模块">
<classes>
<class name="com.lemon.testng.TestNgDemo"/>
<class name="com.lemon.testng.testngParameters"/>
</classes>
</test>
<!-- <test name="功能模块2">
<classes>
<class name="com.lemon.testng.TestNgDemo2"/>
</classes>
</test>-->
<!-- 参数化 -->
<parameter name="type" value="ie"></parameter>
<parameter name="version" value="3"></parameter>
</suite>
执行testngParameters.java不能右键Run as ->TestNG suit ,会执行失败【Parameter 'type' is required by @Test on method test but has not been marked @Optional or defined】,只能通过执行testng.xml运行testngParameters.java
2 )利用DataProviders
1. @Test(dataProvider="d")和 @DataProvider(name="d") 要保持一致
一般都会取比较有意义的名字,或者和方法名一致,如这里是datas(),但是为了更好理解两个方法之间是怎么关联的,我这里取为d,和方法名区分开了
2. 此注解的方法返回值必须是:Object[][]或者Iterator<Object[]>
3.参数个数,类型必须匹配
4 参数可接收集合,自定义类型
TestngDataProvider.java文件:
package com.lemon.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestngDataProvider {
@Test(dataProvider="d")
public void login(String username ,String pwd) {
System.out.println("测试登录接口");
System.out.println( "打印登录信息"+username+" "+pwd);
}
@DataProvider(name="d")
public Object[][] datas(){
Object[][] array= {{"13333333333","123456"},{"133333333332","234567"},{"13333333334","345678"}};
Object[][] array2=new Object[3][2];//[接口执行3次][接口需要传2个参数]
return array;
}
}
上述代码执行结果:
[RemoteTestNG] detected TestNG version 6.9.9
[TestNG] Running:
C:\Users\TF\AppData\Local\Temp\testng-eclipse--1917703028\testng-customsuite.xml
测试登录接口
打印登录信息13333333333 123456
测试登录接口
打印登录信息133333333332 234567
测试登录接口
打印登录信息13333333334 345678
PASSED: login("13333333333", "123456")
PASSED: login("133333333332", "234567")
PASSED: login("13333333334", "345678")
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 405 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 4831 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 204 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 2026 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 203 ms
10 ITestContext----测试上下文,缓存,数据存储会用到------了解知识
说明: 参数化和数据支持不能同时使用
package com.lemon.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class TestngDataProvider {
@Test(dataProvider="d")
@Parameters(value= {"type","version"})
public void login(String username ,String pwd ,String type,String version) {
System.out.println("测试登录接口");
System.out.println( "打印登录信息"+username+" "+pwd);
}
@DataProvider(name="d")
public Object[][] datas(){
Object[][] array= {{"13333333333","123456"},{"133333333332","234567"},{"13333333334","345678"}};
Object[][] array2=new Object[3][2];//[接口执行3次][接口需要传2个参数]
return array;
}
}
上面代码虽然没有出现编译错误,但是运行时会报错:
[RemoteTestNG] detected TestNG version 6.9.9
[TestNG] Running:
C:\Users\TF\AppData\Local\Temp\testng-eclipse-411092288\testng-customsuite.xml
FAILED: login
org.testng.TestNGException:
The data provider is trying to pass 2 parameters but the method com.lemon.testng.TestngDataProvider#login takes 4 and TestNG is unable in inject a suitable object
at org.testng.internal.Invoker.injectParameters(Invoker.java:1249)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1118)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
at org.testng.internal.Invoker.injectParameters(Invoker.java:1245)
... 17 more
===============================================
Default test
Tests run: 1, Failures: 1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================
提示缺少2个参数,默认还是使用的时数据支持
网友评论