Java+TestNG

TestNG是Java中的一个测试框架,主要用于编写和执行自动化测试用例。它是一个功能强大的测试工具,旨在提供一个比JUnit更强大、更灵活的测试框架。TestNG的设计目标是简化广泛的测试需求,从单元测试(隔离测试一个类)到集成测试(测试由多个类、多个包甚至多个外部框架组成的整个系统)

一、配置maven

        TestNG现在自动集成到IEDA中,在创建maven项目后,在pom文件中添加testng的依赖

二、生成测试类并使用注解

        然后根据src下的类,生成对应的测试类,里面可以定义测试方法,并用不同的注解修饰

@BeforeSuite在该测试套件的所有测试运行之前执行,只执行一次
@AfterSuite在该套件的所有测试运行之后执行,只执行一次
@BeforeTest注释的方法将在属于test标签内的所有类的所有测试方法运行之前运行,一个test标签内可能有多个class(类),在当前test标签内仅运行一次
@AfterSuite
注释的方法将在属于test标签内的所有类的所有测试方法运行之后运行,一个test标签内可能有多个class(类),在当前test标签内仅运行一次
@BeforeClass在属于test标签下的,当前类的第一个测试方法执行之前执行
@AfterClass在属于test标签下的,当前类的最后一个测试方法执行之后执行
@BeforeGroups配置方法将在组列表运行之前运行。 此方法保证在调用属于这些组中的任何第一个测试方法之前不久运行
@AfterGroups   配置方法将在组列表运行之后运行。 此方法保证在调用属于这些组中的最后一个测试方法之后不久运行
@BeforeMethod注释方法将在每个测试方法执行前执行
@AfterMethod        注释方法将在每个测试方法执行后执行
@Parameters描述怎么传递参数
@DataProvider标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称
@Listener定义类上的监听器
@Factory将一个方法定义为工厂
@Test将方法作为测试方法,将类作为测试类,里面的公共方法都视为测试方法

                各个注解在测试套件执行期间,对应的先后顺序是:

        

@BeforeSuite -> @BeforeTest -> @BeforeClass ->

{@BeforeGroups[@BeforeMethod -> @Test1 -> @AfterMethod,

                            @BeforeMethod -> @Test2 -> @AfterMethod

                                , ...] -> @AfterGroups ->

@BeforeGroups[@BeforeMethod -> @Test3 -> @AfterMethod,

                           @BeforeMethod -> @Test4 -> @AfterMethod

                                , ...] -> @AfterGroups, ...}->

@AfterClass->@AfterTest->@AfterSuite

     

        每个测试类下可以存在多个组Groups,而一个组又可以定义多个测试方法,每个测试方法执行前后都要执行。所以测试方法执行完毕,再执行组的方法,直到该类下的所有组测试完毕,执行另一个类,到所有类测试完。

 三、通过xml文件执行测试

 

        定义xml文件,文件头为 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >  

        然后定义各种标签,注意标签之间的嵌套关系,和意思

        写完后右键执行,里面包含的所有测试类都会被测试 

      3.1 suite标签

        是xml文件的根标签,即测试套件,其下可以有多个<test>和<groups>,只存在一个suite标签。suite标签存在多个属性
        TestNG单元测试框架详解_testng框架-CSDN博客

四、通过maven执行测试

        可以打开终端,输入mvn -D 后面跟上测试的文件路径

五、测试中常用的断言

1、assertEqual (expected value, actual value, [String message], )        

        断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object.         message参数是一个可选的字符串消息,表示断言失败输出的信息
2、assertTrue(boolean condition, [String message],)               

        断言一个条件为真;        

        message参数是一个可选的字符串消息,表示断言失败输出的信息
3、assertFalse(boolean condition,[String message])              

        断言一个条件为假;

        message参数是一个可选的字符串消息,表示断言失败输出的信息
4、assertNotNull(java.lang.Object object ,[String message])          

        断言一个对象不为空(null);

        message参数是一个可选的字符串消息,表示断言失败输出的信息
5、assertNull(java.lang.Object object, [String message] )           

        断言一个对象为空(null);    

        message参数是一个可选的字符串消息,表示断言失败输出的信息
6、assertSame(java.lang.Object expected, java.lang.Object actual, [String message] )               断言两个对象引用相同的对象;            

        message参数是一个可选的字符串消息,表示断言失败输出的信息
7、assertNotSame( java.lang.Object unexpected, java.lang.Object actual, [String message])    

        断言两个对象不是引用同一个对象;    

        message参数是一个可选的字符串消息,表示断言失败输出的信息

8、assertArrayEquals( expectedArray, resultArray, [String message])                          断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or                     java.lang.Object.;    

          message参数是一个可选的字符串消息,表示断言失败输出的信息

