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

上一篇自动化测试我们大概了解了测试的目标、测试的技术选型以及搭建平台的目标及需求,也确定了自动化测试方案以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自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qwt直角坐标 画sing(x)/x

cmath的常见函数&#xff1a;qPow()求平方&#xff0c;log(&#xff09;对数10为底 角度转弧度&#xff1a;x(angel/180)*M_PI 图示&#xff1a; 头文件&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <qwt_plot.h> #in…

使用 CDC MinIO 汇入端为 CockroachDB 保持持久数据

CockroachDB 数据库迅速崭露头角&#xff0c;作为一个坚韧且可扩展的分布式 SQL 数据库。它从其昆虫名字的坚持不懈中汲取灵感&#xff0c;即使面对硬件故障&#xff0c;CockroachDB 也能保证高可用性。其分布式架构横跨多个节点&#xff0c;类似于其昆虫原型的适应性。 凭借强…

SpringCloud Aliba-Seata【下】-从入门到学废【8】

目录 1.数据库创建 1.seata_account库下建表 2.seata_order库下建表 3.seata_storage库下建表 4.在每个库下创建回滚日志 2.创建订单模块 2.1建工程 2.2加pom 2.3改yml 2.4file.conf 2.5registry.conf 2.6domain 2.7Dao 2.8Service 2.9controller 2.10confi…

阅读go语言工具源码系列之gopacket(谷歌出品)----第一集 DLL的go封装

gopacket项目是google出品的golang第三方库&#xff0c;项目源码地址google/gopacket: Provides packet processing capabilities for Go (github.com) gopacket核心是对经典的抓包工具libpcap(linux平台)和npcap(windows平台)的go封装&#xff0c;提供了更方便的go语言操作接…

36、WEB攻防——通用漏洞XSS跨站MXSSUXSSFlashXSSPDFXSS

文章目录 MXSSUXSSFlashXSSPDF XSS 跨站的艺术-XSS入门与介绍 UTF-7 XSS、MHTML XSS、CSS XSS、VBScript XSS已经过时&#xff0c;基本上不会出现。 MXSS 简单来说&#xff0c;就是你往前端页面插入payload&#xff0c;但是前端有些防御策略会将payload编码&#xff0c;导致…

防火墙综合实验

实验需求&#xff1a; 1、生产区在工作时间内可以访问服务器区&#xff0c;仅可以访问http服务器。 2、办公区全天可以访问服务器区&#xff0c;其中&#xff0c;10.0.2.20可以访问FTP服务器和HTTP服务器&#xff0c;10.0.2.10仅可以ping通10.0.3.10。 3、办公区在访问服务器…

【VBA代码解决方案】md文档转Word后,全自动转换为标准的Word公式格式

【VBA解决方案】全自动将Word中的文本公式转换为标准公式 写在最前面VBA代码全自动方法将md文档导出为word代码如何运行VBA代码注意事项 一些如何实现的回忆记录步骤解析手动将文本转换为Word公式代码逻辑步骤设想代码解析代码解释总结 其他背景介绍应用场景VBA脚本介绍如何使用…

信息安全认证首选CISP-PTE

&#x1f525;在信息安全领域&#xff0c;CISP-PTE认证正逐渐成为行业的新星。作为中国信息安全测评中心推出的专业认证&#xff0c;CISP-PTE为信息安全从业者提供了国内Z高标准的资质培训。 &#x1f3af;为什么选择CISP-PTE&#xff1f; 1️⃣业界认可&#xff1a;CISP-PTE是…

JAVA_EE_api_中英文对照版

点击即可下载&#xff1a; JAVA_EE_api_中英文对照版

STM32标准库——(3)GPIO输入

1.按键简介 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动 1.1 硬件电路图 上面两个是外加上拉电阻&#xff08;常用…

Python学习从0到1 day9 Python函数

苦难是花开的伏笔 ——24.1.25 函数 1.定义 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段 2.案例 在pycharm中完成一个案例需求&#xff1a;不使用内置函数len&#xff08;&#xff09;&#xff0c;完成字符串长度的计算 #统计字…

MyBatis 批量插入数据优化

前言 最近在项目上遇到了批量插入的场景问题&#xff0c;由于每次需要插入超过 10w 的数据量并且字段也蛮多的导致如果使用循环单次插入的方式插入数据插入的效率不高。相信读者们在实际开发中也遇到过这样类似的场景&#xff0c;那么批量插入如何实现呢&#xff1f; 其实我也…

分寝室

L1-7 分寝室 分数 20 作者 陈越 单位 浙江大学 学校新建了宿舍楼&#xff0c;共有 n 间寝室。等待分配的学生中&#xff0c;有女生 n0​ 位、男生 n1​ 位。所有待分配…

Vue使用svg图片-svg-sprite-loader插件

需求&#xff1a;设计给的一个按钮图标是svg的&#xff0c;不是element自带的图标使用插件svg-sprite-loader svg-sprite-loader 什么是svg-sprite-loader&#xff1f; 将多个 svg 打包成 svg-sprite。svg 雪碧图。类似于 CSS 中的 Sprite 技术。图标图形整合在 一起&#xf…

爆火《幻兽帕鲁》被指用AI缝合宝可梦,开发者自曝传奇经历:是人类的奇迹

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 4天卖出600万份&#xff0c;爆火游戏《幻兽帕鲁》最高180万人同时在线&#xff0c;直接登顶。 这个成绩&#xff0c;甚至在整个Steam游戏平台历史上也能排到第二&#xff0c;连平台自家王牌CS2都被挤下去了。 同时&#xff0…

NGINX如何实现rtmp推流服务

最近直播大火&#xff0c;直播推流软件遍地开花&#xff0c;那么用NGINX如何进行推流呢&#xff1f;下面我们就简单的介绍一下用NGINX的rtmp模块如何实现视频推流&#xff0c;我们主要从一下几点介绍&#xff1a; 推流拉流推流认证拉流认证 package mainimport ("fmt&qu…

[MQ]常用的mq产品图形管理web界面或客户端

一、MQ介绍 1.1 定义 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。 如果非要用一个定义来概括只能是抽象出来一些概念&#xff0c;概括为跨服务之间传递信息的软件。 1.2 MQ产品 较为成熟的MQ产品&#xff1a;IBMMQ&#xff08;IBM We…

公司内网虚拟机中穿透服务器Coturn的搭建

1. 写在前面 coturn服务器的搭建文章已经非常多&#xff0c;但是对于对linux不熟悉的人来说排查错误的文章不多&#xff0c;此篇文章把我这次搭建过程以及如何排查问题做一个梳理我这里是在oracle vm虚拟机中搭建安装的ubuntu&#xff0c;通过H3C路由器映射到外网以下介绍我只…

SpringBoot的默认组件扫描

本篇博客主要探究&#xff1a;为什么SpringBoot项目中我们没有配置组件扫描的包&#xff0c;为什么它会默认扫描启动类所在的包&#xff1f; 一、访问与启动类所在同一包下的接口 我们先来看一个简单的接口&#xff1a; 我们可以观察到&#xff0c;HelloController这个类处在…

Linux中LVM实验

LVM实验&#xff1a; 1、分区 -L是大小的意思-n名称的意思 从vg0&#xff08;卷组&#xff09;分出来 2、格式化LV逻辑卷 LVM扩容 如果icdir空间不够了&#xff0c; 扩展空间lvextend -L 5G /dev/vg0/lv1 /dev/vg0/lv1(pp,vg,lv) 刷新文件系统xfs_growfs /lvdir VG扩容 …