TestNG注释

news2024/11/16 7:38:31

目录

TestNG注释列表

@BeforeXXX和@AfterXXX注释放在超类上时如何工作?

使用@BeforeXXX和@AfterXXX TestNG注释


TestNG是一个测试框架,旨在简化广泛的测试需求,从单元测试(隔离测试一个类)到集成测试(测试由几个类、几个包甚至几个外部框架组成的整个系统,如应用程序服务器)。

在TestNG中,NG代表下一代测试

TestNG为我们提供了许多注释,允许在某个点之前和之后执行一些Java逻辑以及更多。
那么,什么是注解呢?注释是元数据的一种形式,它提供有关程序的数据,而这些数据不是程序本身的一部分。注释对它们所注释的代码的操作没有直接影响。

TestNG注释列表
注释名称它有什么用?
@BeforeSuite带注释的方法将在此套件中的所有测试运行之前运行
@AfterSuite带注释的方法将在此套件中的所有测试运行之后运行。
@BeforeTest带注释的方法将在任何属于标记中的类的测试方法运行之前运行<test>。
@测试后带注释的方法将在所有属于标记中的类的测试方法运行之后运行<test>。
@BeforeGroups此配置方法将在其之前运行的组的列表。此方法保证在调用属于任何这些组的第一个测试方法之前不久运行。
@AfterGroups此配置方法将在其之后运行的组的列表。此方法保证在调用属于这些组中任何一个的最后一个测试方法后不久运行。
@BeforeClass带注释的方法将在调用当前类中的第一个测试方法之前运行。
@AfterClass带注释的方法将在当前类中的所有测试方法运行之后运行。
@BeforeMethod注释方法将在每个测试方法之前运行。
@AfterMethod注释方法将在每个测试方法之后运行。
@DataProvider将方法标记为提供测试方法的数据。带注释的方法必须返回一个Object[][],其中每个Object[]可以被分配测试方法的参数列表。想要从这个DataProvider接收数据的@Test方法需要使用一个与这个annotation的名称相等的dataProvider名称。
@Factory将方法标记为工厂,该工厂返回将由TestNG用作Test类的对象。方法必须返回Object[]。
@Listeners定义测试类上的侦听器。
@Parameters描述如何将参数传递给@Test方法。
@TestMarks a class or a method as part of the test.
@BeforeXXX和@AfterXXX注释放在超类上时如何工作?

如果将这些注释放在超类上,则子类也将继承这些注释。这对于将多个测试类的测试设置集中在一个公共超类中非常有用。在这种情况下,TestNG保证@Before方法按照继承顺序执行(首先是最高的超类,然后沿着继承链向下),而@After方法则按照相反的顺序执行(沿着继承链向上)。

现在,我们将创建两个类,其中CodekruTest将是CodekruTestSubclass的超类,并具有以下结构

superClass and subclass

CodekruTest.java

 

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
 
public class CodekruTest {
 
    @BeforeClass
    public void beforeSuperClassMethod() {
        System.out.println("In before method of Superclass");
        Assert.assertTrue(true);
    }
 
    @AfterClass
    public void AfterSuperClassMethod() {
        System.out.println("In after method of Superclass");
        Assert.assertTrue(true);
    }
 
}

CodekruTestSubclass.java

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
 
public class CodekruTestSubclass extends CodekruTest {
 
    @BeforeClass
    public void beforeSubClassMethod() {
        System.out.println("In before method of Subclass");
        Assert.assertTrue(true);
    }
 
    @AfterClass
    public void AfterSubClassMethod() {
        System.out.println("In after method of Subclass");
        Assert.assertTrue(true);
    }
 
    @Test
    public void test() {
        System.out.println("Executing the test");
        Assert.assertTrue(true);
    }
 
}

现在,我们将只运行CodekruTestSubclass,看看会发生什么。下面是用于此的testng.xml

<suite name="codekru">
    <test name="codekru">
        <classes>
            <class name="Test.CodekruTestSubclass" />
        </classes>
    </test>
</suite>

输出-

In before method of Superclass
In before method of Subclass
Executing the test
In after method of Subclass
In after method of Superclass

===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0
===============================================

 

因此,我们可以看到超类的before方法首先运行,after方法随后运行。

