@Test Annotation属性- dependsOnMethods属性

news2024/11/27 16:24:33

目录

语法

如果test1()失败了怎么办?test2()测试会发生什么,因为它依赖于test1?

如果我们在test1()方法上不使用@Test注释,但在test 2()测试用例上仍然使用@Test(dependsOnMethod =“test1”),会怎么样?

如果我们在dependsOnMethods属性中传递一个方法列表会怎么样?他们的处决有命令吗?

如何在属于不同类的测试用例上使用dependsOnMethods?


本文将详细讨论@Test注释的dependsOnMethods属性。

这个属性有什么作用?dependsOnMethods属性的用途是什么?dependsOnMethods用于依赖于另一个测试用例执行的测试用例。因此,后一个测试用例将首先执行,因为它的执行对于运行依赖于它的用例是必要的。

语法

dependsOnMethod属性将接受一个字符串数组,如{“test1”,“test 2”},如果一个测试只依赖于另一个测试,你也可以传递“test1”。所以,它会像下面这样-

@Test(dependsOnMethod = {"test1","test2"})   // if depends on one or more tests
@Test(dependsOnMethod = "test1")   // if your test depends on only one other test

现在,让我们看一些关于如何在测试中使用dependsOnMethods的代码-

import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @Test // this test will run first
    public void test1() {
 
        System.out.println("test1 is passed");
        Assert.assertTrue(true);
    }
 
    @Test(dependsOnMethods = "test1") 
    public void test2() {
 
        System.out.println("test2 is passed");
        Assert.assertTrue(true);
    }
 
}

产出-

test1 is passed
test2 is passed
PASSED: test1
PASSED: test2

===============================================
    Default test
    Tests run: 2, Failures: 0, Skips: 0
===============================================

在这里,您可以看到首先执行test1(),然后执行test2()。现在,让我们玩一些事情,因为许多紧迫的问题仍然没有答案。

  • 如果test1()失败了怎么办?test2()测试会发生什么,因为它依赖于test1?
  • 如果我们在test1()方法上不使用@Test注释,但在test 2()测试用例上仍然使用@Test(dependsOnMethod =“test1”),会怎么样?
  • 如果我们在dependsOnMethods属性中传递一个方法列表会怎么样?他们的处决有命令吗?
  • 如何在属于不同类的测试用例上使用dependsOnMethods? 
如果test1()失败了怎么办?test2()测试会发生什么,因为它依赖于test1?

在这种情况下,test 2()将被跳过,不会运行。我们来看看这个的实际效果-

import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @Test
    public void test1() {
 
        System.out.println("test1 is passed");
        Assert.assertTrue(false); // failing the condition here
    }
 
    @Test(dependsOnMethods = "test1") // now this test won't run as test1 failed
    public void test2() {
 
        System.out.println("test2 is passed");
        Assert.assertTrue(true);
    }
 
}

产出-

test1 is passed
FAILED: test1
java.lang.AssertionError: expected [true] but found [false]
	at org.testng.Assert.fail(Assert.java:96)
	at org.testng.Assert.failNotEquals(Assert.java:776)
	at org.testng.Assert.assertTrue(Assert.java:44)
	at org.testng.Assert.assertTrue(Assert.java:54)
	at Test.CodekruTest.test1(CodekruTest.java:12)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
	at org.testng.TestRunner.privateRun(TestRunner.java:648)
	at org.testng.TestRunner.run(TestRunner.java:505)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
	at org.testng.SuiteRunner.run(SuiteRunner.java:364)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
	at org.testng.TestNG.runSuites(TestNG.java:1049)
	at org.testng.TestNG.run(TestNG.java:1017)
	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

SKIPPED: test2
java.lang.Throwable: Method CodekruTest.test2()[pri:0, instance:Test.CodekruTest@27508c5d] depends on not successfully finished methods
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:888)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
	at org.testng.TestRunner.privateRun(TestRunner.java:648)
	at org.testng.TestRunner.run(TestRunner.java:505)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
	at org.testng.SuiteRunner.run(SuiteRunner.java:364)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
	at org.testng.TestNG.runSuites(TestNG.java:1049)
	at org.testng.TestNG.run(TestNG.java:1017)
	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)


