为什么TestNg会成为Java测试框架的首选?还犹豫什么,看它!

news2024/11/17 14:54:38

上一篇自动化测试我们大概了解了测试的目标、测试的技术选型以及搭建平台的目标及需求,也确定了自动化测试方案以testNg作为整个测试流程贯穿的基础支持框架,那么testNg究竟有什么特点?本篇开始我们来详细的学习testNg这个测试框架。

图片

为什么要用testNg

  首先我们学习之前,先思考一个问题,java测试的框架很多,为什么要用testNg呢?比如junit,使用的人很多,几乎所有java开发人员都会使用junit作为测试框架,那么我们从以下三个点来大概了解下testNg比起junit不同的地方:

  1.灵活的方法命名

  junit使用过的人应该都知道,申明一个测试方法的传统方式是必须在方法名加一个test前缀,但是限制了测试方法的命名,的确从灵活度的角度来说不太适合,而TestNg完全不限制测试方法名,完全通过注解的方式查找测试方法

  2.方法支持灵活动态传参

  熟悉junit的人肯定知道,junit方法默认不支持传递参数,那么我们为了传递参数给方法,往往会选择其他的所谓设计模式技术,比如有参构造等方式避开构建参数的问题,可以说此种方式几乎断绝了我们使用junit做方法传递,方法连续性调用等集成测试的念头,而testNg则不同,不仅支持方法传递参数,而且支持 DataProvider等动态构建数据的方式(后面介绍),并且还支持方法依赖、组依赖等策略,可以灵活的将不同方法之间组合调用,实现单元测试以及集成测试等

  3.testNg支持多种模式多种扩展

  junit不用多说,仅提供很简单的测试方式,本身提供的扩展能力很弱,在遇到复杂测试或者定制化测试需求的时候,完全无从下手,而testNg支持xml、注解两种配置方式,且两种方式可以混合配置,并且在运行的周期内提供了多个注解和拦截、选择器等扩展机制,可以灵活的扩展和选择排除的方法

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

图片

第一个testNg测试方法

  介绍了那么多testNg的优点,那么我们开始第一个简单的测试方法编写吧,打开我们上一篇创建的测试工程,我们首先进行一部分的修改,这里我们选择把测试的范围放开,并且将测试方法变成src/main目录下的正常开发代码使用(因为这里将testNg自动化测试作为某个工程项目进行开发迭代),所以我们需要将pom文件中的:

<dependency><groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

  scope范围标签注释掉,这样即可将test模块覆盖到整个工程,接着我们创建一个conf包,用来保存我们整个测试过程中遇到的所有的测试基础配置,现在我们在conf包下创建一个基础类--BaseTestNg,切继承AbstractTestNGSpringContextTests类,这个类可以用来获取测试过程中的运行周期和运行时参数与上下文等操作,这些方法对于扩展测试和负载测试相当重要,现在我们只需要继承即可:

/**

*基础测试父类-用来获取上下文、运行时参数、注入等

*/

public class BaseTestNg extends AbstractTestNGSpringContextTests {

}

  然后创建一个test包,在此包下创建一个demo01类,开始编写一个简单的测试方法吧:

public class demo01 extends BaseTestNg{

       @Test

       public void tDemo(){

             System.out.println("当前运行的是第一个测试方法");

       }

}

  这里需要注意一点,@Test注解使用org.testng.annotations.Test包下的,并且这里可以看到,我们方法命名并没有按照test开头,现在我们运行一下这个方法:

  运行成功了!咦,这个tDemo上面的demo01、test以及Default Suite分别是什么?为什么有这些东西呢?相信细心的你已经发现了,这里需要涉及testNg的一个运行机制,在testNg中会运行一个Suite测试套件,每个套件中可以存在多个test测试模块,并且每个test下可以存在多种策略,比如class或者方法等,但是我们刚才运行的仅仅是tDemo这一个方法而已,所以testNg在启动的时候,会按照默认值的方式,将当前方法挂载在名叫demo01的测试类上,并且将当前测试类挂载在名为test的测试模块上,在所有测试的模块中都会默认挂载在对应的Suite上,这里默认的即Default Suite

图片