使用@BeforeXXX和@AfterXXX TestNG注释

层级是-

  1. @BeforeSuite
  2. @BeforeTest
  3. @BeforeClass
  4. @BeforeMethod
  5. @测试
  6. @AfterMethod
  7. @AfterClass
  8. @AfterTest
  9. @AfterSuite

下面是一个小例子,以演示上述层级-

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @BeforeSuite
    public void beforeSuiteMethod() {
        System.out.println("before Suite");
        Assert.assertTrue(true);
    }
 
    @BeforeTest
    public void beforeTestMethod() {
        System.out.println("before Test");
        Assert.assertTrue(true);
    }
 
    @BeforeClass
    public void beforeClassMethod() {
        System.out.println("before Class");
        Assert.assertTrue(true);
    }
 
    @BeforeMethod
    public void beforeMethod() {
        System.out.println("before Method");
        Assert.assertTrue(true);
    }
 
    @AfterSuite
    public void afterSuiteMethod() {
        System.out.println("after Suite");
        Assert.assertTrue(true);
    }
 
    @AfterTest
    public void afterTestMethod() {
        System.out.println("after Test");
        Assert.assertTrue(true);
    }
 
    @AfterClass
    public void afterClassMethod() {
        System.out.println("after Class");
        Assert.assertTrue(true);
    }
 
    @AfterMethod
    public void afterMethod() {
        System.out.println("after Method");
        Assert.assertTrue(true);
    }
 
    @Test()
    public void test() {
        System.out.println("Executing the test");
        Assert.assertTrue(true);
    }
 
}

现在,我们将在testng.xml文件下面运行,看看会发生什么以及输出的打印顺序

<suite name="codekru">
    <test name="codekru">
        <classes>
            <class name="Test.CodekruTest" />
        </classes>
    </test>
</suite>

输出-

before Suite
before Test
before Class
before Method
Executing the test
after Method
after Class
after Test
after Suite

===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0

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

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

相关文章

SpringBoot——纯注解配置的Spring

1.环境搭建 1.1.创建工程 拷贝ssm工程&#xff1a; 1.2.待改造的问题 我们发现&#xff0c;之所以我们现在离不开xml配置文件&#xff0c;是因为我们有一处很关键的配置&#xff0c;如果他要也能用注解配置&#xff0c;那么我们就可以脱离xml文件了&#xff1a; 1.2.1.jdbc…

vuex前端开发,getters是什么?怎么调用?简单的案例操作

vuex前端开发,getters是什么&#xff1f;怎么调用&#xff1f;简单的案例操作&#xff01; 下面通过一些简单的案例&#xff0c;来了解一下&#xff0c;vuex当中的getters到底是什么意思&#xff0c;有哪些实际的操作案例。 Vuex的getters主要用于对store中的state进行计算或过…

使用jackson对java类中包含泛型属性的bean进行序列化和反序列化

最近在做项目时&#xff0c;需要对java的bean对象进行序列化转换为string字符串后&#xff0c;存入redis&#xff0c;然后再从redis中读取该string对象&#xff0c;反序列化为bean对象。正常的简单类型的对象使用jackson可以非常方便进行互为转换操作&#xff0c;但我们操作的对…

icu4c库中icudtl.dat文件剪裁

背景 在工程中需要把ansi编码转utf-8,引入icu4c库&#xff0c;默认编译出来的.dat文件有30多M&#xff0c;由于仅仅需在MacOS系统下要把Windows中的ansi编码转成utf-8&#xff0c;需要进行裁剪。 编译icu4c工程 源码下载&#xff1a;https://github.com/unicode-org/icu&…

HTML 属性

HTML 属性学习笔记 HTML 属性真的好神奇呢&#xff01;它们像是元素的额外说明&#xff0c;总是伴随着特定的格式出现在元素的开始标签里。接下来&#xff0c;我就记录下一些常见的 HTML 属性吧&#xff01; HTML 属性的基本概念 每个 HTML 元素都可以有自己的属性&#xff…

1739. 迷宫的所有路径-深度优先搜索-DFS

代码&#xff1a; #include<bits/stdc.h> using namespace std; int n; int fx[4]{0,1,0,-1}; int fy[4]{1,0,-1,0}; bool vis[100][100]; int q[35][3]; int c; void print(int k){c;cout<<c<<":";for(int i1;i<k;i){cout<<q[i][1]<…

