一、Test Suite(测试套件)

我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有10个,我们需要创建不同的类来测试这10个页面的具体功能,测试具体功能的测试用例会放到具体的测试类中,把这些所有的测试类组合起来就成了Test Suite。可以根据我们的测试目的,选择一些类来组成Test Suite。可以选择一些基本功能的测试类,组成冒烟测试的测试类,冒烟测试可以快速的检验软件的基本功能,也可以选择一些测试类组成回归测试的test suite。

二、Test Suite案例演示----》如何一次运行多个测试类

1、首先新建两个testcase

 package testclasses;

 import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass; public class TestNG_TestClass1 { @BeforeClass
public void beforeClass() {
System.out.println("\nClass1-->beforeMethod在类里所有的方法运行前跑");
} @AfterClass
public void afterClass() {
System.out.println("\nClass1-->afterClass在类里所有的方法运行后跑\n");
} @BeforeMethod
public void beforeMethod() {
System.out.println("\nClass1-->BeforeMethod每个测试方法运行前跑");
} @AfterMethod
public void afterMethod() {
System.out.println("\nClass1-->afterMethod每个测试方法运行后跑");
} @Test
public void test1() {
System.out.println("\nClass1-->test1测试方法");
} @Test
public void test2() {
System.out.println("\nClass1-->test2测试方法");
}
}
 package testclasses;

 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; public class TestNG_TestClass2 { @BeforeClass
public void beforeClass() {
System.out.println("\nClass2-->beforeMethod在类里所有的方法运行前跑");
} @AfterClass
public void afterClass() {
System.out.println("\nClass2-->afterClass在类里所有的方法运行后跑\n");
} @BeforeMethod
public void beforeMethod() {
System.out.println("\nClass2-->BeforeMethod每个测试方法运行前跑");
} @AfterMethod
public void afterMethod() {
System.out.println("\nClass2-->afterMethod每个测试方法运行后跑");
} @Test
public void test1() {
System.out.println("\nClass2-->test1测试方法");
} @Test
public void test2() {
System.out.println("\nClass2-->test2测试方法");
}
}

2、新建一个xml文件

xml是标记型语言,是一种简单的数据存储语言,用一系列简单的标记来描述数据,把数据放在标签中。

<!-- 没有此行配置运行时会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- name中的值表示命名,可随意命名 -->
<suite name="Regression TestSuite">
<!-- name中的值表示命名,可随意命名 -->
<test name="Application Test">
<!-- name中的值为需要测试的具体类名,格式:包名.类名 -->
<classes>
<class name="testclasses.TestNG_TestClass1"></class>
<class name="testclasses.TestNG_TestClass2"></class>
</classes>
</test>
</suite>

3、运行结果成功:

从运行结果中可以看出,当我们在配置完xml文件后,直接运行xml文件,2个testcase就能够一起运行成功了

三、@BeforeSuite和@AfterSuite

@BeforeSuite:表示在test suite中的所有测试类在执行前就先运行带有该注解方法中的代码。

@AfterSuite:表示在test suite中的所有测试类执行完成后再运行带有该注解方法中的代码。

1、新建一个带有@BeforeSuite和@AfterSuite注解的类

 package base;

 import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite; public class BaseTestSuite { @BeforeClass
public void beforeClasss() {
System.out.println("\nBaseTestSuite-->beforeClass在每个测试类运行前跑");
} @AfterClass
public void afterClasss() {
System.out.println("\nAfterClass-->afterClass在每个测试类运行完成后跑\n");
} @BeforeSuite
public void beforeSuite() {
System.out.println("\nBeforeSuite-->beforeSuite在每个test suite运行前跑");
} @AfterSuite
public void afterSuite() {
System.out.println("\nBeforeSuite-->beforeSuite在每个test suite运行完成后跑\n");
}
}

2、让test suite中的TestNG_TestClass1类和TestNG_TestClass2类继承新建的类BaseTestSuite 。

3、运行xml配置文件

<!-- 没有此行配置运行时会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- name中的值表示命名,可随意命名 -->
<suite name="Regression TestSuite">
<!-- name中的值表示命名,可随意命名 -->
<test name="Application Test">
<!-- name中的值为需要测试的具体类名,格式:包名.类名 -->
<classes>
<class name="regressionsuite.TestNG_TestClass1"></class>
<class name="regressionsuite.TestNG_TestClass2"></class>
</classes>
</test>
</suite>

4、运行结果

从运行结果中我们可以看出,@BeforeSuite和@AfterSuite分别只在所有的test suite运行前和介绍后运行一次

四、@BeforeTest和@AfterTest注解

@BeforeTest:使用这个注解的方法会在xml文件中的test标签中的每个test方法运行之前运行。

@AfterTest:使用这个注解的方法会在xml文件中的test标签中的每个test方法运行之后运行。

 <!-- 没有此行配置运行时会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- name中的值表示命名,可随意命名 -->
