【测试开发工程师】TestNG测试框架零基础入门(上)

哈喽大家好,我是小浪。那么今天是一期基于Java+TestNG测试框架的入门教学的博客,从只会手工测试提升到自动化测试,这将对你的测试技术提升是非常大的,有助于我们以后在找工作、面试的时候具备更大的竞争力~
在这里插入图片描述

文章目录

      • 一、什么是TestNG?
      • 二、如何创建第一个TestNG用例?
      • 三、TestNG的常用注解
      • 四、以XML的方式运行TestNG
      • 五、以Maven的方式运行TestNG

一、什么是TestNG?

在学习之前,我们首先来了解一下什么是TestNG

TestNG是一个基于Java的测试框架,它是JUnit的替代品,可以更好地满足开发人员和测试人员的需求。TestNG的优势包括:

1.更好的注释:TestNG允许使用更多的注释来描述测试,这使得测试代码更加易读和易于维护.

2.更好的分组:TestNG允许将测试用例分组,这使得测试用例的管理更加容易.

3.更好的依赖性管理:TestNG允许测试用例之间建立依赖关系,这使得测试用例的执行更加灵活.

4.更好的参数化:TestNG允许在测试用例中使用参数,这使得测试用例的复用更加容易.

5.更好的报告:TestNG生成的测试报告更加详细和易读.

二、如何创建第一个TestNG用例?

OK,那了解了什么是TestNG之后,博主这里借助IDEA来演示打印第一个单元测试用例~

1、首先我们需要下载一个编译器IDEA(别告诉我你连IDEA都没有下载~),新建一个Maven项目
在这里插入图片描述

2、找到pow.xml文件,将以下配置文件的代码复制进去,等待IDEA加载~

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>MavenTest</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.10</version></dependency></dependencies>
</project>

3、建好了项目之后,我们需要去下载一个插件Create TestNG XML,File->settings-Plugins搜插件的名字~
在这里插入图片描述
4、java文件下面新建一个类Test1,鼠标选中类名,按alt+enter选择Create Test.
在这里插入图片描述

5、选择TestNG,然后取一个类名,这里我就取得Test1,之后大家可以在test目录下面看到我们刚才取的类名,注意类名必须以大写的Test结尾~

6、写上第一个测试用例的代码,这里我就直接打印了,大家可以自行选择喜欢的内容进行输出~

    @Testpublic void Test(){System.out.println("这是一个TestNG测试框架case");}

运行结果:我们可以看到运行成功了!!
在这里插入图片描述

三、TestNG的常用注解

1、@BeforeClass:在调用当前类的第一个测试方法之前运行,在当前类中仅运行一次

@BeforeClass
public void BeforeClass(){System.out.println("在调用当前类的第一个测试方法之前运行,在当前类中仅运行一次");
}

在这里插入图片描述

2、@AfterClass:在调用当前类的第一个测试方法之后运行,在当前类中仅运行一次

@AfterClass
public void AfterClass(){System.out.println("在调用当前类的第一个测试方法之后运行,在当前类中仅运行一次");
}

在这里插入图片描述

3、@BeforeTest:注释的方法将在属于test标签内的所有类的所有测试方法运行之前运行,一个test标签内可能有多个class(类),在当前test标签内仅运行一次~

    @BeforeTestpublic void BeforeTest(){System.out.println("这是BeforeTest的用例case");}

4、@AfterTest:注释的方法将在属于test标签内的所有类的所有测试方法运行之后运行,一个test标签内可能有多个class(类),在当前test标签内仅运行一次~

    @AfterTestpublic void AfterTest(){System.out.println("这是AfterTest的用例case");}

运行结果:(注意比较优先级)

在这里插入图片描述

5、@BeforeSuite:在该套件的所有测试运行之前运行,仅运行一次

    @BeforeSuitepublic void BeforeSuite(){System.out.println("这是@BeforeSuite的用例case");}

6、@AfterSuite:在该套件的所有测试运行之后运行,仅运行一次

    @AfterSuitepublic void AfterSuite(){System.out.println("这是@AfterSuite的用例case");}