测试 ASP.NET Core 中间件

正常情况下&#xff0c;中间件会在主程序入口统一进行实例化&#xff0c;这样如果想单独测试某一个中间件就很不方便&#xff0c;为了能测试单个中间件&#xff0c;可以使用 TestServer 单独测试。 这样便可以&#xff1a; 实例化只包含需要测试的组件的应用管道。发送自定义请…

多线程排序(java版)

&#x1f4d1;前言 本文主要是【排序】——多线程排序的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

湖(岛屿)

from book&#xff1a;挑战程序设计竞赛

【Linux系统编程】程序地址空间

进程地址空间 进程地址空间是指每个进程在计算机内存中所占用的地址空间。地址空间是指能被访问的内存地址范围&#xff0c;它由若干个连续的内存块组成。每个进程都有自己的地址空间&#xff0c;这意味着每个进程都有自己的内存地址范围&#xff0c;不会与其他进程冲突。进程地…

回溯法:0-1背包问题

问题描述 给定种物品和一背包。 物品的重量是&#xff0c; 其价值为&#xff0c;背包的容量为 c。 问应该如何选择装入背包中的物品&#xff0c;使得装入背包中物品的总价值最大&#xff1f;注意物品不重复! 实例&#xff1a;物品价值V{12, 11, 9, 8}, 物品重量W{8, 6, 4, 3},…

操作系统-中断和异常(中断作用 类型 内外中断 中断机制原理)

文章目录 总览中断的作用中断类型内中断的例子外中断中断的分类中断机制的基本原理小结 总览 中断的作用 刚启动CPU上运行的是内核程序 中断类型 内中断的例子 当前执行指令非法是指参数有问题等其他原因 陷入指令是主动转换状态&#xff0c;但它并不是特权指令 外中断 时钟…

Docker(一)简介和基本概念:什么是 Docker?用它会带来什么样的好处?

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&#xff1f; 好吧&#xff0c;让我们带…

matplotlib从起点出发(12)_Tutorial_12_MultiAxes

在一个Figure中安排多个Axes 通常在一个图像中&#xff0c;需要同时呈现多于一个Axes&#xff0c;并且需要对齐到网格. Matplotlib有多种工具用于处理在本库历史中演变的Axes网格&#xff0c;我们将讨论我们认为用户最常使用的工具&#xff0c;支持Axes组织方式的工具&#xf…

记录自己 自学摸索 学习日语:新标日

新标日 几节课合成在一起太乱了 第四课会更新个集合 自学日语吧算是 摸索中&#xff01; 尽量一周一课 第一课 单词 ちゅうごくじん 中国人 中国人 にほんじん 日本人 日本人 あめりかじん アメリカ人 美国人 かんこくじん 韓国人 韩国人 ふらんすじん フラン…

uniApp H5使用JSSDK对接微信公众号问题

问题1 uni-app开发微信应用引用JSSDK后 wx.agentConfig is not a function (或 wx.config is not a function) 原因&#xff1a; 因为uni-app自动集成了 微信的 jweixin.js &#xff0c; 所以通过 在浏览器打开 然后保存下来js 文件 然后在项目中通过 import 引入就可以了 …

C++继承(万字详!!)

文章目录 继承的概念及定义继承的概念继承定义 基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承菱形继承菱形虚拟继承 继承的总结和反思笔试面试题 继承的概念及定义 继承的概念 继承(inheritance) 机制是面…

【Linux】yum

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 yum 1. 什么是yum&#xff1f;2. Linux系统(Centos)的生态3. yum的相关操作4. yum的本地配置5. 如何安装软件 1. 什么是yum&#xff1f; yum是一个软件下载安装的一个客户端&a…

Qt/QML编程之路:QWidget和QOBJECT的不同之处(37)

开始使用Qt的工程师&#xff0c;要有个思想准备&#xff0c;标准的Application或者说Windows窗口类的工程和QML是不同的&#xff0c;很多控件在QML里面是不支持的。要了解QObject、QWidget、QMainWindow几个的不同。为何我会遇到这个问题呢&#xff1f;因为在做OpenGL想实现3D效…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…