===============================================
    Default test
    Tests run: 2, Failures: 1, Skips: 1
===============================================

如果我们在test1()方法上不使用@Test注释,但在test 2()测试用例上仍然使用@Test(dependsOnMethod =“test1”),会怎么样?

它将抛出一个错误,并且任何一个测试用例都不会运行,如下所示-

import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    public void test1() {
 
        System.out.println("test1 is passed");
        Assert.assertTrue(true);
    }
 
    @Test(dependsOnMethods = "test1")
    public void test2() {
 
        System.out.println("test2 is passed");
        Assert.assertTrue(true);
    }
 
}

产出-

org.testng.TestNGException: 
Test.CodekruTest.test2() is depending on method public void Test.CodekruTest.test1(), which is not annotated with @Test or not included.
	at org.testng.internal.MethodHelper.findDependedUponMethods(MethodHelper.java:123)
	at org.testng.internal.MethodHelper.topologicalSort(MethodHelper.java:266)
	at org.testng.internal.MethodHelper.sortMethods(MethodHelper.java:376)
	at org.testng.internal.MethodHelper.collectAndOrderMethods(MethodHelper.java:65)
	at org.testng.TestRunner.initMethods(TestRunner.java:438)
	at org.testng.TestRunner.init(TestRunner.java:271)
	at org.testng.TestRunner.init(TestRunner.java:241)
	at org.testng.TestRunner.<init>(TestRunner.java:192)
	at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
	at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
	at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:713)
	at org.testng.SuiteRunner.init(SuiteRunner.java:260)
	at org.testng.SuiteRunner.<init>(SuiteRunner.java:198)
	at org.testng.TestNG.createSuiteRunner(TestNG.java:1295)
	at org.testng.TestNG.createSuiteRunners(TestNG.java:1273)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
	at org.testng.TestNG.runSuites(TestNG.java:1049)
	at org.testng.TestNG.run(TestNG.java:1017)
	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
如果我们在dependsOnMethods属性中传递一个方法列表会怎么样?他们的处决有命令吗?

不,没有测试的执行顺序,所以,如果我们通过一个测试列表,如@Test(dependsOnMethods = {“test1″,“test 2”}). TestNG可以先执行test1或test 2,但可以保证它们将在使用dependsOnMethods属性的测试方法之前运行。

如何在属于不同类的测试用例上使用dependsOnMethods?

我们可以通过在dependsOnMethods属性中给出方法名的完整路径来实现。让我们创建两个不同的类,CodekruTestFirst和CodekruTestSecond,每个类都有自己的测试用例。CodekruTestFirst的测试用例依赖于CodekruTestSecond的测试用例。

dependsOnMethods project structure

CodekruTestFirst.java

import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTestFirst {
 
    @Test()
    public void testFirst() {
        System.out.println("Excecuting test method in CodekruTestFirst class");
        Assert.assertTrue(true);
    }
 
}

CodekruTestSecond.java

import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTestSecond {
 
    @Test(dependsOnMethods = "Demo.CodekruTestFirst.testFirst")
    public void testSecond() {
        System.out.println("Excecuting test method in CodekruTestSecond class");
        Assert.assertTrue(true);
    }
 
} 

我们现在将运行CodekruTestSecond类,并且CodekruTestFirst中的测试用例也将被执行,因为testSecond()方法依赖于它。

产出-

Excecuting test method in CodekruTestFirst class
Excecuting test method in CodekruTestSecond class

===============================================
codekru
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0

 注意事项: 依赖方法和依赖方法必须具有不同的名称。否则,您将遇到错误。

public class CodekruTestFirst {
 
    @Test
    public void test() {
        System.out.println("Excecuting test method in CodekruTestFirst class");
        Assert.assertTrue(true);
    }
 
}
public class CodekruTestSecond {
 
    @Test(dependsOnMethods = "Demo.CodekruTestFirst.test")
    public void test() {
        System.out.println("Excecuting test method in CodekruTestSecond class");
        Assert.assertTrue(true);
    }
 
}

现在,当我们运行CodekruTestSecond类时,我们会得到下面的错误。