在这里插入图片描述

7、@BeforeMethod:注释方法将在当前类中的每个测试方法之前运行

    @BeforeMethodpublic void BeforeMethod(){System.out.println("这是@BeforeMethod的用例case");}

8、@AfterMethod:注释方法将在当前类中的每个测试方法之后运行

    @AfterMethodpublic void AfterMethod(){System.out.println("这是@AfterMethod的用例case");}

9、@BeforeGroups:配置方法将在组列表运行之前运行。 此方法保证在调用属于这些组中的任何第一个测试方法之前运行

10、@AfterGroups:此配置方法将在组列表运行之后运行。该方法保证在调用属于这些组的任何最后一个测试方法之后运行

    @Test(groups = "groups1")public void Test1(){System.out.println("这是groups1的用例Test1");}@Test(groups = "groups1")public void Test11(){System.out.println("这是groups1的用例Test11");}@Test(groups = "groups2")public void Test2(){System.out.println("这是groups2的用例Test2");}@Test(groups = "groups2")public void Test22(){System.out.println("这是groups2的用例Test22");}//只对group1有效,即Test1和Test11@BeforeGroups(groups="group1")public void BeforeGroups(){System.out.println("这是@BeforeGroups的用例case");}//只对group2有效,即Test2和Test22@AfterGroups(groups="group2")public void AfterGroups(){System.out.println("这是@AfterGroups的用例case");}

运行结果:

在这里插入图片描述

由此可以得出TestNG运行时,执行顺序:@BeforeSuite->@BeforeTest->@BeforeClass->@BeforeGroups.

11、@Parameters:描述如何将参数传递给@Test方法

12、@DataProvider:标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称

四、以XML的方式运行TestNG

那么TestNG支持xml的格式运行,那么如何操作呢?

1、首先我们先来认识一些xml中的标识符以及它们的含义:

<suite> 套件,根标签,通常由几个<test组成>
属性
  name 套件的名称,必须属性;
  verbose 运行的级别或详细程度;
  parallel 是否运行多线程来运行这个套件;
  thread-count 如果启用多线程,用于指定开户的线程数;
  annotations 在测试中使用的注释类型;
  time-out 在本测试中的所有测试方法上使用的默认超时时间;
<test>    测试用例,name为必须属性;
<classes> 用例中包含的类,子标签为<class name="className">;
<class> 测试类,其中属性name为必须属性;;
packages> 用例中包含的包,包中所有的方法都会执行,子标签为<package name="packageName">;
package> 测试包,name为必须属性;
<methods> 指定测试类中包含或排除的方法,子类为<include>,<exclude>; <include> 指定需要测试的方法,name为必须属性;
<exclude> 指定类中不需要测试的方法,name为必须属性;
<groups> 指定测试用例中要运行或排除运行的分组,子标签为<run>,<run>下包含<include>,<exclude>标签,<include>,<exclude>的name指定运行、不运行的分组;

2、在项目下新建一个testng.xml文件:

在这里插入图片描述

代码模板如下:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" ><suite name="Suite1" verbose="1" ><test name="Nopackage" ><classes><class name="NoPackageTest" /></classes></test><test name="Regression1"><classes><class name="test.sample.ParameterSample"/><class name="test.sample.ParameterTest"/></classes></test>
</suite>

3、在test目录下面新建一个类Test3Test

import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.annotations.*;public class Test3Test {@Test(groups = "group1")public void testC03() {System.out.println("testC03");Assert.assertTrue(true);}@Test(groups = "group1")public void testC04() {System.out.println("testC04");Assert.assertTrue(true);}@Test(groups = "group2")public void testC05() {System.out.println("testC05");Assert.assertTrue(true);}@BeforeTestpublic void beforeTest() {System.out.println("beforeTest");}@AfterTestpublic void afterTest() {System.out.println("afterTest");}@BeforeClasspublic void beforeClass() {System.out.println("beforeClass");}@AfterClasspublic void afterClass() {System.out.println("afterClass");}@BeforeSuitepublic void beforeSuite() {System.out.println("beforeSuite");}@AfterSuitepublic void afterSuite() {System.out.println("afterSuite");}@BeforeGroups(groups = {"group1", "group2"})public void beforeGroups() {System.out.println("beforeGroups");}@AfterGroups(groups = {"group1", "group2"})public void afterGroups() {System.out.println("afterGroups");}@BeforeMethodpublic void beforeMethod() {System.out.println("beforeMethod");}@AfterMethodpublic void afterMethod() {System.out.println("afterMethod");}
}

