资深测试必备技能!TestNG自动化测试框架实战详解

1、TestNG导言

在软件测试工作中,自动测试框架是不可或缺的,之前有Junit和Nunit框架,后有TestNG。TestNG不但吸取了Junit和Nunit框架的思想,而且创造了更强大的功能,它不但是单元测试框架,同时也是集成自动化测试框架。TestNG突破了以前一些测试框架的限制,成为用途最广泛的自动和单元测试框架之一,大家由浅入深地一起认识TestNG的强大之处,实现从初级测试工程师到资深测试工程师的进阶!

2、TestNG-初步认知

软件测试是检查应用程序功能以确保其按要求运行的过程。单元测试由开发人员编码中开展,其中采取了足够的措施来测试每个实体(类或方法)以确保最终产品满足要求.TestNG不仅支持单元测试,同时,是很优秀的的自动化测试框架。

JUnit促使开发人员了解与任何其他测试框架相比,测试的有用性,特别是单元测试的有用性.利用相当简单,实用和严格的架构,JUnit能够"感染"大量的开发人员,JUnit同时也有一些缺点:

最初设计用于启用单位仅测试,现在用于各种测试.

无法进行依赖性测试.

配置控制不佳(setUp/tearDown).

Intrusive(强制你扩展类并以某种方式命名你的方法).

静态编程模型(强制您不必要地重新编译).

管理不同的测试套件复杂的项目可能非常棘手.

3、TestNG定义

TestNG是一个受JUnit和NUnit启发的测试框架,但引入了一些新功能,使其功能更强大,更易于使用。

TestNG是一个开源自动化测试框架,其中NG表示N ext G通气.TestNG类似于JUnit(尤其是JUnit 4),但它不是JUnit扩展,它的灵感来自JUnit.它的设计优于JUnit,尤其是在自动化测试时.TestNG的创建者是Cedric Beust。

消除旧框架的大多数限制,TestNG使开发人员能够编写更灵活,更强大的测试.由于它大量借鉴JavaAnnotations(用JDK 5.0引入)来定义测试,它还可以向您展示如何在真实的生产环境中使用Java语言的这一新功能。

4、TestNG功能

·支持注释.

·TestNG使用更多Java和OO功能.

·支持测试集成类(例如,默认情况下,不需要为每个测试方法创建新的测试类实例).

·将编译时测试代码与运行时配置/数据信息分开.

·灵活的运行时配置.

·介绍'测试组'编译完测试后,可以让TestNG运行所有"前端"测试,或"快速","慢速","数据库"测试等.

·支持相关测试方法,并行测试,负载测试和部分故障.

·灵活的插件API.

·支持多线程测试.

5、TestNG-环境和编辑工具

TestNG是Java的框架,因此第一个要求是在您的计算机上安装JDK.需要安装idea开发工具或者eclipse等编码工具。

6、JDK系统配置要求

7、JDK1.8的安装及环境变量的配置

1)https://www.oracle.com/java/technologies/downloads/下载JDK安装包

2)具体安装步骤

点击下一步:

C盘空间足够可以傻瓜式安装到C盘,也可自行更改路径到D盘

更改路径的具体步骤:

3)复制红色框中的名称并在刚刚新建Java文件夹中再新建一个为其文件名的文件夹(注:文件名不要任何有其他字符)

4)下一步:

环境变量的配置

这里以win11系统为例:

1.首先win+E打开文件管理器,找到此电脑图标,右击选择属性

2.选择高级系统设置

3.选择环境变量

4.配置环境变量(注:这里选择配置系统变量而不是用户变量)

添加图片注释,不超过 140 字(可选)

5.以此输入变量名和变量值后点击确认

变量名:JAVA_HOME

变量值:这里是刚刚你安装jdk的路径,如果是一步一步跟着安装的可以输入:

D:\Java\jdk1.8.0_131

添加图片注释,不超过 140 字(可选)

6.点击path并进行编辑

添加图片注释,不超过 140 字(可选)

7.点击新建

添加图片注释,不超过 140 字(可选)

8.输入

%JAVA_HOME%\bin

添加图片注释,不超过 140 字(可选)

9.点击确认

添加图片注释,不超过 140 字(可选)

确保jdk是否安装并配置成功

