章节十六、5-TestNG高级功能--Part2
一、测试用例的依赖关系--->(dependsOnMethods = {"依赖方法名"})
1、在实现自动化的过程中,有些测试用例必须在其它测试用例执行之后才能运行,两者之间存在一定依赖关系。
2、案例演示场景:
testMethod1需要依赖testMethod2执行后才能顺利执行,而testMethod2需要依赖testMethod3执行完成后才能继续执行;
testMethod4是独立的testcase。
package testclasses; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestNG_DependentTests { /*
* 场景:testMethod1需要依赖testMethod2执行后才能顺利执行,而testMethod2需要依赖testMethod3执行完成后才能继续执行;
* testMethod4是独立的testcase。
*/ @Test(dependsOnMethods = {"testMethod2"})
public void testMethod1() {
System.out.println("testMethod1");
} @Test
public void testMethod2() {
System.out.println("testMethod2");
} @Test(dependsOnMethods = {"testMethod1"})
public void testMethod3() {
System.out.println("testMethod3");
} @Test
public void testMethod4() {
System.out.println("testMethod4");
} @BeforeClass
public void beforeClass() {
System.out.println("BeforeClass");
} @AfterClass
public void afterClass() {
System.out.println("AfterClass");
}
}
运行结果:
从运行结果可以看出testMethod1需要依赖testMethod2,所以在testMethod1执行前,testMethod2就先执行了,但testMethod1执行完成后,testMethod3才开始执行。而testMethod4因为是独立的,不需要依赖任何的testMethod,所以在testMethod2执行完成后就立即执行了。

3、如果在运行代码的过程中,被依赖的方法出现了错误,那么其它需要依赖该方法的方法就会t跳过不执行,如果需要被执行就在注解后面加上alwaysRun=true。

二、禁用测试方法
1、如果需要禁止某个test执行,在注解后面加上(enabled=false)即可。
package testclasses; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestNG_EnableTimeout { // Enable=false:带有次属性的方法不会执行
@Test(enabled=false)
public void testMethod1() {
System.out.println("testMethod3");
} @Test
public void testMethod2() {
System.out.println("testMethod4");
} @BeforeClass
public void beforeClass() {
System.out.println("Before Class");
} @AfterClass
public void afterClass() {
System.out.println("After Class");
}
}
运行结果:从运行结果可知testMethod1因为加上了(enabled=false),因为未执行,所以在结果中没有显示。

四、让测试方法超时
1、如果我们对test运行时间有要求,那么可以通过在注解后面加上(timeOut=100)进行设置,如果被设置的test在timeOut设置的时间内未运行完成就会立即失败并停止运行。
timeOut=100表示对test设置的限制时间为100毫秒,超过则失败。
package testclasses; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestNG_EnableTimeout { // Enable=false:带有此属性的方法不会执行
// Enable=true:带有此属性的方法会执行
@Test(enabled=true)
public void testMethod1() {
System.out.println("testMethod3");
} @Test(timeOut=10)
public void testMethod2() throws InterruptedException {
System.out.println("testMethod4");
Thread.sleep(20);
} @BeforeClass
public void beforeClass() {
System.out.println("Before Class");
} @AfterClass
public void afterClass() {
System.out.println("After Class");
}
}
运行结果:testMethod2设置了强制等待20毫秒,而注解中设置的超时时间为10秒,因此testMethod2执行失败。