六、Test注解的常用属性解释

       6.1 预期异常测试:

               通过@Test注解的exceptions 属性,可以定义测试报异常时想捕获的异常类型

                如果抛出的异常为该异常类型,则测试通过,否则测试失败。

       6.2 忽略测试:

                有时候我们写的用例没准备好,或者该次测试不想运行此用例,那么删掉显然不明智,那么就可以通过注解@Test(enabled = false)来将其忽略掉,此用例就不会运行了

        6.3 超时测试:

                “超时”表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败。timeOut设置超时时间,单位是毫秒,此项常用于性能测试

        6.4 分组测试:

                就是groups属性,对应xml文件里的<groups>

                如果是直接在class中,是通过@Test(groups="group2")这种方式来分组

                而且@BeforeGroup是需要添加group名称才可以正确挂载到该group下的;
                这个group说明可以是在单个的测试方法上,也可以在class上,

                只要具有同样的group名称,都会在同一个group中,

                同时group名称可以有多个,类似@Test(groups = {"mysql","database"})这种

        6.5 分suite测试:

                测试套件是用于测试软件程序的行为或一组行为的测试用例的集合。

                在TestNG中,我们无法在测试源代码中定义一个套件,但它可以由一个XML文件表示

                因为套件是执行的功能。 它还允许灵活配置要运行的测试。

                套件可以包含一个或多个测试,并由<suite>标记定义。

                 <suite>是testng.xml的根标记。 描述了一个测试套件,它又由几个<test>部分组成
                下表列出了<suite>接受的所有定义的合法属性

                注意xml文件下,suite作为根标签只存在一个,而里面的test标签可以多个

        6.6 依赖测试:          

                有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。

                TestNG支持这种依赖关系,因为它支持在测试方法之间显式依赖的声明。
                TestNG允许指定依赖关系:

                在@Test注释中使用属性dependsOnMethods指定要依赖的方法名称

                在@Test注释中使用属性dependsOnGroups指定要依赖的组名称
                除此之外依赖还分为hard依赖和soft依赖:

                简而言之,硬依赖就是被依赖的方法或组,只要出错,依赖它的方法和类就不会执行测试,被略过

                  软依赖是被依赖的方法或组,只要出错,依赖它的方法和类还是会执行测试,但是要加入属性alwaysRun=true,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true);
             

        6.7 参数化测试:

               在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。
TestNG可以通过两种不同的方式将参数直接传递给测试方法:

使用xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false"><test name="Test"><parameter name="param1" value="1011111" /><parameter name="param2" value="10" /><classes><class name="com.demo.test.testng.TestCase1"/></classes></test> <!-- Test -->
</suite> <!-- Suite -->
public class TestCase1 {@Test(enabled=true)@Parameters({"param1", "param2"})public void TestNgLearn1(String param1, int param2) {System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);Assert.assertFalse(false);}@Test(dependsOnMethods= {"TestNgLearn1"})public void TestNgLearn2() {System.out.println("this is TestNG test case2");}
}

        这里使用了parameters注解,里面定义参数名称,这样就可以把xml文件里的参数对应到,获取值

使用注解@DataProvider:

        

public class TestCase1 {@DataProvider(name = "provideNumbers")public Object[][] provideData() {return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };}@Test(dataProvider = "provideNumbers")public void TestNgLearn1(int param1, int param2) {System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);Assert.assertFalse(false);}@Test(dependsOnMethods= {"TestNgLearn1"})public void TestNgLearn2() {System.out.println("this is TestNG test case2");}
}

        之前说过使用@DataProvider的方法,返回值一定为Object类型的二维数组,这个就是参数值

        然后方法的参数列表定义参数进行接收,参数类型可以不同

        每次接收到一个数组元素,就是一个不同参数的同名测试

        这样就实现了大量相同的测试,但是传入的参数不同

        

七、testNG报告产出

        

        使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下:

        输出报告在项目目录下的index.html文件中

八、与JUnit的区别

        

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

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

相关文章

福派斯牛肉高脂猫粮,为何成猫舍首选?揭秘其神奇功效!

&#x1f43e; 说到猫咪的伙食&#xff0c;咱们当铲屎官的可是操碎了心&#xff01;想让自家毛孩子吃得健康又开心&#xff0c;选对猫粮真的太重要了。今天就来聊聊为啥福派斯牛肉高脂猫粮能成为众多猫舍的首选&#xff0c;以及它到底能帮咱们的小猫咪哪些忙吧&#xff01; 1️…

mybatis查询数据字段返回空值

1.描述 数据苦衷实际存储字段全不为空 查询后brand_name/company_name为空 2.原因分析 带下划线的字段&#xff0c;都会返回空值&#xff0c;应该是字段映射出了问题 3.解决方案 在配置文件中添加下划线自动映射为驼峰 <configuration><settings><sett…

鸿蒙开发——axios封装请求、拦截器

描述&#xff1a;接口用的是PHP&#xff0c;框架TP5 源码地址 链接&#xff1a;https://pan.quark.cn/s/a610610ca406 提取码&#xff1a;rbYX 请求登录 HttpUtil HttpApi 使用方法

LangChain结合LLM做RAG文档搜索