测试运行周期

  刚刚我们运行了一个简单的测试方法,那么我们如何做灵活的方法控制呢?比如在测试之前我们需要做一些资源的准备工作,并且在测试完成以后,我们又需要做一些销毁资源释放内存的操作,怎么办?针对这一点,testNg中提供了一系列可以依赖的运行时方法,可以在不同的运行时生命周期中进行执行,目前支持的注解方法如下:

  • @BeforeSuite

  @BeforeSuite注解方法在套件运行之前执行

  • @BeforeTest

  @BeforeTest注解方法在测试用例之前执行

  • @BeforeClass

  @BeforeClass注解方法在测试类运行之前执行

  • @BeforeMethod

  @BeforeMethod注解方法在测试方法运行之前执行

  • @AfterSuite

  @AfterSuite注解方法在测试套件运行结束以后执行

  • @AfterTest

  @AfterTest注解方法在测试用例结束以后执行

  • @AfterClass

  @AfterClass注解方法在测试类运行结束以后执行

  • @AfterMethod

  @AfterMethod注解方法在测试方法运行结束以后执行

  那么,这些注解方法执行顺序是什么呢?与测试用例、测试方法的关系是什么呢?我们来写一个demo测试一下:

/**

*测试运行周期

*/

public class demoTest extends BaseTestNg {

//在套件运行之前执行

@BeforeSuite

public void BeforeSuite(){

System.out.println("BeforeSuite");

}

//在测试用例之前执行

@BeforeTest

public void BeforeTest(){

System.out.println("BeforeTest");

}

//在测试类运行之前执行

@BeforeClass

public void BeforeClass(){

System.out.println("BeforeClass");

}

//在测试方法运行之前执行

@BeforeMethod

public void BeforeMethod(){

System.out.println("BeforeMethod");

}

//在测试套件运行结束以后执行

@AfterSuite

public void AfterSuite(){

System.out.println("AfterSuite");

}

//在测试用例结束以后执行

@AfterTest

public void AfterTest(){

System.out.println("AfterTest");

}

//在测试类运行结束以后执行

@AfterClass

public void AfterClass(){

System.out.println("AfterClass");

}

//在测试方法运行结束以后执行

@AfterMethod

public void AfterMethod(){

System.out.println("AfterMethod");

}

@Test

public void test(){

System.out.println("test");

}

}

  编写以后,我们来运行这个测试方法,可以看到输出结果:

BeforeSuite

BeforeTest

BeforeClass

BeforeMethod

test

AfterMethod

AfterClass

AfterTest

AfterSuite

  可以看出来运行时周期执行顺序为:

BeforeSuite-->BeforeTest-->BeforeClass-->BeforeMethod-->测试方法-->AfterMethod-->AfterClass-- >AfterTest-->AfterSuite

图片

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:自动化测试老司机 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1488715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件设计师8--输入输出技术

软件设计师8--输入输出技术 考点1&#xff1a;输入输出技术数据传输控制方式中断处理过程例题&#xff1a; 考点1&#xff1a;输入输出技术 数据传输控制方式 √ 程序控制&#xff08;查询&#xff09;方式&#xff1a;分为无条件传送和程序查询方式两种。方法简单&#xff0…

MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

python实现手机号归属地查询

手机上突然收到了某银行的短信提示&#xff0c;看了一下手机的位数&#xff0c;正好是11位。我一想&#xff0c;这不就是标准的手机号码吗&#xff1f;于是一个想法涌上心头——用python的库实现查询手机号码归属地查询自由。 那实现的效果如下&#xff1a; 注&#xff1a;电…

yolov7添加spd-conv注意力机制

一、spd-conv是什么&#xff1f; SPD-Conv&#xff08;Symmetric Positive Definite Convolution&#xff09;是一种新颖的卷积操作&#xff0c;它主要应用于处理对称正定矩阵&#xff08;SPD&#xff09;数据。在传统的卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;…

【java数据结构】模拟二叉树的链式结构之孩子表示法,掌握背后的实现逻辑

&#x1f4e2;编程环境&#xff1a;idea &#x1f4e2;树结构&#xff0c;以及叶子&#xff0c;结点&#xff0c;度等一些名词是什么意思&#xff0c;本篇不再赘述。 【java数据结构】模拟二叉树的链式结构之孩子表示法&#xff0c;掌握背后的实现逻辑 1. 认识二叉树1.1 二叉树…

