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

news2024/11/18 4:48:03

哈喽大家好,我是小浪。那么今天是一期基于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、写上第一个测试用例的代码,这里我就直接打印了,大家可以自行选择喜欢的内容进行输出~

    @Test
    public 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标签内仅运行一次~

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

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

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

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

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

    @AfterMethod
    public 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);
    }

    @BeforeTest
    public void beforeTest() {
        System.out.println("beforeTest");
    }

    @AfterTest
    public void afterTest() {
        System.out.println("afterTest");
    }

    @BeforeClass
    public void beforeClass() {
        System.out.println("beforeClass");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("afterClass");
    }

    @BeforeSuite
    public void beforeSuite() {
        System.out.println("beforeSuite");
    }

    @AfterSuite
    public 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");
    }


    @BeforeMethod
    public void beforeMethod() {
        System.out.println("beforeMethod");
    }

    @AfterMethod
    public 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.coloradmin.cn/o/1252681.html

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

相关文章

【数据结构实验】排序(二)希尔排序算法的详细介绍与性能分析

文章目录 1. 引言2. 希尔排序算法原理2.1 示例说明2.2 时间复杂性分析 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现3.3 代码解析3.4 实验结果 4. 实验结论 1. 引言 排序算法在计算机科学中扮演着至关重要的角色…

坚鹏:中国银联公司银行业前沿技术介绍及其数据分析方法实战培训

中国银联公司银行业前沿技术介绍及其数据分析方法实战培训圆满结束 ——借力数字化技术实现基于场景的精准化、场景化、智能化营销 中国银联公司&#xff08;China UnionPay&#xff09;成立于2002年3月&#xff0c;是经国务院同意&#xff0c;中国人民银行批准&#xff0c;在合…

一种太阳能风能市电互补路灯方案介绍

太阳能市电互补路灯是一种环保、节能的照明设施&#xff0c;它利用太阳能进行发电并实现照明。这种路灯在白天吸收阳光并将其转化为电能&#xff0c;到了晚上则利用储存的电能为LED灯提供电力&#xff0c;实现照明功能。下面叁仟智慧将详细介绍太阳能市电互补路灯灯的工作原理和…

人工智能|机器学习——循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…

4-20mA高精度采集方案

下载链接&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247557466&idx1&snb5a323285c2629a41d2a896764db27eb&chksmfcfaf28dcb8d7b9bb6211030d9bda53db63ab51f765b4165d9fa630e54301f0406efdabff0fb&token976581939&langzh_CN#rd …

明道云伙伴成果与展望

摘要&#xff1a;这篇文章介绍了明道云在过去一年的成果以及未来的计划。明道云将把更多资源和精力投入到伙伴身上&#xff0c;提供更全面的支持&#xff0c;包括产品特性、展业支持和 GTM &#xff08;Go-To-Market&#xff09;支持三个方面。在产品特性方面&#xff0c;明道云…

【数据结构实验】排序(一)冒泡排序改进算法 Bubble及其性能分析

文章目录 1. 引言2. 冒泡排序算法原理2.1 传统冒泡排序2.2 改进的冒泡排序 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果5. 实验结论 1. 引言 排序算法是计算机科学中一个重要而基础的研究领域&…

03:2440--UART

目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉​编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…

makefile 学习(5)完整的makefile模板

参考自&#xff1a; (1&#xff09;深度学习部署笔记(二): g, makefile语法&#xff0c;makefile自己的CUDA编程模板(2&#xff09;https://zhuanlan.zhihu.com/p/396448133(3) 一个挺好的工程模板&#xff0c;(https://github.com/shouxieai/cpp-proj-template) 1. c 编译流…

linux嵌入式时区问题

目录 操作说明实验参考 最近有个针对时区的需求&#xff0c;研究了下。 查询网上的一些设置&#xff0c;发现基本都是系统中自带的一些文件&#xff0c;然后开机时解析&#xff0c;或者是有个修改的命令。 操作 但针对嵌入式常用到的 busybox 制作的最小系统&#xff0c;并没…

图论|知识图谱——详解自下而上构建知识图谱全过程

导读&#xff1a;知识图谱的构建技术主要有自顶向下和自底向上两种。其中自顶向下构建是指借助百科类网站等结构化数据源&#xff0c;从高质量数据中提取本体和模式信息&#xff0c;加入到知识库里。而自底向上构建&#xff0c;则是借助一定的技术手段&#xff0c;从公开采集的…

activiti流程回退与跳转

学习连接 【工作流Activiti7】3、Activiti7 回退与会签 【工作流Activiti7】4、Activiti7 结束/终止流程 Activiti-跳转到指定节点、回退 ativiti6.0 流程节点自由跳转实现、拒绝/不同意/返回上一节点、流程撤回、跳转、回退等操作&#xff08;通用实现&#xff0c;亲测可用…

基于python+TensorFlow+Django算法模型的车辆车型识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术栈主要模块1. 数据预处理2. 模型构建3. 模型训练4. 模型集成5. 用户界面 系统工作流程未来改进计划 二、功能三、系统四. 总结 一项目简介 # 车辆车…

【linux】基本指令(中篇)

echo指令 将引号内容打印到显示屏上 输出的重定向 追加的重定向 输出的重定向 我们学习c语言的时候当以写的方式创建一个文件&#xff0c;就会覆盖掉该文件之前的内容 当我们以追加的方式打开文件的时候&#xff0c;原文件内容不会被覆盖而是追加 more指令 10.more指令…

cephadm部署ceph quincy版本

环境说明 IP主机名角色 存储设备 192.168.2.100 master100 mon,mgr,osd,mds,rgw 大于5G的空设备192.168.2.101node101mon,mgr,osd,mds,rgw大于5G的空设备192.168.2.102node102mon,mgr,osd,mds,rgw大于5G的空设备 关闭防火墙 关闭并且禁用selinux 配置主机名/etc/hosts …

⑦【Redis GEO 】Redis常用数据类型:GEO [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis GEO ⑦Redis GEO 基本操作命令1.geoadd …

原生JS实现计算器(内含源码)

前言 本文讲解了JavaScript如何在一小时内实现一个简易计算器&#xff0c;这里最大的亮点就在于&#xff0c;我在JS中只用了一个事件&#xff0c;就实现了计算器的效果和功能&#xff0c;那么好文本正式开始。 布局和样式流程 首先是HTMLCSS结构&#xff1a;这里主要用到的…

基于uQRCode封装的Vue3二维码生成插件

标题&#xff1a;基于uQRCode封装的Vue3二维码生成插件 摘要&#xff1a;本文介绍了一种基于uQRCode封装的Vue3二维码生成插件&#xff0c;可以在Javascript运行环境下生成二维码并返回图片地址。该插件适用于所有Javascript运行环境&#xff0c;并且支持微信小程序。本文将详…

在Python中matplotlib函数的plt.plot()函数的颜色参数设置,以及可以直接运行的程序代码!

文章目录 前言一、使用字符串颜色&#xff1a;二、使用十六进制颜色&#xff1a;三、使用RGB元组&#xff1a;四、使用颜色映射&#xff1a;总结 前言 在matplotlib中&#xff0c;plt.plot()函数可以接受颜色参数&#xff0c;可以设置为字符串颜色&#xff08;如red&#xff0…

笔记:pycharm当有多个plt.show()时候,只显示第一个plt.show()

import matplotlib.pyplot as plt import numpy as np# 创建数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) y3 np.tan(x) y4 np.exp(x)# 创建一个2x2的子图网格 # fig plt.figure() fig,((ax1, ax2), (ax3, ax4)) plt.subplots(nrows2, ncols2, figsize(8,…