我们知道LLM&#xff08;大语言模型&#xff09;的底模是基于已经过期的公开数据训练出来的&#xff0c;对于新的知识或者私有化的数据LLM一般无法作答&#xff0c;此时LLM会出现“幻觉”。针对“幻觉”问题&#xff0c;一般的解决方案是采用RAG做检索增强。 但是我们不可能把…

十、Docker版Redis集群搭建

目录 一、3主3从Redis集群配置 1、新建6个docker容器实例 2、进入容器redis-node-1并为6台机器构建集群关系 3、以6381为切入点,查看集群状态 二、主从容错切换迁移案例 1、数据读写存储 2、假如6381宕机了,他的从库6386会不会切换 三、主从扩容案例 1、新建6387、63…

C语言 | Leetcode C语言题解之第292题Nim游戏

题目&#xff1a; 题解&#xff1a; bool canWinNim(int n) {return n % 4 ! 0; }

【Linux】文件系统|CHS寻址|LBA逻辑块|文件索引|inode|Date block|inodeBitmap|blockBitmap

前言 一个进程通过文件描述符标识一个打开的文件&#xff0c;进程拿着文件描述符可以在内核中找到目标文件进行读写等操作。这是打开的文件&#xff0c;而没有被打开的文件存储在磁盘中&#xff0c;是如何管理的&#xff1f;操作系统在偌大的磁盘中如何找到想要的文件并打开的…

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范&#xff1a; 1.写一个类MessageInfo对象&#xff0c;添加构造方法 虽然有快捷键&#xff0c;但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库&#xff0c;通过添加注…

Spring Boot 与 MongoDB 整合指南

MongoDB MongoDB 是一种基于文档的NoSQL数据库&#xff0c;以其高性能、高可用性和易扩展性而著称。它使用 BSON&#xff08;类似 JSON 的二进制格式&#xff09;来存储数据&#xff0c;提供了灵活的数据模型&#xff0c;使得开发者可以更轻松地存储和查询复杂的数据结构。将M…

2024年钉钉杯大数据竞赛A题超详细解题思路+python代码手把手保姆级运行讲解视频+问题一代码分享

初赛A&#xff1a;烟草营销案例数据分析 AB题综合难度不大&#xff0c;难度可以视作0.4个国赛&#xff0c;题量可以看作0.35个国赛题量。适合于国赛前队伍练手&#xff0c;队伍内磨合。竞赛获奖率50%&#xff0c;八月底出成绩&#xff0c;参赛人数3000队左右。本文将为大家进行…

七夕特献:用代码编织爱情的浪漫,程序员的专属爱情证书生成器

文章目录 1. 背景介绍2. **为什么是爱情证书生成器&#xff1f;**3. **功能亮点**4. **技术实现**5. **如何获取&#xff1f;**6. 总结 1. 背景介绍 在这个数字化的时代&#xff0c;程序员们用代码编织世界&#xff0c;创造无限可能。七夕将至&#xff0c;一个充满古老传说和浪…

ElasticSearch核心之DSL查询语句实战

什么是DSL&#xff1f; Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的&#xff0c;所以你必…

Dockerfile指令详解和Docker操作命令

1.容器的特点&#xff1a;1&#xff09;自包含&#xff08;包括应用程序及其运行环境&#xff09;&#xff1b;2&#xff09;可移植&#xff1b;3&#xff09;相互隔离&#xff1b;4&#xff09;轻量级。 2.docker成为容器的事实标准在于&#xff1a;1&#xff09;在运行环境上…

【区块链】如何发行自己的加密货币到以太坊测试网络,remixIDE发行自己的数字货币

如何发行自己的加密货币到以太坊测试网络 环境 reminx在线编辑器&#xff1a;https://remix.ethereum.org/安装有小狐狸钱包插件&#xff08;MetaMask&#xff09; 如何部署代币&#xff1f; 创建一个名字叫做HelloMyToken.sol的文件。编写好智能合约&#xff0c;这边我要发…

文件包含漏洞--pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter &#xff1a;用于在读取作用和写入文件时进行过滤和转换操作。 作用1&#xff1a;利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

Opencv学习项目4——手部跟踪

上一篇博客我们介绍了mediapipe库和对手部进行了检测&#xff0c;这次我们进行手部关键点的连线 代码实现 import cv2 import mediapipe as mpcap cv2.VideoCapture(1) mpHands mp.solutions.hands hands mpHands.Hands() mpDraw mp.solutions.drawing_utilswhile True:…

Flutter - 安卓一次打包不同包名的apk

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 有时为了方便测试&#xff0c;同一个app需要在一个手机上装两个&#xff0c;直接改包名的话比较麻烦&#xff0c;这时可以通过添加flavor进行多维度打包&#xff0c…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

OpenAI推出SearchGPT:革新搜索体验的新工具

引言 原文链接 在信息爆炸的时代&#xff0c;搜索引擎已经成为人们日常生活中不可或缺的工具。然而&#xff0c;传统的搜索引擎在理解复杂查询和提供准确答案方面仍有许多不足。为了解决这一问题&#xff0c;OpenAI与20240725推出了SearchGPT原型&#xff0c;将生成式AI与传统…