1.win+r输入cmd打开命令窗口输入javac,如果出现以下提示表示安装配置成功

javac

java-version

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

8、TestNG-基本注释

在JUnit 3中指示测试方法的传统方法是在名称前加上test.这是一种非常有效的方法,用于将类中的某些方法标记为具有特殊含义,但命名不能很好地扩展(如果我们想为不同的框架添加更多标记,会怎样?)并且相当不灵活(如果我们怎么办?想要将其他参数传递给测试框架?).

注释在JDK 5中正式添加到Java语言中,TestNG可以选择使用注释来注释测试类.

以下是TestNG支持的注释列表:

添加图片注释,不超过 140 字(可选)

9、使用注释的优点

以下是使用注释和减号的一些好处:

·TestNG识别通过查找注释,它感兴趣的方法.因此,方法名称不限于任何模式或格式。

·我们可以将其他参数传递给注释。

·注释是强类型的,因此编译器会立即标记任何错误。

·测试类不再需要扩展任何内容(如作为TestCase,用于JUnit 3)。

10、TestNG-执行程序案例演示

TestNgExecutionOrder.java案例代码如下:

package com.test;

import org.testng.annotations.*;

/**

*@author Fson

*@date 2024/1/26 14:06

*/

public class TestNgExecutionOrder{

//test case1

@Test

public void testCase1(){

System.out.println("in test case1");

}

//test case2

@Test

public void testCase2(){

System.out.println("in test case2");

}

//test beforeMethod

@BeforeMethod

public void testBeforeMethod(){

System.out.println("in beforeMethod每次执行Test方法前执行");

}

//test afterMethod

@AfterMethod

public void testAfterMethod(){

System.out.println("in afterMethod每次执行test方法后执行");

}

//test beforeClass

@BeforeClass

public void testBeforeClass(){

System.out.println("in beforeClass testcase1执行注释方法只会在调用当前类的第一个测试方法之前运行一次");

}

//test AfterClass

@AfterClass

public void testAferClass(){

System.out.println("in afterClass testcase1执行带注释的方法仅会运行一旦所有当前类的测试方法都已运行.");

}

//test BeforeTest

@BeforeTest

public void testBeforeTest(){

System.out.println("in BeforeTest(比如先登录)执行完suit执行BeforeTest带注释的方法将在任何属于该方法的测试方法之前运行里面的课程LT;试验>标签运行.");

}

//test AfterTest

@AfterTest

public void TestAfterTest(){

System.out.println("in afterTest(比如退出登录)带注释的方法将在属于<test>内的类的所有测试方法之后运行.标签已经运行.");

}

//test beforeSuite

@BeforeSuite

public void testBeforeSuite(){

System.out.println("in beforeSuite最早执行在此套件中的所有测试运行之前,带注释的方法只运行一次.");

}

//test@AfterSuite

@AfterSuite

public void testAfterSuite(){

System.out.println("in afterSuite最后执行在此套件中的所有测试运行后,带注释的方法只运行一次.");

}

}

代码中直接运行效果如下:

根据以上输出,执行程序如下:

·首先,beforeSuite()方法只执行一次.

·最后,afterSuite()方法只执行一次.

·甚至方法beforeTest(),beforeClass(),afterClass()和afterTest()方法也只执行一次.

·beforeMethod()方法为每个测试用例执行但在执行测试用例之前.

·afterMethod()方法在执行测试用例后执行每个测试用例.

·在beforeMethod()和afterMethod()之间,每个测试用例都会执行.

通过testng.xml配置文件运行程序

让我们在其中创建testng.xml文件/work/testng/src,执行测试用例。此文件以XML格式捕获您的整个测试。该文件使您可以轻松地在一个文件中描述所有测试套件及其参数,您可以将其签入代码存储库或通过电子邮件发送给同事。它还可以轻松提取测试的子集或拆分多个运行时配置(例如,testngdatabase.xml将仅运行测试您的数据库的测试)。

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="tester">

<test name="case1">

<classes>

<class name="com.test.TestNgExecutionOrder"/>

</classes>

</test>

</suite>

右键--->run TestNgExecution.xml

创建testng.xml文件

