您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java自动化测试框架(TestNG)——分组测试

时间:2020-07-26 12:53:37  来源:  作者:

 

Java自动化测试框架(TestNG)——分组测试

 

我们在测试时,可能会遇到以下几种测试分组的场景:

  • 一个测试类当中有多个测试方法,只想执行其中的几个相关的测试方法。
  • 当几个相关的方法依赖相同的 setUp、tearDown操作。
  • 当某个方法依赖几个相关的方法时,如几个相关的方法执行通过后,才执行该方法。

我们可以通过设置 测试方法分组 的方式来解决上述问题。

分组测试是TestNG中的一个新的创新功能,它在JUnit框架中是不存在的。 在文中,我们将演示如何在TestNG中进行分组测试。

场景一:一个测试类当中有多个测试方法,只想执行其中的几个相关的测试方法。

代码示例如下,我们将TestDemo测试类的四个方法,通过@Test(groups = "") 方式,分成了两个组,分别为apiTest、databaseTest。

package framework.parse;

import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;

public class TestDemo {

        @Test(groups = "apiTest")
        public void runApi1() {
            System.out.println("runApi1()");
        }

        @Test(groups = "apiTest")
        public void runApi2() {
            System.out.println("runApi2()1");
        }

        @Test(groups = "databaseTest")
        public void testOracle() {
            System.out.println("testOracle()");
        }

        @Test(groups = "databaseTest")
        public void testMySQL() {
            System.out.println("testMySQL");
        }
        
}

通过testng.xml文件进行运行配置管理,如下,我们仅运行framework.parse.TestDemo测试类中的databaseTest分组。

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

    <test name="testDemo">

        <groups>
            <run>
                <include name="databaseTest" />
            </run>
        </groups>

        <classes>
            <class name="framework.parse.TestDemo" />
        </classes>

    </test>

</suite>

运行结果如下:

Run testMySql
Run testOracle
===============================================
TestSuite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================

场景二:当几个相关的方法依赖对应的 setUp、tearDown操作。

我们可以通过@BeforeGroups、@AfterGroups方法实现用例组的setUp、tearDown操作,代码示例如下:

package framework.parse;

import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;

public class TestDemo {

        @BeforeGroups("databaseTest")
        public void setUpDB() {
            System.out.println("Run init database");
        }

        @AfterGroups("databaseTest")
        public void tearDownDB() {
            System.out.println("Run clean database");
        }

        @Test(groups = "databaseTest")
        public void testOracle() {
            System.out.println("Run testOracle");
        }

        @Test(groups = "databaseTest")
        public void testMySql() {
            System.out.println("Run testMySql");
        }

}

运行结果如下,在执行databaseTest分组中的用例之前,执行了setUpDB 方法,在databaseTest分组分组中的用例执行完成后,执行了tearDownDB方法:

Run init database
Run testMySql
Run testOracle
Run clean database
===============================================
Default Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

场景三:当某个方法依赖几个相关的方法时

我们可以通过 @Test(dependsOnGroups = { "" }) 方法实现优先执行依赖测试组,当依赖测试组执行通过后,则执行被依赖方法,否则跳过被依赖方法。代码示例如下:

import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;

public class TestDemo {
        @Test(groups = "apiTest")
        public void runApi1() {
            System.out.println("Run runApi1");
        }

        @Test(groups = "apiTest")
        public void runApi2() {
            System.out.println("Run runApi2");
        }

        @Test(groups = "databaseTest")
        public void testOracle() {
            System.out.println("Run testOracle");
        }

        @Test(groups = "databaseTest")
        public void testMySql() {
            System.out.println("Run testMySql");
        }

        @Test(dependsOnGroups = { "databaseTest", "apiTest" })
        public void runFinal() {
            System.out.println("runFinal");
        }


}

上述代码示例中,runFinal 方法依赖databaseTest组、apiTest组方法,需要在这两个组的方法执行通过后,才可以执行runFinal方法,我们通过 @Test(dependsOnGroups = { "databaseTest", "apiTest" }) 注解的方式来实现,运行代码,执行结果如下:

Run runApi1
Run runApi2
Run testMySql
Run testOracle
runFinal
===============================================
Default Suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================

如果当依赖的测试组里在运行过程中存在失败的用例,则runFinal方法将被跳过,示例代码如下:

import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;

public class TestDemo {
        @Test(groups = "apiTest")
        public void runApi1() {
            System.out.println("Run runApi1");
          	// 运行失败
            Assert.assertEquals(1,2);
        }

        @Test(groups = "apiTest")
        public void runApi2() {
            System.out.println("Run runApi2");
        }

        @Test(groups = "databaseTest")
        public void testOracle() {
            System.out.println("Run testOracle");
        }

        @Test(groups = "databaseTest")
        public void testMySql() {
            System.out.println("Run testMySql");
        }

        @Test(dependsOnGroups = { "databaseTest", "apiTest" })
        public void runFinal() {
            System.out.println("runFinal");
        }


}

如上,示例代码中apiTest分组中的runApi1测试用例将断言失败,此时运行测试用例,执行结果如下,我们会看到runFinal方法被没有被执行,而是跳过。

Run runApi1

JAVA.lang.AssertionError: expected [2] but found [1]
Expected :2
Actual   :1
	at org.testng.Assert.fail(Assert.java:94)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

Run runApi2
Run testMySql
Run testOracle
Test ignored.

===============================================
Default Suite
Total tests run: 5, Failures: 1, Skips: 1
===============================================



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  Tags: Java  点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Tags: Java  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === &#39;a&#39;) { b = true} else { b = false}// goodb = a === &#39;a&#39;2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: Java  点击:(5)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  Tags: Java  点击:(10)  评论:(0)  加入收藏
传统游戏项目一般使用TCP协议进行通信,得益于它的稳定和可靠,不过在网络不稳定的情况下,会出现丢包严重。不过近期有不少基于UDP的应用层协议,声称对UDP的不可靠进行了改造,这意...【详细内容】
2021-12-23  Tags: Java  点击:(12)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  Tags: Java  点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  Tags: Java  点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  Tags: Java  点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  Tags: Java  点击:(17)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  Tags: Java  点击:(19)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条