Testng测试框架(2)-测试用例@Test

news2024/11/27 18:33:44

测试方法用 @Test 进行注释,将类或方法标记为测试的一部分。

@Test()
public void aFastTest() {
    System.out.println("Fast test");
}
import org.testng.annotations.Test;

public class TestExample {
    @Test(description = "测试用例1")
    public void testCase1(){
        System.out.println("Test Case 1");
    }
    @Test(priority = 2)
    public void testCase2(){
        System.out.println("Test Case 2");
    }
    @Test(priority = 1)
    public void testCase3(){
        System.out.println("Test Case 3");
    }
    @Test
    public void testCase4(){
        System.out.println("Test Case 4");
        throw new RuntimeException("Test Case 4 Failed");
    }

    @Test(groups = {"myGroup"})
    public void testCase5(){
        System.out.println("Test Case 5");
        throw new RuntimeException("Test Case 5 Failed");
    }

    @Test(enabled = false)
    public void testCase6(){
        System.out.println("Test Case 6");
    }

    @Test(dependsOnMethods = {"testCase4"},dependsOnGroups = {"myGroup"}, alwaysRun = true)
    public void testCase7(){
        System.out.println("Test Case 7");
    }
}

①description代表测试用例描述,控制台会打印输出该描述。
②priority代表优先级,数字越小,优先级越高,默认值为0。testCase2的priority值为2,会最后一个执行;testCase3的priority值为1,会倒数第二个执行。如果级别一样,则执行顺序默认按方法名排序。
③enabled的默认值为true,代表不启用。当enabled的值为false时,表示禁用,因此testCase6并未执行。
④testCase4和testCase5都抛出了运行时异常,因此执行失败。
⑤dependsOnMethods代表依赖一个或多个方法,dependsOnGroups代表依赖一个或多个分组。一旦被依赖的测试用例执行失败,则TestNG将跳过该测试用例。
但没有跳过testCase7,原因是testCase7加了alwaysRun方法,并将值设为true,代表始终执行,在默认情况下,该值为false。建议尽量不要使用dependsOnMethods和dependsOnGroups,因为违背了测试用例需要解耦的原则。

@Test的属性expectedExceptions

在TestNG中,@Test注解的expectedExceptions属性用于指定测试方法预期抛出的异常类型。如果测试方法执行时抛出了与expectedExceptions属性指定的异常类型相同的异常,那么测试会被认为是成功的;如果抛出了其他类型的异常或者没有抛出任何异常,那么测试会失败。

使用expectedExceptions属性的基本语法如下:

@Test(expectedExceptions = ExceptionClass.class)
public void testMethod() {
    // 测试逻辑,预期会抛出 ExceptionClass 类型的异常
}

其中,ExceptionClass.class应该替换为你预期测试方法会抛出的异常的具体类型。

以下是一个简单的例子:

import org.testng.annotations.Test;

public class MyTestClass {

    @Test(expectedExceptions = NullPointerException.class)
    public void testThrowException() {
        String str = null;
        int length = str.length(); // 这行会抛出 NullPointerException
    }

    @Test
    public void testNoExceptionThrown() {
        String str = "hello";
        int length = str.length(); // 这行不会抛出异常
    }
}

在这里插入图片描述

在上面的例子中,testThrowException方法预期会抛出一个NullPointerException,因为尝试获取一个null字符串的长度。如果这个方法真的抛出了NullPointerException,那么测试就会通过。相反,testNoExceptionThrown方法不会抛出任何异常,所以它不需要(也不应该)使用expectedExceptions属性。

请注意,expectedExceptions属性只能指定一个预期的异常类型。如果你预期测试方法可能会抛出多种类型的异常,那么你需要使用更复杂的异常处理逻辑,而不是依赖expectedExceptions属性。

此外,TestNG还提供了expectedExceptionsMessage属性,用于检查抛出的异常是否具有特定的消息。这两个属性可以组合使用,以便更精确地控制测试的预期行为。

@Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessage = "Cannot invoke \"String.length()\" because \"str\" is null")
public void testThrowExceptionWithMessage() {
    String str = null;
    int length = str.length(); // 这行会抛出带有特定消息的 NullPointerException
}

在这个例子中,测试不仅预期会抛出NullPointerException,还预期异常消息中包含特定的文本。

@Test的属性invocationCount

在TestNG中,@Test注解的invocationCount属性用于指定测试方法的调用次数。这允许你重复执行相同的测试方法多次,以确保测试的可靠性和稳定性。

