当前位置: 首页 > news >正文

TestNG基础教程

TestNG基础教程

    • 一、常用断言
    • 二、执行顺序
    • 三、依赖测试
    • 四、参数化测试
      • 1、通过dataProvider实现
      • 2、通过xml配置(这里是直接跑xml)
    • 五、testng.xml常用配置方式
      • 1、分组维度控制
      • 2、类维度配置
      • 3、包维度配置
    • 六、TestNG并发测试
      • 1、通过注解来实现
      • 2、通过xml来实现
    • 七、异常测试
    • 八、忽略测试
    • 九、软断言

一、常用断言

在这里插入图片描述

二、执行顺序

/*** 执行顺序* beforeSuite - beforeTest - beforeClass -beforeMethod - * test - afterMethod -afterClass - afterTest - afterSuite*/
public class ExecutionOrder {@BeforeSuitepublic void beforeSuite(){System.out.println("beforeSuite");}@BeforeTestpublic void beforeTest(){System.out.println("beforeTest");}@BeforeClasspublic void beforeClass(){System.out.println("beforeClass");}@BeforeMethodpublic void beforeMethod(){System.out.println("beforeMethod");}@Test(enabled = false)public void test1(){System.out.println("test1");}@Testpublic void test2(){System.out.println("test2");}@AfterMethodpublic void afterMethod(){System.out.println("afterMethod");}@AfterClasspublic void afterClass(){System.out.println("afterClass");}@AfterTestpublic void afterTest(){System.out.println("afterTest");}@AfterSuitepublic void afterSuite(){System.out.println("afterSuite");}
}

三、依赖测试

import org.testng.Assert;
import org.testng.annotations.Test;public class DependOnMethods {@Testpublic void start() {System.out.println("start");Assert.assertEquals(1,2);}@Test(dependsOnMethods = "start")public void test1() {System.out.println("test1");}@Test(dependsOnMethods = "test1")public void test2() {System.out.println("test2");}
}

四、参数化测试

1、通过dataProvider实现

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class DataProviderTest {@DataProvider (name = "myData")public Object[][] data() {Object[][] datas = null;return datas = new Object[][]{{"package1", 1, 2, 3},{"package2", 1, 1, 1},};}@Test(dataProvider = "myData")public void test(String name, int a, int b, int c) {System.out.println(name + "的装配数量是:" + a + "," + b + "," + c);}
}@Test(dataProvider = "methodData")public void test1(String name,int age){System.out.println("test111方法 name="+name+";age="+age);}@Test(dataProvider = "methodData")public void test2(String name,int age){System.out.println("test222方法 name="+name+";age="+age);}@DataProvider(name="methodData")public Object[][] methodDataTest(Method method){Object[][] result=null;if(method.getName().equals("test1")){result = new Object[][]{{"zhangsan",20},{"lisi",25}};}else if(method.getName().equals("test2")){result = new Object[][]{{"wangwu",50},{"zhaoliu",60}};}return result;}

2、通过xml配置(这里是直接跑xml)

<?xml version="1.0" encoding="UTF-8" ?><suite name="parameter"><test name="param"><classes><parameter name="name" value="zhangsan"/><parameter name="age" value="10"/><class name="com.course.testng.paramter.ParamterTest"/></classes></test></suite>

五、testng.xml常用配置方式

  • 配置需要结合代码和xml

1、分组维度控制

  • 方法1
public class Groups {@Test(groups = "group1")public void test1() {System.out.println("test1");}@Test(groups = {"group1","group2"})public void test2() {System.out.println("test2");}@Test(groups = "group1")public void test3() {System.out.println("test3");}// 这里还有一些groups的注解,也可以用哦@BeforeGroups("server")public void beforeGroupsOnServer(){System.out.println("这是服务端组运行之前运行的方法");}@AfterGroups("server")public void afterGroupsOnServer(){System.out.println("这是服务端组运行之后运行的方法!!!!!");}
}
<?xml version="1.0" encoding="UTF-8" ?><suite name="suitename"><test name="runAll"><classes><class name="com.course.testng.groups.group1"/><class name="com.course.testng.groups.group2"/></classes></test><test name="onlyRunOne"><groups><run><include name="group1"/></run></groups></test>