4、修改testng.xml文件中的代码,右键运行testng.xml文件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite" parallel="none"><test name="Test"><classes><class name="Test3Test"/></classes></test>
</suite>

运行结果:

在这里插入图片描述

五、以Maven的方式运行TestNG

1、首先我们需要下载一个插件Maven Helper:
在这里插入图片描述

2、其次需要在pow.xml中配置以下依赖,代码粘贴后,需要点击IDEA右上角的Maven刷新按钮,这样代码就不会出现爆红了~

<dependencies>//注意这个依赖放在这个<dependencies>标签里面<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8</version></dependency></dependencies><build>//<build>标签单独开一行<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19</version><configuration><suiteXmlFiles><suiteXmlFile>testng.xml</suiteXmlFile>//该文件位于工程根目录时,直接填写名字,其它位置要加上路径。</suiteXmlFiles></configuration></plugin></plugins></build>

代码不爆红就说明没有问题~

在这里插入图片描述

3、右键Maven,点击test即可运行Maven:
在这里插入图片描述

4、运行结果:

在这里插入图片描述

注意事项:Maven Helper这个插件的语法为 :<suiteXmlFile>src/test/resources/testNGFilesFolder/${testNgFileName}.xml</suiteXmlFile> 标签里是测试代码的路径~

OK,那么以上就是本篇博客的所有内容了,下篇博客我们继续更新TestNG的其他知识点,感兴趣的小伙伴可以点个star支持一下;关于秋招,实习可添加下方v咨询欧~

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

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

相关文章

【数据结构实验】图(一)Warshall算法(求解有向图的可达矩阵)

文章目录 1. 引言2. Warshall算法原理2.1 初始化可及矩阵2.2 迭代更新可及矩阵 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 Warshall算法是一种用于求解有向图的可达矩阵的经典算法。该算…