org.testng.TestNGException: 
The following methods have cyclic dependencies:
CodekruTestSecond.test()[pri:0, instance:Demo.CodekruTestSecond@236e3f4e]

	at org.testng.internal.Graph.topologicalSort(Graph.java:128)
	at org.testng.internal.MethodHelper.topologicalSort(MethodHelper.java:299)
	at org.testng.internal.MethodHelper.sortMethods(MethodHelper.java:382)
	at org.testng.internal.MethodHelper.collectAndOrderMethods(MethodHelper.java:71)
	at org.testng.TestRunner.initMethods(TestRunner.java:517)
	at org.testng.TestRunner.init(TestRunner.java:336)
	at org.testng.TestRunner.init(TestRunner.java:289)
	at org.testng.TestRunner.<init>(TestRunner.java:220)
	at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
	at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
	at org.testng.ITestRunnerFactory.newTestRunner(ITestRunnerFactory.java:55)
	at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:676)
	at org.testng.SuiteRunner.init(SuiteRunner.java:178)
	at org.testng.SuiteRunner.<init>(SuiteRunner.java:112)
	at org.testng.TestNG.createSuiteRunner(TestNG.java:1306)
	at org.testng.TestNG.createSuiteRunners(TestNG.java:1282)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1131)
	at org.testng.TestNG.runSuites(TestNG.java:1069)
	at org.testng.TestNG.run(TestNG.java:1037)
	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

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

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

相关文章

放弃Nacos作为配置中心,转而选择这款神器~

目前&#xff0c;我们所有微服务的配置中心都没有采用Nacos&#xff0c;而是选择了另一款携程开源的分布式配置中心Apollo&#xff0c;今天就跟大家详细介绍一下这款神级配置中心 1. 基本概念 由于 Apollo 概念比较多&#xff0c;刚开始使用比较复杂&#xff0c;最好先过一遍…

YOLOv5改进系列(29)——添加DilateFormer(MSDA)注意力机制(中科院一区顶刊|即插即用的多尺度全局注意力机制)

【YOLOv5改进系列】前期回顾&#xff1a; YOLOv5改进系列&#xff08;0&#xff09;——重要性能指标与训练结果评价及分析 YOLOv5改进系列&#xff08;1&#xff09;——添加SE注意力机制 YOLOv5改进系列&#xff08;2&#xff09;——添加CBAM注意力机制 YOLOv5改进系列&…

【Java 数据结构】栈和队列

栈和队列 1. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.4 栈的应用场景1.5 概念区分 2. 队列(Queue)2.1 概念2.2 队列的使用2.3 队列模拟实现2.4 循环队列 3. 双端队列 (Deque)4. 面试题 1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在…

STM32入门教程-2023版【5-1】NVIC

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 四、NVIC &#xff08;1&#xff09;NVIC基本结构 外部中断的整体结构图如下&#xff1a; 这个NVI…

代码随想录算法训练营29期|day37 任务以及具体任务