2、类维度配置

<classes><class name="examples.packageA.ClassATest"><methods><include name ="testCaseA01"></include><exclude name="testCaseA02"></exclude></methods></class>
</classes>

3、包维度配置

<packages><package name="examples.packageA"/><package name="examples.packageB"/>
</packages>

六、TestNG并发测试

1、通过注解来实现

/*** 并发测试(多个以上需要在xml文件配置)*/
public class ConcurrencyDemo {//单个的可以在这里测试(2个线程运行12次)@Test(invocationCount = 12,timeOut = 2000,threadPoolSize = 2)public void test1(){long id = Thread.currentThread().getId();System.out.println("test1的线程"+id+"正在进行计算");}@Test(invocationCount = 12,timeOut = 2000,threadPoolSize = 2)public void test2(){long id = Thread.currentThread().getId();System.out.println("test2的线程"+id+"正在进行计算");}
}

在这里插入图片描述

2、通过xml来实现

在这里插入图片描述
在这里插入图片描述

七、异常测试

import org.testng.annotations.Test;public class ExpectedException {/*** 什么时候会用到异常测试??* 在我们期望结果为某一个异常的时候* 比如:我们传入了某些不合法的参数,程序抛出了异常* 也就是说我的语气结果就是这个异常。*///    这是一个测试结果会失败的异常测试@Test(expectedExceptions = RuntimeException.class)public void runTimeExceptionFailed(){System.out.println("这是一个失败的异常测试");}//    这是一个成功的异常测试@Test(expectedExceptions = RuntimeException.class)public void runTimeExceptionSuccess(){System.out.println("这是我的异常测试");throw new RuntimeException();}
}
import org.testng.annotations.Test;public class TimeOutTest {@Test(timeOut = 3000)//单位为毫秒值public void testSuccess() throws InterruptedException {Thread.sleep(2000);}@Test(timeOut = 2000)public void testFailed() throws InterruptedException {Thread.sleep(3000);}
}

八、忽略测试

import org.testng.annotations.Test;public class IgnoreTest {@Testpublic void ignore1(){System.out.println("ignore1 执行!");}@Test(enabled = false)public void ignore2(){System.out.println("ignore2 执行");}@Test(enabled = true)public void ignore3(){System.out.println("ignore3 执行");}
}

九、软断言

  • SoftAssert的特点:
    如果一个断言失败,会继续执行这个断言下的其他语句或者断言
    也就是一个用例有多个断言,失败了其中一个,不影响其他断言的运行
    不要忘记调用
    assertAll()在该用例的最后一个断言后面。