运行TestNG测试脚本有两种方式:一种是直接通过IDE运行(例如使用eclipse中的“Run TestNG tests”),另一种是从命令行运行(通过使用xml配置文件)。当我们想执行某个包或者某个类中的一部分测试脚本的时候,使用xml配置文件是非常便利的。在xml配置文件里,不仅可以选择某些需要执行的测试脚本,还可以排除某些不需要运行的测试脚本。

创建xml文件很容易,只需要在其中填充一些内容。可以同时执行多个类中间的测试方法。

首先要声明一个suite的名字,用于描述将要运行的测试脚本集,可以根据自己需要任意命名,最终这个名字会在testng的测试报告中看到。

<!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd">

<suite name="SuiteName"verbose="1">

<test name="TestName">

</test>

</suite>

如果选择的测试脚本是基于组的(使用了@Test(groups={"student"})这样的注解),那么接下来需要声明如何使用这些组:包含或者排除。如果使用了include标签标注某些组,那么在选择的测试脚本中,只有属于那些组的测试脚本会被运行。那些未被选中的测试脚本,或者被选中却不属于某些组的测试脚本都不会被运行。需要注意,一个测试脚本可以属于很多个组,只要有一个组被include标签标注,那么它就会被运行。如果使用了exclude标签标注某些组,那么在选择的脚本中,只有不属于那些组的测试脚本会被运行。如果同时使用了include标签和exclude标签,那么拥有被include标注的组的那些脚本会被运行,拥有被exclude标注的脚本不会被运行。有一个例外是,一个组同时被include和exclude标注了,那么拥有这个组的脚本会被运行。include和exclude标签的使用方式如下:

<groups>

<run>

<include name="includedGroupName"/>

<exclude name="excludedGroupName"/>

</run>

</groups>

11、TestNG include

include在testng.xml中间指定需要执行的方法,如果只执行类中间的指定方法,需要通过testng.xml配置文件选中需要执行的方法,未包含的方法将不会执行.

IncludeTest.java案例代码

package com.test;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/2/20 14:20

*include在testng.xml中间指定需要执行的方法

*/

public class IncludeTest{

@Test

public void testRun(){

System.out.println("+++++++++++++++testRun+++++++++++");

}

@Test

public void testNotRun(){

System.out.println("+++++++++++testNotRun+++++++++++++++++++++++");

}

@Test

public void testTwoRun(){

System.out.println("++++++++testTwoRun++++++++++++++");

}

}

testng xml案例配置文件

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="IncludeTestNG">

<test name="IncludeTest">

<classes>

<class name="com.test.IncludeTest"/>

<methods>

<include name="testRun"></include>

<include name="testTwoRun"></include>

</methods>

</classes>

</test>

</suite>

案例运行效果如下:

TestNG exclude

与include对立的是exclude,比如除去test01方法以外其他都运行,就用exclude,如果需要排除某个方法不执行,其他的方法都需要执行,就需要在testng.xml配置文件中间用该关键字。

ExcludeTest.java案例代码

package com.test;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/2/20 14:42

*exclude排除该方法之外所有的方法都执行比如该类中间有3个方法test01 test02 test03除了test01方法外其他的方法都执行

*就可以用该关键词

*/

public class ExcludeTest{

@Test

public void test01(){

System.out.println("test01()");

}

@Test

public void test02(){

System.out.println("test02()");

}

@Test

public void test03(){

System.out.println("test03()");

}

}

ExcludeTestNG.xml案例配置文件

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="IncludeTestNG">

<test name="IncludeTest">

<classes>

<class name="com.test.ExcludeTest"/>

<methods>

<exclude name="test01"></exclude>

</methods>

</classes>

</test>

</suite>

案例运行效果:

12、TestNG自动化测试框架完整案例并输出报告

Testng_before_after_class.java案例代码

package com.test;

import org.testng.annotations.AfterTest;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/1/16 14:06

*/

