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
TestNG学习笔记新的的更多相关文章
- es6学习笔记--新数据类型Symbol
学习了es6语法的symbol类型,整理笔记,闲时复习. Symbol 是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为 ...
- es6学习笔记--新数据结构Set,Map以及WeakSet,WeakMap
在javascript中,存储数据的方式大部分就是以数组或者对象形式存储的,es6出现了4种新集合Set,Map,WeakSet,WeakMap来存储数据,简化了编程. 集合--Set 类似于数组,但 ...
- TestNG—学习笔记2
关于TestNG,也是一边学一边总结,对于TestNG和Junit的比较其实也没有什么意义,都是一种测试框架,都是为了应用而生的东西,没有必要说谁好谁不好了.用的熟练用的好就是真的好啊. 下面简单的总 ...
- testNG 学习笔记 Day2 配置testNG自带的监听器
IntelliJ IDEA配置testNG自带的监听器的时候,操作如下菜单栏中 run ----> 下拉菜单中的 Edit Configurations ----> 新矿口中TeatNG下 ...
- testNG 学习笔记 Day 1 使用功能详解
TestSuite处理测试用例有6个规约(否则会被拒绝执行测试) A 测试用例必须是公有类(Public) B 测试用例必须继承与TestCase类 C 测试用例的测试方法必须是公有的( Public ...
- TestNG学习笔记目录
学习TestNG主要用于GUI自动化测试使用,学习目录随进度不断更新.文档内容主要是翻译官方doc,同时加入自己的理解和案例.如有理解偏差欢迎指正 一.TestNG Eclipse plug-in 安 ...
- testng学习笔记-- 场景和module
一.定义 TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Ge ...
- ArcGIS API for JavaScript 4.4学习笔记[新] AJS4.4和AJS3.21新特性
ESRI官网悄无声息突然更新4.4和3.21,公众号也没有什么消息.照例,给大家看看这次更新有什么新特性吧. 1. AJS 4.4 官方更新日志:点我,比较详细.我在这里抽一些主干作为说明. 1.1 ...
- ArcGIS API for JavaScript 4.3学习笔记[新] AJS4.3和AJS3.20新特性
今天"ArcGIS极客说"公众号推送了这两个大版本的更新,吓得我赶紧撸了一篇新博客. 这里就不写代码验证了,作为新特性小节简单介绍一下!~ AJS 4.3 1. 更强大的Featu ...
随机推荐
- 一、【python】机器学习基础
专有名词 机器学习 (machine learning) 预测分析 (predictive analytics) 统计学习 (statistical learning) 监督学习 (supervise ...
- 浅谈SIEM
一.概念 SIEM ( Security Information Event Management,安全信息与事件管理) Gartner的定义:安全信息和事件管理(SIEM)技术通过对来自各种事件和上 ...
- jupyter notebook 安装扩展nbextensions
安装nbextensions可提高jupyter notebook效率,安装步骤如下: 1.pip 方式安装: (gluon) [root@localhost ~]# pip install jupy ...
- Java实现 蓝桥杯VIP 算法训练 黑色星期五
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是"诸事不宜".请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期 ...
- Java实现 LeetCode 238 除自身以外数组的乘积
238. 除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元 ...
- Java实现 LeetCode 59 螺旋矩阵 II
59. 螺旋矩阵 II 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ...
- Java实现 LeetCode 4 寻找两个有序数组的中位数
寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- java实现第七届蓝桥杯七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- HashMap源码解析(java1.8.0)
1.1 背景知识 1.1.1 红黑树 二叉查找树可能因为多次插入新节点导致失去平衡,使得查找效率低,查找的复杂度甚至可能会出现线性的,为了解决因为新节点的插入而导致查找树不平衡,此时就出现了红黑树. ...
- Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to...异常处理
这个是打开Android Studio项目报的错误提示,单纯从上面的提示还是不能太直接的知道什么问题.后来我想这个项目的Gradle版本与我当前AS使用的版本不一致,可能是这个问题. 修改build. ...