五、维持测试用例的执行顺序
1、案例场景:我们有2个测试类都需要执行,分别取名为TestNG_Preserve1和TestNG_Preserve2,但是TestNG_Preserve2要在TestNG_Preserve1执行前先执行。
2、TestNG_Preserve1的代码为:
package testclasses;
import org.testng.annotations.Test;
public class TestNG_Preserve1 {
@Test
public void testMethod1() {
System.out.println("TestNG_Preserve1----->testMethod1");
}
@Test
public void testMethod2() throws InterruptedException {
System.out.println("TestNG_Preserve1----->testMethod2");
}
}
3、TestNG_Preserve2的代码为:
package testclasses;
import org.testng.annotations.Test;
public class TestNG_Preserve2 {
@Test
public void testMethod1() {
System.out.println("TestNG_Preserve2----->testMethod1");
}
@Test
public void testMethod2() throws InterruptedException {
System.out.println("TestNG_Preserve2----->testMethod2");
}
}
4、控制test类的执行顺序我们需要用到XML文件,配置如下:
<!-- 没有此行配置运行时会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Preserve Enable TestSuite">
<!-- preserve-order用于设置test中的class是否按照顺序执行,如果为false测按照类名字母的原有顺序执行,为true就按照书写的顺序执行 -->
<test
name="Test 1"
preserve-order="true">
<classes>
<class name="testclasses.TestNG_Preserve2"></class>
<class name="testclasses.TestNG_Preserve1"></class>
</classes>
</test>
<!-- enabled用于控制该test是否执行,默认为true执行,为false不执行 -->
<test
name="Test 2"
enabled="false">
<classes>
<class name="testclasses.TestNG_Preserve2"></class>
<class name="testclasses.TestNG_Preserve1"></class>
</classes>
</test>
</suite>
<!-- 预期执行结果:Test1中TestNG_Preserve2先执行,然后执行TestNG_Preserve2,Test2中的代码因为被设置为enable为false,因此不会执行 -->
执行结果:预期结果和实际结果一致

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。
内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。
欢迎关注,转载请注明来源。
章节十六、5-TestNG高级功能--Part2的更多相关文章
- 章节十六、4-TestNG高级功能--把测试方法分优先级、分组执行
一. 把测试方法分优先级执行----->(priority=索引) 1.新建一个testng方法 package testclasses; import org.testng.annotatio ...
- 章节十六、3-TestNG方法和类注解
一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有1 ...
- 章节十六、1-TestNG简介
一.TestNG 介绍 1.TestNG 是一个来自 JUnit 和 NUnit 的测试框架,它具拥有更多的功能,提高了 执行的效率. 2.TestNG 是一个开源的自动化测试框架 去除了老框架的大部 ...
- 章节十六、10-TestNG报告和日志
一.在进行自动化的过程中,日志一般采用log4j 2进行日志记录,但TestNG自己本身也带有日志记录功能(reporter),它的好处在于日志中记录的内容都是testng自动生成的. package ...
- Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 章节十六、2-TestNG注解和断言
一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...
- 章节十六、6-xml参数化and并行case
一.读取xml文件中参数 1.案例演示--->创建一个需要读取数据的类 package testclasses; import org.testng.annotations.Test; impo ...
- 章节十六、7-DataProviders
一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...
- 章节十六、8-ITestResult接口
一.ITestResult:该接口就像一个监听器,能够监听每个方法执行后的状态(是否成功)并将结果返回给我们. package testclasses1; import org.testng.anno ...
随机推荐
- 数组(ArrayPool数组池、Span<T>结构)
前言 如果需要使用相同的类型的多个对象,就可以使用集合和数组,这一节主要讲解数组,其中会重点涉及到Span<T>结构和ArrayPool数组池.我们也会先涉及到简单的数组.多维数组.锯齿数 ...
- 请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天。
请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天. #include <stdio.h> int main() { /* 定义需要计算的日期 ...
- 对于HTTP过程中POST内容加密的解决方案
0x00前言 前几天我师傅和我提及了这件事情 正常情况下 抓包过程中遇到加密情况会很迷茫 昨天把这个都弄了一下 也感谢大佬中间的指导 我一开始看到密码的类型下意识的是base64 但是去解密发现不对 ...
- css3加js做一个简单的3D行星运转效果
前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...
- Spring cloud Feign不支持对象传参解决办法[完美解决]
spring cloud 使用 Feign 进行服务调用时,不支持对象参数. 通常解决方法是,要么把对象每一个参数平行展开,并使用 @RequestParam 标识出每一个参数,要么用 @Reques ...
- 对vue中nextTick()的理解及使用场景说明
异步更新队列: 首先我们要对vue的数据更新有一定理解: vue是依靠数据驱动视图更新的,该更新的过程是异步的. 即:当侦听到你的数据发生变化时, Vue将开启一个队列(该队列被Vue官方称为异步更新 ...
- NOIP 2018旅行题解
从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个 ...
- 【POJ - 2236】Wireless Network (并查集)
Wireless Network 这接翻译了 Descriptions 地震发生在东南亚.ACM(亚洲合作医疗团队)已经与膝上电脑建立了无线网络,但是一次意外的余震袭击,网络中的所有计算机都被打破了. ...
- 为什么建立数据仓库需要使用ETL工具?
在做项目时是不是时常让客户有这样的困扰: 1.开发时间太长 2.花费太多 3.需要太多资源 4.集成多个事务系统数据总是需要大量人力成本 5.找不到合适的技能和经验的人 6.一旦建立,数据仓库无法足够 ...
- java并发编程(十八)----(线程池)java线程池框架Fork-Join
还记得我们在初始介绍线程池的时候提到了Executor框架的体系,到现在为止我们只有一个没有介绍,与ThreadPoolExecutor一样继承与AbstractExecutorService的For ...