用Python进行数据分析:探索性数据分析的实践与技巧(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…

通过JMeter压测结果来分析Eureka多种服务下线机制后的服务感知情况

文章目录 前言1. Eureka-Server的设计2. EurekaRibbon感知下线服务机制3.服务调用接口压测模型4.Eureka几种服务下线的方式4.1强制下线压测 4.2 发送delete&#xff08;&#xff09;请求压测 4.3 调用DiscoveryManager压测 4. 三方工具Actuator 总结 前言 上文末尾讲到了Eurek…

isis基础大全学习案例

R1配置&#xff1a; isis 1 is-level level-2 //本区域只启用level-2级别 cost-style wide //默认为narrow窄度量&#xff0c;开销只能最大63&#xff0c;并且不能打tag&#xff0c;wide宽度量的tlv和narrow不匹配&#xff0c;不能相互计算路由&#xff0c;两边都要改。 netwo…

【C++那些事儿】类与对象(3)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我之前看过一套书叫做《明朝那些事儿》&#xff0c;把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言&#xff0c;无疑是抽象且难度颇…

Redis:事务操作

目录 Redis事务定义相关命令事务的错误处事务冲突的问题Redis事务三特性 Redis事务定义 redis事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行&#xff0c;事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 redis事务…

VCenter连接主机提示:未验证主机SSL证书的真实性

问题&#xff1a;VCenter主机断开连接了&#xff0c;重新连接主机报错SSL证书问题 移除重新加入ESXI6.0节点报错常规系统错误&#xff08;如下图&#xff09; 解决方案&#xff1a;需更改一下验证方式 VCenter Serevr设置→高级设置 将项cpxd.certmgmt.mode 值 vmca 改为&…

《微信小程序从入门到精通》---笔记1

小程序&#xff0c;我又来学习啦&#xff01;请多关照~ 项目驱动 小程序开发建议使用flex布局在小程序中&#xff0c;页面渲染和业务逻辑是分开的&#xff0c;分别运行在不同的线程中。Mini Program于2017年1月7号正式上线小程序的有点&#xff1a;跨平台、开发门槛低、开发周…

VS2022的props配置

最近在点云处理项目过程中&#xff0c;使用了PCL库&#xff0c;遇到了需要在多个vs工程中导入相同库的问题。每次新建项目都要配置很多include文件路径&#xff0c;导入一堆.lib文件&#xff0c;非常头疼&#xff0c;可以通过props属性表来解决这个问题。 一、什么是props属性…

电机应用-直流有刷电机多环控制实现

目录 直流有刷电机多环控制实现 硬件设计 直流电机三环&#xff08;速度环、电流环、位置环&#xff09;串级PID控制-位置式PID 编程要点 配置ADC可读取电流值 配置基本定时器6产生定时中断读取当前电路中驱动电机的电流值并执行PID运算 配置定时器1输出PWM控制电机 配…

【Mybatis】基础增删改查

一.创建SpringBoot项目 创建新项目需要添加的依赖 当然如果是以前的项目也可以直接在pom.xml文件中添加依赖: MySQL Driver依赖 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</…

基于vue+element-plus+echarts编写动态绘图页面

我们都知道网页的echarts可以画图&#xff0c;但是很多情况下都需要编码实现绘图逻辑&#xff0c;如果有一个前端页面可以让我输入数据然后动态生成图表的话那么该多好&#xff0c;其实这个需求不难实现&#xff0c;先看效果。 整体页面分为左右两个部分&#xff0c;其中左边的…

Node.js入门指南(二)

目录 http模块 创建http服务端 浏览器查看 HTTP 报文 获取 HTTP 请求报文 设置响应报文 网页资源的基本加载过程 静态资源服务 hello,大家好&#xff01;上一篇文章我们对Node.js进行了初步的了解&#xff0c;并介绍了Node.js的Buffer、fs模块以及path模块。这一篇文章主…

计算机毕业设计 基于SpringBoot的物业管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2001-2022年上市公-供应链话语权测算数据(原始数据+处理代码Stata do文档+结果)

2001-2022年上市公-供应链话语权测算数据&#xff08;原始数据处理代码Stata do文档结果&#xff09; 1、时间&#xff1a;2001-2022年 2、指标&#xff1a;企业代码、股票代码、年份、股票简称、上市公司前五大供应商的采购额之和占企业当年总采购额的比例、上市公司前五大客…

C语言猜素数(ZZULIOJ1292:猜素数)

题目描述 Lx给Xp出了一道难题&#xff0c;随便在0和1000000之间抽出两个数&#xff0c;估计在这两个数之间的素数的个数&#xff0c;如果猜测的结果和正确结果一样&#xff0c;Xp就可以得到Lx的一件礼物&#xff0c;你能猜对吗&#xff1f;编程实现一下吧&#xff01; 输入&…

​root账号登录群晖NAS教程​

用WinSCPPuTTY以root账号登录群晖NAS保姆教程用WinSCPPuTTY可SecureCRT 以root账号登录群晖NAS 1、先用自己的用户名 密码登陆。 2、切换到root权限 输入sudo -i,按回车,然后也是输入群辉登录的密码。成功之后,显示$ 变成 #号

Python基于jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言&#xff1a;第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言&#xff1a;第三方库及所需材料 编程语言&#xff1a;Python3.9。 编程环境&#xff1a;Anaconda3&#xff0c;Spyder5。 使用到的主要第三方库&#xff1a;…

计算机中由于找不到vcruntime140.dll无法继续执行代码无法打开软件怎么解决分享

关于如何解决vcruntime140.dll无法继续执行代码的6个教程。在这个科技日新月异的时代&#xff0c;电脑已经是我们日常和工作中必不可少的电子产品&#xff0c;然后我们在使用过程中经常会遇到不一样的问题&#xff0c;比如vcruntime140.dll文件丢失&#xff0c;那么vcruntime14…