testNG的使用
1.testNG的注解与属性
@BeforeSuite:在该套件的所有的测试都运行在注解方法之前,仅运行一次 @AfterSuite:在该套件的所有的测试都运行在注解方法之后,仅运行一次
@BeforeClass:在调用当前类的第一个测试方法之前运行,注解方法仅运行一次 @AfterClass:在调用当前类的第一个测试方法之后运行,注解方法仅运行一次
@BeforeTest:注解方法将在属于<test>标签的类的所有测试方法运行之前运行 @AfterTest:注解方法将在属于<test>标签的类的所有测试方法运行之后运行
@BeforeMethod:注解方法将在每个测试方法之前运行 @AfterMethod:注解方法将在每个测试方法之后运行
@Test:将类和方法标记为测试的一部分
@DataProvider 标记一种方法来提供测试方法的数据,注解方法必须返回一个Object[][],其中每个Object[]可以被分配给测试方法的参数列表。要从该DataProver接收数据的@Test方法,就需要使用与此注解名称相等的dataProvider名称
dataProvider 选定传入参数的构造器
enabled: 默认为true,如果指定为false,则表示不执行该测试方法
groups:指定该测试方法所属的组,可以指定多个组,以逗号隔开
invocationCount:指测试方法需要被调用的次数
priority:测试方法优先级设置,数值越低,优先级越高
下面举例:
package testng; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class Annotations { @BeforeSuite public void beforeSuite() { System.out.println("beforeSuite......."); } @BeforeMethod public void beforeMethod() { System.out.println("beforeMethod......."); } @BeforeClass public void beforeClass() { System.out.println("beforeClass......."); } @BeforeTest public void beforeTest() { System.out.println("beforeTest......."); } @Test public void test1() { System.out.println("这是第一个测试......"); Assert.assertEquals(add(1,1), 2); } @Test public void test2() { System.out.println("这是第二个测试......"); } @AfterTest public void afterTest() { System.out.println("afterTest......"); } @AfterClass public void afterClass() { System.out.println("afterClass......"); } @AfterMethod public void afterMethod() { System.out.println("afterMethod......"); } @AfterSuite public void afterSuite() { System.out.println("afterSuite......"); } public int add(int i,int j){ return i+j; } }
结果输出如下:
beforeSuite.......
beforeTest.......
beforeClass.......
beforeMethod.......
这是第一个测试......
afterMethod......
beforeMethod.......
这是第二个测试......
afterMethod......
afterClass......
afterTest......
PASSED: test1
PASSED: test2
===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================
afterSuite......
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
[TestNG] Time taken by org.testng.reporters.jq.Main@156643d4: 24 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@7d6f77cc: 5 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@5d22bbb7: 6 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1c4af82c: 23 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 1 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@69222c14: 2 ms
2.套件测试
测试套件是用来串联测试用例脚本的,可以通过灵活配置来执行想要执行的测试用例脚本,通俗的讲,就是将一个或者多个测试用例(测试类)放在一起运行,也称为套件测试
目前文件结构如下:
在testng文件夹下创建第一个类,类名为TestSuiteDemo1,
具体代码如下:
package testng; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; public class TestSuiteDemo1 { @Test public void f() { System.out.println("this is TestSuiteDemo1 testcase"); } @BeforeClass public void beforeClass() { System.out.println("this is beforeClass"); } @AfterClass public void afterClass() { System.out.println("this is afterClass"); } }
在testng文件夹下创建第二个类,类名为TestSuiteDemo2具体代码如下:
package testng; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; public class TestSuiteDemo2 { @Test public void f() { System.out.println("this is TestSuiteDemo1 testcase"); } @BeforeClass public void beforeClass() { System.out.println("this is beforeClass"); } @AfterClass public void afterClass() { System.out.println("this is afterClass"); } }
然后右键工程>>TestNG>>Convert to TestNG 生成一个testng.xml文件,具体代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" verbose="1" parallel="false" thread-count="1"> <test name="Test"> <classes> <!-- 套件测试类示例代码1 --> <class name="testng.TestSuiteDemo1"/> <!-- 套件测试类示例代码2 --> <class name="testng.TestSuiteDemo2"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
代码解析:suit为根节点且只能有一个,name属性为必需属性,verbose的意思是在控制台中如何输出,一般值为1,不写也可以,parallel的意思是使用多线程编程,通过thread-count属性可以设置线程数
直接运行这个xml文件,会运行class为testng.TestSuiteDemo1和testng.TestSuiteDemo2中的所有测试方法,运行结果如下:
[TestNG] Running:
F:\auto_ceshi\javaProject\src\testng\testng.xml
this is beforeClass
this is TestSuiteDemo1 testcase
this is afterClass
this is beforeClass
this is TestSuiteDemo1 testcase
this is afterClass
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
3.忽略测试
有时我们编写的测试用例脚本未开发完全,不具备执行测试的条件,就需要等功能健壮或则脚本开发完成之后再去执行测试,这是就可以使用注解@Test(enabled=false)禁用不想执行的测试用例
创建一个名为TestIgnore的类,具体代码如下:
package testng; import org.testng.annotations.Test; public class TestIgnore { //忽略测试 默认enable=true @Test public void test1() { System.out.println("这条测试用例会被执行"); } @Test(enabled=false) public void test2() { System.out.println("enbaled=true时,这条测试用例会被执行"); } @Test(enabled=true) public void test3() { System.out.println("这条测试用例会被执行"); } }
输出结果如下:
这条测试用例会被执行
这条测试用例会被执行
PASSED: test1
PASSED: test3
4.分组测试
创建一个名为TestGroup的类,具体代码如下:
package testng; import org.testng.annotations.Test; public class TestGroup { //分组测试 @Test(groups="group1") public void test1() { System.out.println("我是第一组读者"); } @Test(groups="group3") public void test2() { System.out.println("我是第三组读者"); } @Test(groups="group3") public void test3() { System.out.println("我是第三组读者"); } @Test(groups="group1") public void test4() { System.out.println("我是第一组读者"); } @Test(groups="group1") public void test5() { System.out.println("我是第一组读者"); } @Test(groups="group1") public void test6() { System.out.println("我是第一组读者"); } }
testng.xml文件中添加如下代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="1" parallel="false" thread-count="1">
<test name="Test">
<groups>
<run>
<!-- 只包含一组 -->
<include name="group1"></include>
<!-- 除了三组 -->
<exclude name="group3"></exclude>
</run>
</groups>
<classes>
<!-- 分组测试 -->
<class name="testng.TestGroup"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
代码解析:
groups标签是分组,run标签是执行,include标签是包含,exclude标签是不包含
输出结果如下:
我是第一组读者
我是第一组读者
我是第一组读者
我是第一组读者
5.异常测试
异常测试是在单元测试中一个非常重要的环节,即全路径的覆盖测试,用于验证程序的健壮性和可靠性,比如接口测试中传入某些不合法的参数,程序就会抛出异常,在程序中我们期望得到某种类型的异常的时候,就需要用到异常测试,通过@Test(expected=""Expection.class)来指定必须抛出某种类型的异常,如果没有抛出异常,测试就会失败
package testng; import org.testng.annotations.Test; public class TestException { @Test(expectedExceptions=NullPointerException.class) public void f() { throw new NullPointerException(); } }
6.依赖测试
有时需要测试方法按照特定的顺序被调用,这个时候需要使用@Test注解的dependsOnMethod参数来指定所依赖的方法
创建一个测试类,名为TestDependsOnGroups,具体代码如下:
public class TestDependsOnGroups { //依赖测试示例 在test1执行前先执行test2和test3 @Test(dependsOnMethods={"test2","test3"}) public void test1() { System.out.println("test1执行了"); } @Test public void test2() { System.out.println("test2执行了"); } @Test public void test3() { System.out.println("test3执行了"); } }
运行结果如下:
test2执行了
test3执行了
test1执行了
PASSED: test2
PASSED: test3
PASSED: test1
7.参数话测试
TestN中常用的有@Parameters 和DataProvider两种注解
第一种@Parameter
创建一个测试类,名为TestParam,代码如下
package testng; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class TestParam { @Parameters({"username","password"}) @Test public void f(String username,String password) { System.out.println(username+"t"+password); } }
然后在testng.xml文件中添加下面代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" verbose="1" parallel="false" thread-count="1">
<test name="Test">
<parameter name="username" value="dandan"></parameter>
<parameter name="password" value="12345678"></parameter>
<classes>
<class name="testng.TestParam"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
运行结果如下:
dandant12345678
第二种 @DataProvider
创建一个类,名为TestLogin,具体代码如下:
package testng; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestLogin { @Test(dataProvider="testlogin") public void testlogin(String username,String password) { System.out.println("用户名为"+username+" "+"密码为"+password); } @DataProvider(name="testlogin") public Object[][] testlogin(){ return new Object[][]{ {"","12345678"},{"dandan",""},{"dandan","12345678"} }; } }
输出结果为:
用户名为 密码为12345678
用户名为dandan 密码为
用户名为dandan 密码为12345678
PASSED: testlogin("", "12345678")
PASSED: testlogin("dandan", "")
PASSED: testlogin("dandan", "12345678")
原文地址:https://www.cnblogs.com/cdd9162/p/15012008.html
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- 数据库安全·数据加密
- Medium网友开发了一款应用程序 让学习算法和数据结构变得更有趣
- 数据库安全·Token 认证
- 数据库安全·用户/角色认证
- 防止在训练模型时信息丢失 用于TensorFlow、Keras和PyTorch的检查点教程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
- Java虚拟机运行时数据区精华总结
- 剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
- 剑指Offer LeetCode 面试题40. 最小的k个数
- 剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
- 解决Ajax发送DELETE请求时后台无法接收到参数的问题(Restful风格)
- 解决layui的table数据重载reload where参数会保留上次条件的问题
- 终于弄懂了Layui表格重载数据
- 剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
- 剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
- 剑指Offer LeetCode 面试题15. 二进制中1的个数
- 剑指Offer LeetCode 面试题11. 旋转数组的最小数字
- 剑指Offer 面试题09. 用两个栈实现队列
- 剑指Offer 面试题06. 从尾到头打印链表
- 剑指Offre 面试题05. 替换空格