<suite name="Regression TestSuite">
<!-- name中的值表示命名,可随意命名 -->
<test name="Application Test">
<!-- name中的值为需要测试的具体类名,格式:包名.类名 -->
<classes>
<class name="regressionsuite.TestNG_TestClass1"></class>
<class name="regressionsuite.TestNG_TestClass2"></class>
</classes>
</test> <test name="Application Test">
<!-- name中的值为需要测试的具体类名,格式:包名.类名 -->
<classes>
<class name="regressionsuite.TestNG_TestClass1"></class>
<class name="regressionsuite.TestNG_TestClass2"></class>
</classes>
</test>
</suite>

五、@BeforeClass和@AfterClass注解

@BeforeClass:使用这个注解的方法会在当前这个类的第一个test方法运行之前运行。

@AfterClass:使用这个注解的方法会在当前这个类的最后一个test方法运行之后运行。

六、@BeforeMethod和@AfterMethod注解

@BeforeMethod:使用这个注解的方法会在每个test方法运行之前运行。

@AfterMethod:使用这个注解的方法会在每个test方法运行之后运行。

注:带@BeforeTest和@AfterTest、@BeforeSuite和@AfterSuite注解的方法不能在类中直接运行(直接运行会报如下图所示的错误信息),必须在xml中才能运行。

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

欢迎关注,转载请注明来源。

章节十六、3-TestNG方法和类注解的更多相关文章

  1. PHP十六个魔术方法

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...

  2. 章节十六、4-TestNG高级功能--把测试方法分优先级、分组执行

    一. 把测试方法分优先级执行----->(priority=索引) 1.新建一个testng方法 package testclasses; import org.testng.annotatio ...

  3. 章节十六、2-TestNG注解和断言

    一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...

  4. 章节十六、5-TestNG高级功能--Part2

    一.测试用例的依赖关系--->(dependsOnMethods = {"依赖方法名"}) 1.在实现自动化的过程中,有些测试用例必须在其它测试用例执行之后才能运行,两者之间 ...

  5. 章节十六、6-xml参数化and并行case

    一.读取xml文件中参数 1.案例演示--->创建一个需要读取数据的类 package testclasses; import org.testng.annotations.Test; impo ...

  6. 章节十六、7-DataProviders

    一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...

  7. 章节十六、9-Listeners监听器

    一.IInokedMethodListener 1.实现一个类来监听testcase的运行情况. package listenerspackage; import org.testng.IInvoke ...

  8. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

  9. PHP之十六个魔术方法

    1.__construct,__destruct__constuct构建对象的时被调用:__destruct明确销毁对象或脚本结束时被调用:2.__get,__set__set当给不可访问或不存在属性 ...

随机推荐

  1. WinForm控件之【ListView】

    基本介绍 项列表控件,拥有五种不同视图的样式供展示项集合. 常设置属性 Columns:‘详细信息’视图中用来显示的列: Groups:ListView列表中的组,将列表各项分组区域展示: Horiz ...

  2. WMI_COM_API

    Win32_Processor // CPU 处理器 Win32_PhysicalMemory // 物理内存 Win32_Keyboard // 键盘 Win32_PointingDevice // ...

  3. 软件测试必须掌握的linux命令大全

    测试工程师的四大基础技能:数据库.linux.网络协议.测试工具,不管是刚入门还是已经工作多年,这几个方向都是要掌握的.今天我们再讲一下测试工程师必须要掌握的linux命令. 测试工程师需要掌握lin ...

  4. jmeter使用问题——将接口返回变量存储成csv文件

    在使用jmeter做接口测试时,一整个jmx测试计划中,存在多个线程,多个接口的测试 但是接口可以分类,比如业务接口.查询接口.更新接口等 考虑自动化接口测试一般都是一次性的,有完整的闭环链路,一般步 ...

  5. Java中使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是" for 每一个& ...

  6. .net持续集成sonarqube篇之项目管理与用户管理

    系列目录 删除项目 在学习阶段,我们可能需要经常删除已构建的项目,在sonarqube中想要删除一个项目有两个入口,都在Administration导航栏内. 在项目内部的管理界面删除 如果项目处于打 ...

  7. 摘录C#代码片段

    1.保存数据到指定文件String response = "";//数据 byte[] bytes = response.getBytes();//转化Byte string fi ...

  8. spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析

    在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...

  9. Linux基础之定时任务

    30.1)什么是定时任务 定时任务命令是cond,crond就是计划任务,类似于我们平时生活中的闹钟,定点执行. 30.2)为什么要用crond 计划任务主要是做一些周期性的任务,比如凌晨3点定时备份 ...

  10. 如何在Vue项目中使用vw实现移动端适配

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在< 使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着 viewport 单位 ...