invocationCount属性的值是一个整数,表示测试方法应该被调用的次数。每次调用都会作为单独的测试实例来执行,并且测试结果会分别记录。

下面是一个使用invocationCount属性的示例:

import org.testng.annotations.Test;

public class invocationCountTest {
    @Test(invocationCount = 5,invocationTimeOut = 1000)
    public void testMethod() {
        // 测试逻辑
        // 这个方法会被调用5次
        System.out.println("testMethod");
    }
}

在上面的例子中,testMethod方法会被调用5次。每次调用都是独立的,并且测试结果会分别记录。如果其中任何一次调用失败,那么整个测试会被认为是失败的。

使用invocationCount属性可以帮助你发现那些可能在某些情况下通过,但在其他情况下失败的间歇性问题。通过重复执行测试,你可以增加捕捉到这些问题的机会。

需要注意的是,使用invocationCount属性会增加测试的执行时间,因为测试方法会被多次调用。因此,你应该谨慎使用这个属性,避免不必要的重复执行。

invocationTimeOut为超时时间。
invocationTimeOut属性用于设置测试方法每次调用的超时时间。这个属性指定了一个最大的毫秒数,用于限制测试方法单次调用的执行时间。如果测试方法在一次调用中的执行时间超过了这个设定的超时时间,那么TestNG会抛出异常,并标记该次调用为失败。

此外,invocationCount属性通常与其他TestNG属性(如dependsOnMethodspriority等)结合使用,以实现更复杂的测试执行策略。通过合理地组合这些属性,你可以构建出灵活且强大的测试套件。

@Test timeout属性

在TestNG中,@Test注解的timeout属性用于设置测试方法的超时时间。这个属性指定了一个最大的毫秒数,用于限制测试方法的执行时间。如果测试方法的执行时间超过了这个设定的超时时间,TestNG会抛出异常,并标记该测试方法为失败。

timeout属性的使用对于确保测试方法不会无限期地运行或者在执行过程中卡住是非常有用的。它可以帮助你识别那些可能由于各种原因(如外部资源不可用、无限循环等)导致执行时间过长的测试方法。

下面是一个使用timeout属性的示例:

import org.testng.annotations.Test;

public class MyTestClass {

    @Test(timeout = 3000) // 设置超时时间为3000毫秒(即3秒)
    public void testMethod() {
        // 测试逻辑
        // 如果这个方法执行时间超过3秒,TestNG会抛出异常并标记测试为失败
    }
}

在上面的例子中,testMethod方法的执行时间被限制为3秒。如果这个方法在3秒内没有完成执行,TestNG会中断测试并标记它为失败。

需要注意的是,timeout属性是设置单个测试方法的超时时间,而不是整个测试套件或测试类的超时时间。如果你需要为整个测试套件或测试类设置超时时间,你可能需要编写自定义的逻辑或使用其他测试框架提供的功能。

此外,timeout属性的值应该根据测试方法的实际执行时间来合理设置。如果设置得太短,可能会导致一些正常但需要较长时间的测试方法被误判为失败。如果设置得太长,则可能无法有效地检测出那些执行时间过长的测试方法。因此,在设置timeout属性时,你需要根据测试方法的实际需求和预期执行时间来做出权衡。

class级别的注解

@Test不仅可以注解在测试方法上,还可以注解在类上。

@Test
public class Test1 {
  public void test1() {
  }

  public void test2() {
  }
}

类级别的@Test注解使这个类的所有公开方法称为测试方法,即使测试方法没有用@Test注解。如果想添加具体的属性,仍然可以使用@Test来注注解测试方法。

@Test
public class Test1 {
  public void test1() {
  }

  @Test(groups = "g1")
  public void test2() {
  }
}

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

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

相关文章

日期时间总结 java

日期时间 1 Date基础2 SimpleDateFormat3 currentTimeMillis4 Calendar5 时间转化5.1 date 时间戳5.2 date String5.3 cal date 6 其他7 练习题题1 1 Date基础 .getYear() .getMonth() 1 .getDate() 几号 .toLocaleString() 转换为本地时区 getTime():返回自1970年…

git am XXX.patch 文件内容解析

git am XXX.patch 文件内容解析 打补丁的两种方式: 1.patch XXX.patch 2.git am XXX.patch 例如: diff --git a/drivers/crypto/se/ce.c b/drivers/crypto/se/ce.c index e6f68286d4ce6..de1bcb46fbe6b 100644 --- a/drivers/crypto/se/ce.cb/drive…