桂院校园导航 | 云上高校导航 云开发项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 云开发项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增…

Python判断结构20个实例

基本理论基础 Python中的选择判断结构是一种编程中常用的控制结构&#xff0c;它用于根据条件的真假决定程序的执行路径。选择判断结构有多种类型&#xff0c;包括if语句、if-else语句、if-elif-else语句以及嵌套的选择结构。 首先&#xff0c;我们来介绍最常见的if语句。if语…

浅谈WPF之Binding数据校验和类型转换

在WPF开发中&#xff0c;Binding实现了数据在Source和Target之间的传递和流通&#xff0c;就像现实生活中的一条条道路&#xff0c;建立起了城镇与城镇之间的衔接&#xff0c;而数据校验和类型转换&#xff0c;就像高速公路之间的收费站和安检站。那在WPF开发中&#xff0c;如何…

引入本地图片报错:require is not defined

文章目录 问题分析1. 原始写法2. 最初的解决方案3. 尝试使用 require 引入4. 封装方法进行解析引入图片 问题 Vue3 Vite 使用本地图片报错&#xff1a;require is not defined 分析 1. 原始写法 刚开始我是这样写的&#xff0c;数据是这样定义的&#xff0c;但是数据没出…

Vue.js+SpringBoot开发高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

2024年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上…

快速幂(求解原理+例题)

目录 反复平方法&#xff08;快速幂&#xff09;&#xff1a; 代码&#xff1a; 例题&#xff1a;快速幂求逆元 作用&#xff1a; 快速求出 的结果。 时间复杂度&#xff1a; O(logk) 如果使用一般做法&#xff0c;从1循环到k&#xff0c;时间复杂度是O(k) 反复平方法&am…

倒计时35天

小红的子序列权值和 (nowcoder.com) #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; const double piacos(-1.0); const int mod1e97; int c[1100][1100]; int a[1100],b[5]; void solve() {int n;cin>…

照片变年轻怎么操作?收好这几个方法

照片变年轻怎么操作&#xff1f;在这个数字时代&#xff0c;我们手中的智能手机和相机成为了记录生活的重要工具。然而&#xff0c;随着时间的推移&#xff0c;照片中的人物往往会因为岁月的痕迹而显得苍老。那么&#xff0c;有没有一种方法可以让这些珍贵的回忆重新焕发青春呢…

[DevOps云实践] 跨AWS账户及Region调用Lambda

[DevOps云实践] 跨AWS账户及Region调用Lambda 本文將幫大家理清一下幾個問題: 如何跨不同AWS賬戶,不同Region來調用Lambda? 不同Lambda之間如何互相調用?有時我們希望我們的Lambda脚本能夠運行在多個AWS賬戶中的不同Region下,但是,我們還不希望每個下面都去建立一個運行…

从0开始学习NEON(1)

1、前言 在上个博客中对NEON有了基础的了解&#xff0c;本文将针对一个图像下采样的例子对NEON进行学习。 学习链接:CPU优化技术 - NEON 开发进阶 上文链接:https://blog.csdn.net/weixin_42108183/article/details/136412104 2、第一个例子 现在有一张图片&#xff0c;需…

【CSP试题回顾】201403-2-窗口

CSP-201403-2-窗口 解题思路 窗口存储结构&#xff1a;首先&#xff0c;使用一个结构体MyWindow来存储每个窗口的信息&#xff0c;包括窗口的序号&#xff08;index&#xff09;和矩形区域的四个顶点坐标&#xff08;x1, y1, x2, y2&#xff09;。所有窗口的信息存储在一个向量…

17 easy 290. 单词规律

//给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 // // 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 // // // // 示例1: // // //输入: patte…

一篇文章教会你如何在IOS真机上完美运行React Native

一篇文章教会你如何在IOS真机上完美运行React Native 项目初始化项目配置可能遇到的问题没有账号也没有Team设备上没有打开开发者模式&#xff0c;也没有信任开发者证书 无线调试 项目初始化 在终端使用**npx react-native init ProjectName**初始化React Native项目。 进入项…

selenuim【1】$x(‘xpath’)、WebDriverWait()、try/assert

文章目录 1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#xff08;2&#xff…