/*

注解说明

TestNG支持多种注解,可以进行各种组合,如下进行简单的说明

注解描述

@BeforeSuite在该套件的所有测试都运行在注释的方法之前,仅运行一次

@AfterSuite在该套件的所有测试都运行在注释方法之后,仅运行一次

@BeforeClass在调用当前类的第一个测试方法之前运行,注释方法仅运行一次

@AfterClass在调用当前类的第一个测试方法之后运行,注释方法仅运行一次

@BeforeTest注释的方法将在属于test标签内的类的所有测试方法运行之前运行

@AfterTest注释的方法将在属于test标签内的类的所有测试方法运行之后运行

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

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

@BeforeMethod注释方法将在每个测试方法之前运行

@AfterMethod注释方法将在每个测试方法之后运行

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

@Factory将一个方法标记为工厂,返回TestNG将被用作测试类的对象。该方法必须返回Object[]

@Listeners定义测试类上的侦听器

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

@Test将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法

常用注解使用:

1.@BeforeClass@AfterClass在运行类之前或之后执行一次

@BeforeClass中可写入初始数据

@AfterClass清除数据

testng_before_after_class.java

public class Testng_before_after_class{

//运行testng_before_after_class类的时,会执行一次

@BeforeClass

public void BeforeClass(){

System.out.println("BeforeClass被运行登录");

}

@AfterTest

public void AfterClass(){

System.out.println("AfterClass被运行退出登录");

}

//运行每个测试方法进都会被执行到

@Test

public void abc(){

System.out.println("这里是abc");

}

@Test

public void abc1(){

System.out.println("这里是abc1");

}

@Test

public void abc2(){

System.out.println("这里是abc2");

}

@Test

public void exportBaogao(){

System.out.println("+++++++++++查看输出报告+++++");

}

}

testng_before.xml案例配置文件

<suite name="tester_before_suite1"parallel="methods"thread-count="2">

<test name="test_before">

<classes>

<class name="com.test.Testng_before_after_class"/>

</classes>

</test>

</suite>

案例运行效果:

生成TestNG自带的默认报告Use Default Reportters

设置报告输出路径run-->Edit configuration

html文件存放路径:

可以直接把该文件复制出来,浏览器打开开一下效果,TestNG自动生成测试报告如下:

文末了:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。同时我邀请你进入我们的软件测试学习交流平台,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。

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

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

相关文章

Nginx反向代理配置

一、介绍 Nginx 的反向代理功能在现代网络架构中扮演着至关重要的角色。首先&#xff0c;它充当了客户端与后端服务器之间的中介。当客户端发送请求时&#xff0c;这些请求先到达 Nginx 服务器&#xff0c;Nginx 会根据预先设定的规则和配置&#xff0c;将请求准确地转发到相应…

浅谈如何自我实现一个消息队列服务器(8)——编写客户端部分

文章目录 一、客户端部分涵盖3大核心类1.1、ConnectionFactory 类1.2、Connection 类1.3、Channel 类 二、3级类结构优势三、客户端实现逻辑3.1、ConnectionFactory3.1.1、ConnectionFactory类所含字段3.1.2、ConnectionFactory类所含方法 3.2、Connection3.2.1、Connection类所…

proxySQL 安装与配置

# 官网下载 https://www.proxysql.com/documentation/installing-proxysql/ > cd ~/Downloads # 使用 dpkg 命令来安装下载的 .deb 包 > sudo dpkg -i proxysql_2.6.2-debian12_amd64.deb # 如果 dpkg 命令报告缺少依赖关系或安装过程中遇到问题&#xff0c;可以尝试运…

MySQL-双主复制

mysql 双主复制&#xff1a; 实现和MHA&#xff08;高可用架构&#xff09;相同的效果。 使用keepalived实现先双主热备&#xff0c;防止单点故障的主从结构。 两台mysql互做主从&#xff0c;各自安装keepalived实现热备&#xff0c;其他从服务器和热备的虚拟IP建立主从连接mys…

Linux下安装mysql8.0(以rpm包安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以rpm包安装&#xff09;https://myweb.myskillstree.cn/125.html 目录 1、查操作系统信息 2、下载mysql 8.0.34的rpm包 …

MySQL中获取指定日期区间内所有日期

在数据库应用开发中&#xff0c;经常需要根据给定的日期范围获取区间内的每一天日期&#xff0c;这对于统计分析、报表生成、任务调度等领域至关重要。MySQL作为广泛应用的关系型数据库管理系统&#xff0c;提供了丰富的日期函数和查询技巧来实现这一需求。本文将深入探讨如何在…

【Anaconda 3 】Jupyter Notebook 的安装配置及使用

Jupyter Notebook 的安装配置及使用 一、引言 Jupyter Notebook 是一种交互式笔记本&#xff0c;它允许用户将代码、注释、方程式、可视化内容等整合到一个文档中&#xff0c;并支持多种编程语言&#xff0c;如 Python、R、Julia 等。它在数据科学、机器学习和教育领域中得到…

Goland GC

Goland GC 引用Go 1.3 mark and sweep 标记法Go 1.5 三色标记法屏障机制插入屏障删除写屏障总结 Go 1.8 混合写屏障(hybrid write barrier)机制总结 引用 https://zhuanlan.zhihu.com/p/675127867 Garbage Collection&#xff0c;缩写为GC&#xff0c;一种内存管理回收的机制…

条件平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、原理概述 条件平差的函数模型和随机模型为: A V + W = 0

大模型时代,程序员如何卷?

最近在看电影《碟中谍7》&#xff0c;该片讲述了特工伊森亨特尝试与一个被称为智体的全能人工智能作战&#xff0c;其可以即时访问任何在线网络&#xff0c;他和他的团队成员试图找回控制人工智能智体所必需的两部分钥匙并将其摧毁的故事。 在剧中&#xff0c;智体是一个虚拟反…

文旅行业| 某景区导游培养和管理项目成功案例纪实

——整合导游资源并进行统一管理&#xff0c;构建完善的培养与管理机制&#xff0c;发挥景区导游价值 【客户行业】文旅行业&#xff1b;景区&#xff1b;文旅企业 【问题类型】人才培养&#xff1b;人员管理 【客户背景】 南方某5A级景区&#xff0c;作为国内极具代表性和特…

学习使用jQuery将光标移动到textarea的末尾

学习使用jQuery将光标移动到textarea的末尾 代码 代码 $(document).ready(function(){var textarea $(#your-qipa-id); // 替换为你的textarea IDtextarea.focus(); // 将焦点设置到textarea// 获取textarea的值的长度var len textarea.val().length;// 使用setSelectionRan…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

intellij idea中build project与build module以及rebuild module的区别与联系

IntelliJ IDEA是一个功能强大的Java集成开发环境(IDE)。它提供了几个与构建相关的操作,包括: Build Project: - 这将构建整个项目,包括其中的所有模块。 - 它将编译所有已修改的源文件,并重新生成输出文件(如.class文件)。 - 这通常用于确保整个项目的代码是最新的,并且可以正…

Openssl X509证书从HexStream中解析

整体思路 从hex 转换成字节流 然后从字节流中进行解析 You have access to the raw certificate in memory. In the case that you have access to the raw encoding of the certificate in memory, you can parse it as follows. This is useful if you have stored raw cer…

【Pip】pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]解决方案

pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED] 大家好 我是寸铁&#x1f44a; 总结了一篇pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 今天在安装第三方包时报错如下: 解决方案 本质上是需要指定信任的镜像…

开启异步线程的方法

1&#xff0c;开启异步线程&#xff0c;在启动类上加注解&#xff1a; 2&#xff0c;自定义线程池&#xff1a; Configuration public class PromotionConfig {Beanpublic Executor generateExchangeCodeExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExec…

搜维尔科技:【案例分享】Xsens用于工业制造艺术创新设计平台

用户名称&#xff1a;北京理工大学 主要产品&#xff1a;Xsens MVN Awinda惯性动作捕捉系统 在设计与艺术学院的某实验室内&#xff0c;通过Xsens惯性动作捕捉&#xff0c;对人体动作进行捕捉&#xff0c;得到人体三维运动数据&#xff0c;将捕到的数据用于后续应用研究。…

蓝桥杯备战9.拼数

P1012 [NOIP1998 提高组] 拼数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题作对了&#xff0c;但是题解看到更好的 我写的史 #include<bits/stdc.h> #define endl \n #define int long long using namespace std; const int N 2e710,M 1e310; int a[N],h[…

x_t格式介绍

x_t格式 X_T格式&#xff0c;通常被称为Parasolid文件格式&#xff0c;是一种用于3D CAD数据交换的文件格式。Parasolid本身是一个几何建模内核&#xff0c;由Siemens PLM Software开发和维护&#xff0c;广泛应用于许多主流CAD、CAM、CAE系统中&#xff0c;如SolidWorks、Sol…