本地部署开源免费文件传输工具LocalSend并实现公网快速传送文件

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-X4xB3gSR3z2VUfmN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

IDEA 设置类注释模板作者、日期、描述等信息(推荐标准!)

idea注释模版配置 idea作为越来越多程序员使用的开发工具,平时的代码注释也非常的关键,类上注释和方法上注释每次换电脑或者新同事入职都要统一修改,找了网上好多教程都写的乱七八糟的啥都有,为方便统一就自己写一个操作方法&…

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK,发布到Linux报错还是本地OK,但是Linux能运行的,但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下,发现了能实现功能的方法有四种 U…

ppt技巧:如何将Word文档大纲中导入到幻灯片中?

在PowerPoint中,将Word文档的大纲导入到新的幻灯片是一种非常实用的技巧。以下是详细的步骤: 首先,需要打开PowerPoint软件并打开原始的幻灯片文件。 在PowerPoint的顶部【开始】菜单栏中,找到并点击“新建幻灯片”按钮&#xff0…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp,然后右键hmdp下的表,选择运行SQL文件,然后指定运行文件hmdp.sql即可(建议MySQL的版本在5.7及以上): 下面这…

本科大学生计算机毕业设计案例:遗失物品信息管理系统

设计需求: 客户需求: 项目所用技术: 后端:springBoot,mybatisPlus,springSecurity,Swagger2 前端:vue-element-admin,elementUi 数据库:mysql,redis 数据库表设计: 关键代码展示&a…

使用geneHapR进行基因单倍型分析(以vcf文件为例)

前记 在群体基因组学研究中,我们常常需要知道一些位点的变异情况,以便于根据对应的表型信息估算这些位点的效应,同时了解这些位点在不同亚群之间的变化情况。这个时候我们就需要进行单倍型分析(Haplotype Analysis),单倍型分析是研…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 (1)网络协议:计算机网络和分布系统中…

AndroidAutomotive模块介绍(三)CarService服务

前言 上一篇文档总结 Android Automotive 框架的 APP 和 API 部分内容,本篇文档将会继续根据 Android Automotive 框架结构,总结 Framework 层 CarService 服务的内容。 本文档对 Android Automotive Framework 层服务将会按照如下顺序展开描述&#x…

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…

一、flask入门和视图

run启动参数 模板渲染 后端给前端页面传参 前端页面设置css from flask import Flask, render_template,jsonify# 创建flask对象 app Flask(__name__)# 视图函数 路由route app.route("/") def hello_world():# 响应,返回给前端的数据return "h…

将数学表达式对分子分母先因式分解再约分化简simplify()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数学表达式 对分子分母 先因式分解 再约分化简 simplify() [太阳]选择题 请问以下输出结果正确的是: from sympy import simplify from sympy.abc import x, y A (x**2 2*x 1)…

第07-2章 TCP/IP模型

7.7 TCP/IP模型详解 7.7.1 简介 应用层的PDU>APDU(Application PDU) 表示层的PDU>PPDU(Presentation PDU) 会话层的PDU>SPDU(Session PDU) 7.7.2 TCP/IP协议体系 (1)TCP…

【尝试】域名验证:配置github二级目录下的txt文件

【尝试】域名验证:配置github二级目录下的txt文件 写在最前面一、初始化本地仓库二、设置远程仓库1. 远程仓库 URL 没有设置或设置错误添加远程仓库修改远程仓库 2. 访问权限问题3. 仓库不存在步骤 1: 在你的仓库中添加文件步骤 2: 确认GitHub Pages设置步骤 3: 访问…

原型模式:复制对象的智能解决方案

在软件开发过程中,对象的创建可能是一个昂贵的操作,特别是当对象的初始化包括从数据库加载数据、进行IO操作或进行复杂计算时。原型模式是一种创建型设计模式,它通过复制现有的实例来创建新的对象实例,从而避免了类初始化时的高成…

高校实习管理系统的设计与实现(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统高校实习管理系统信息管理难度大,容错率低&am…

llama-factory SFT系列教程 (三),chatglm3-6B 命名实体识别实战

背景 llama-factory SFT系列教程 (一),大模型 API 部署与使用llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署本文为llama-factory SFT系列教程 第三篇 简介 利用 llama-factory 框架,基于 chatglm3-6B 模型 做命名…

Linux内核之自旋锁:自旋锁初始化之spin_lock_init用法实例(四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…