/*** 软断言:一个错误了也不影响后面用例的执行*/
public class SoftAssertDemo {@Testpublic void test() {SoftAssert softAssert = new SoftAssert();softAssert.assertEquals(1, 2);softAssert.assertEquals(2, 1);softAssert.assertEquals(3, 1);// 最后一句一定要加哦!softAssert.assertAll();}
}

相关文章:

TestNG基础教程

TestNG基础教程 一、常用断言二、执行顺序三、依赖测试四、参数化测试1、通过dataProvider实现2、通过xml配置&#xff08;这里是直接跑xml&#xff09; 五、testng.xml常用配置方式1、分组维度控制2、类维度配置3、包维度配置 六、TestNG并发测试1、通过注解来实现2、通过xml来…...

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…...

Android 9.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决

1.概述 在9.0的rom定制化开发中,在点击系统自带的播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来分析下这个移除任务栏流程…...

【笔记】Helm-5 Chart模板指南-13 调是模版

调试模板 调试模板可能很棘手&#xff0c;因为渲染后的模板发送了kubernetes API server&#xff0c;可能会以格式化以外的原因拒绝YAML文件。 以下命令有助于调试&#xff1a; 1、helm lint 是验证chart是否遵循最佳实践的首选工具。 2、helm template --debug在本地测试渲…...

Gateway反向代理配置

前言 一般而言&#xff0c;反向代理都是在Nginx中来实现的&#xff0c;其实Gateway也可以作为反向代理服务&#xff0c;不过一般不会这么做&#xff0c;只不过最近的项目&#xff0c;在通过Nginx反向代理之后&#xff0c;iPhone手机访问接口代理地址会异常&#xff0c;安卓手机…...

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注&#xff1a;参考文章&#xff1a; SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…...

猫头虎分享已解决Bug ‍ || 修改mongodb3.0副本集用户密码遇到 BeanDefinitionParsingException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

如何将ChatGPT升级到4.0版本?如何充值?

如何将ChatGPT升级到4.0版本&#xff1f; 在人工智能的世界里&#xff0c;每一个升级都可能带来革命性的变革。ChatGPT的4.0版本无疑是当前最炙手可热的话题之一&#xff0c;那么如何进行升级&#xff0c;体验到这一版所带来的全新特性呢&#xff1f;以下是一步一步的指南。 …...

conda 相关命令

创建并激活环境&#xff1a;打开终端&#xff0c;并创建一个新的conda环境&#xff0c;以确保安装的软件与M1芯片兼容。运行以下命令&#xff1a; conda create -n myenv python这将创建一个名为"myenv"的新环境&#xff0c;并安装Python。然后&#xff0c;激活该环境…...

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域&#xff0c;前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架&#xff0c;并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…...

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1&#xff0c;首先看下半物理仿真 看下我的配置&#xff1a; 看下计算方法以及matlab的仿真输出的数据&#xff1a; timer3的ch2是选择高电平&#xff0c;计算频率 timer3的ch1是选择的是低电平&#xff0c;用来计算周期 其中TemPIpre表示的是CH2输出的值&#xff0c; TemPI…...

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…...

【项目日记(九)】项目整体测试,优化以及缺陷分析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…...

JavaScript 设计模式之外观模式

外观模式 我们为啥要使用外观模式呢&#xff0c;其实我们在使用各种 js 库的时候常常会看到很多的外观者模式&#xff0c;也正是这些库的大量使用&#xff0c;所以使得兼容性更广泛&#xff0c;通过外观者模式来封装多个功能&#xff0c;简化底层操作方法 const A {g: functi…...

一、基础数据结构——2.队列——3.双端队列和单调队列2

参考资料&#xff1a;《算法竞赛》&#xff0c;罗勇军 郭卫斌 著 本博客作为阅读本书的学习笔记&#xff0c;仅供交流学习。 建议关注 罗勇军老师博客 3. 单调队列与最大子序和问题 不限制子序列长度问题——贪心法或动态规划 HDOJ 1003 MAX SUM Max Sum Time Limit: 2000/10…...

Stable Diffusion 模型下载:Samaritan 3d Cartoon(撒玛利亚人 3d 卡通)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

【软件工程导论】实验二——编制数据字典(数字化校园系统案例分析)

数字化校园系统案例分析 问题定义实验内容编制内容1数据项数据流处理逻辑数据存储 2外部实体 问题定义 数字化校园系统期望以数字化信息和网络为基础&#xff0c;在计算机和网络技术上建立起对教学、科研、管理、技术服务、生活服务等校园信息的收集、处理、整合、存储、传输和…...

耳机壳UV树脂制作私模定制耳塞适合什么样的人使用呢?

耳机壳UV树脂制作私模定制耳塞适合以下人群使用&#xff1a; 对音质要求高的人&#xff1a;私模定制耳塞能够完美契合用户的耳朵形状&#xff0c;减少漏音和外部噪音的干扰&#xff0c;提供更好的音质体验。需要长时间佩戴耳机的人&#xff1a;私模定制耳塞能够提高佩戴舒适度…...

第三百一十回

我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容&#xff0c;它主要用来显示移动PopupMenu在页面中的位置…...

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了&#xff0c;剩下的内容 放百度网盘里面了&#xff0c;需要的来取。 链接&#xff1a;https://pan.baidu.com/s/19LHPw36dsxPB7…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...