第八章 贪心算法 part06 738.单调递增的数字 版本2 class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] chars s.toCharArray();int start s.length();for (int i s.length() - 2; i > 0; i--) {if (chars[i] > chars…

利用ASM功能实现零停机oracle RAC存储迁移

在实际生产过程中&#xff0c;经常会遇到比如新旧存储替换等场景&#xff0c;如果是一般情况可能只有做数据迁移才能实现&#xff0c;而迁移可能就存在停机的可能 这里介绍利用ASM DG加盘踢盘功能实现零停机存储迁移&#xff1b;原理很简单 将新存储磁盘添加到data dg&#xf…

江科大stm32学习笔记9——OLED调试工具

一、OLED OLED&#xff1a;有机发光二极管&#xff0c;供电3~5.5V&#xff0c;0.96寸OLED通信协议&#xff1a;I2C/SPI&#xff0c;分辨率&#xff1a;128*64 二、调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手…

Mysql数据库锁--全局锁、表锁、行锁

Mysql数据库按照加锁范围划分 根据加锁的范围&#xff0c;MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类 全局锁 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法&#xff0c;命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只…

CTF盲水印工具:Blind-WaterMark安装

工具下载地址&#xff1a;GitCode - 开发者的代码家园 下载完毕后&#xff0c;只留这些东西就行 接下来需要安装两个依赖&#xff1a; opencv、matplotlib 直接pip install安装的话&#xff0c;工具使用会报错 所以需要到网站里挑选适合的版本进行安装 下载地址&#xff1…

四通道 LVDS 差分线缆接收器MS21148T

产品简述 MS21148T 是一款四路低压差分信号 (LVDS) 线路接收器。在 输入共模电压范围内&#xff0c;每一路差分接收器都可以把 100mV 的差 分输入电压转换成有效的逻辑输出。 该芯片可应用于约 100Ω 的 受控阻抗介质上进行点对点基带数据传输。传输介质可以是印 刷电…

基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统

文章目录 一、LangChain-Chatchat二、搭建步骤2.1 环境配置2.2 模型下载2.3 初始化知识库和配置文件2.4 一键启动2.5 启动界面示例 技术交流群用通俗易懂方式讲解系列 一、LangChain-Chatchat 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现&#xff0c;开源、可离线部…

图像异或加密、解密的实现

很多论文提到了从左上角开始做异或,逐行推导得到结果。 解密过程是加密的逆过程。 先看其基本方法: 参考文献: A Chaotic System Based Image Encryption Scheme with Identical Encryption and Decryption Algorithm 大多数论文都用了这个思路,我们使用MATLAB实现代码…

永久删除 Elasticsearch 中的主节点

Elasticsearch 是一个开源分布式搜索和分析引擎&#xff0c;用于各种任务&#xff0c;例如全文搜索、日志分析和实时数据分析。 Elasticsearch 集群由一个或多个节点组成&#xff0c;每个节点可以具有多种角色&#xff0c;包括主节点&#xff08;master node&#xff09;、数据…

【JaveWeb教程】(37)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(10)JWT令牌技术讲解

目录 SpringBootWeb案例10 JWT令牌2.3 JWT令牌2.3.1 介绍2.3.2 生成和校验2.3.3 登录下发令牌 SpringBootWeb案例10 JWT令牌 2.3 JWT令牌 前面我们介绍了基于令牌技术来实现会话追踪。这里所提到的令牌就是用户身份的标识&#xff0c;其本质就是一个字符串。令牌的形式有很多…

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…

C++初阶 类和对象(补充)

目录 一、友元 1.1什么是友元&#xff1f; 1.2如何使用友元&#xff1f; 1.3使用友元 1.4使用友元注意事项 二、初始化列表 2.1什么是初始化列表? 2.2为什么要有初始化列表&#xff1f; 2.3使用初始化列表 2.4注意事项 一、友元 1.1什么是友元&#xff1f; 友元是一…

前端使用cache storage实现远程图片缓存

Cache Storage 的主要特点和用途 缓存网络资源&#xff1a;可以将经常访问的网络资源缓存到 Cache Storage 中&#xff0c;以提高网页加载速度&#xff0c;减少网络请求。离线访问&#xff1a;当用户处于离线状态时&#xff0c;可以使用 Cache Storage 中的缓存资源来加载网页…

2024程序员的未来方向如何走?还看今朝

这几年的IT行业想必大家已经感受到了&#xff0c;Android、Java、前端等等程序员都经历了大厂裁员、小厂倒闭、找不到工作、毕业即失业的情况。大量失业是必然的&#xff0c;因为互联网公司都逐渐走向统一标准化&#xff0c;只剩下头部的一些大厂&#xff0c;所以市场需求少了。…

C++ QT入门2——记事本功能实现与优化(事件处理+基本控件)

C QT入门2——记事本功能优化&#xff08;事件处理基本控件&#xff09; 一、记事本功能优化编码乱码问题QComboBox下拉控件QString、string、char * 间的数据转化编码问题解决整合 光标行列值显示记事本打开窗口标题关闭按钮优化—弹窗提示快捷键设计 二、☆ QT事件处理事件处…

Common Mistakes in German

Comman Mistakes in German 1, Haus oder Hause2, ja nein oder doch(1) Positive Fragen(2) Negative Fragen 1, Haus oder Hause 2, ja nein oder doch (1) Positive Fragen (2) Negative Fragen kein / nicht P3