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 ...
随机推荐
- (八)Filter&ThreadLocal实现处理事务
ConnectionContext.java package com.aff.bookstore.web; import java.sql.Connection; public class Conne ...
- NodeJS——模块全局安装路径配置以及关于supervisor的问题解释
下载安装NodeJS后,在自己选择的路径下会有如下的文件: 默认情况下NodeJS安装会同时安装npm(模块管理器:用于管理用户require的模块,有全局和本地两种). 注:全局:执行npm in ...
- string 去重复
//AABB>>AB //AAA>>A //ABBAA>ABA public static string SpiltString(stri ...
- JavaScript (四) js的基本语法 - - 函数练习、arguments、函数定义、作用域、预解析
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.函数练习 1.求最值 // - 求2个数中的最大值 function getMax(num1, nu ...
- Java实现 LeetCode 222 完全二叉树的节点个数
222. 完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集 ...
- Java实现 LeetCode 174 地下城游戏
174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来 ...
- Java实现 LeetCode 111 二叉树的最小深度
111. 二叉树的最小深度 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...
- java实现第六届蓝桥杯三羊献瑞
三羊献瑞 题目描述 观察下面的加法算式: 祥 瑞 生 辉 三 羊 献 瑞 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. ...
- 常见ie9兼容问题
公司项目要求需要兼容ie9,开发过程中遇到了许多问题,在这里记录一下,希望可以帮到其他需要的小伙伴. 浏览器兼容性问题无外乎三点,css样式兼容.JavaScript兼容及h5部分标签的兼容.主要介绍 ...
- CSS3弹性布局内容对齐(justify-content)属性使用详解
内容对齐(justify-content)属性应用在弹性容器上,把弹性项沿着弹性容器的主轴线(main axis)对齐. 该操作发生在弹性长度以及自动边距被确定后. 它用来在存在剩余空间时如何加以分配 ...