java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)

46f9c17be2f07d3c14240266c63fac5a.png

前言

我们在前面的文章中,和大家分享过接口自动化测试一些基本的实现方法,但是,你很快就会发现,如果在测试脚本中硬编码测试数据的话,测试脚本灵活性会非常低。而且,对于那些具有重复的请求,而只是测试入参不同的用例来说,就会存在大量重复的代码。那么怎么把自己从简单、重复的工作中解放出来呢?这个时候我们应考虑把测试数据和测试脚本分离,也就是说数据驱动

数据驱动的优势?

  • 数据驱动很好地解决了大量重复脚本的问题,实现了“测试脚本和数据的解耦”。目前几乎所有主流的自动化测试工具和框架都支持。

  • 数据驱动测试的数据不仅可以包括测试输入数据,还可以包含测试验证结果数据,甚至可以包含测试逻辑分支的控制变量。

  • 数据驱动的测试思想不仅适用于接口测试,也适合与单元测试,UI自动化测试,性能测试等

常见提供数据的方式?

  • 硬编码

  • txt文件

  • Json

  • Yaml

  • 配置文件properties

  • execl

  • db

  • 网络中

数据驱动的原理?

测试脚本中通过 data provider 去数据源中读取一行数据,赋值给相应的变量,执行用例。接着再去文件中读取下一行数据,读取完所有的数据后,测试结束。参数化文件中有几行数据,测试用例就会被执行几次。如图所示:d5b9f58bc103d0322977ed3c01ce76df.png

TestNG如何实现?

我们可以在每个测试方法上使用任意数量的参数,并指示 TestNG 使用 @Parameters 注释传递正确的参数。

TestNG有两种方法可以设置这些参数(@Factory 数据工厂不在此介绍):

  • 使用 testng.xml 1a6f32386b7c7b8c66c0002e5c768a6f.png

  • DataProvider 67de4ae036b2d9e1a8d6317bcdddef55.png

b8cc2184e406dc86bd8ce74a56f2be0b.png 注意:

  • TestNG.xml 中的参数可以是套件或测试级别;

  • DataProvider 中的参数可以将 Method 和 ITestContext 作为参数。

testng.xml 中的参数

如果简单参数,则可以在 testng.xml 中指定它们,在以下代码中,我们指定的参数 name 和 age 值。此 XML 参数在 testng.xml 中 定义:

name="parameter">

name="param">

name="name" value="zhangsan"/>

name="age" value="10"/>

name="com.zuozewei.springboottestngdatadrivendemo.paramter.ParamterTest"/>

测试方法将分别接收参数 name 和 age 的值。

@Slf4j

public class ParamterTest {

@Test

@Parameters({"name","age"})

public void paramTest(String name,int age){

log.info("name = [{}] ; age = [{}]" ,name,age);

}

}

注意 @Parameters 可以被放置在下列位置:

  • 在任何已经有 @Test,@Before/After 或 @Factory 注释的方法上;

  • 最多只有一个测试类的构造函数。在这种情况下,TestNG 将调用此特定构造函数,并在需要实例化测试类时将参数初始化为 testng.xml 中指定的值。此功能可用于将类中的字段初始化为测试方法随后将使用的值。

@Parameters({ "name", "age" })

@BeforeMethod

public void beforeTest(String name, String age) {

m_name = name; // 查询数据源值

m_age = age;

}

注意:

  • XML 参数按照与注释中相同的顺序映射到 Java 参数,如果数字不匹配,TestNG 将报错;

  • 参数是存在作用域的。在 testng.xml 中,可以在 suite 标记下或 test 下声明它们 。如果两个参数具有相同的名称,则它是 test 中定义的具有优先权。如果需要指定适用于所有测试的参数并仅为某些测试覆盖其值,这将非常方便。

使用 DataProviders 的参数

如果需要传递复杂参数或需要从 Java 创建的参数(复杂对象,从文件或数据库读取的对象等等),则在 testng.xml 中指定参数可能不够。在这种情况下,可以使用数据提供程序提供测试所需的值。数据提供程序是类上的一个方法,它返回一组对象数组。此方法使用 @DataProvider 注释。

简单使用

@DataProvider函数,需要定义属性 name:

@DataProvider(name="data")

public Object[][] providerData(){

Object[][] objects = new Object[][]{

{"zhangsan",10},

{"lisi",20},

{"wangwu",30}

};

return objects;

}

@Test 测试用例,属性 dataProvider 需要指定对应的数据提供者名称。

@Test(dataProvider = "data")

public void testDataProvider(String name,int age){

log.info("name = [{}] ; age = [{}]" ,name,age);

}

执行结果:

name = [zhangsan] ; age = [10]

name = [lisi] ; age = [20]

name = [wangwu] ; age = [30]

===============================================

Default Suite

Total tests run: 3, Failures: 0, Skips: 0

===============================================

@DataProvider函数插入参数使用

@DataProvider 函数可以插入 Method 和 ITestContext 类型参数,这两个参数里面可以获取很多有用的信息。

@DataProvider函数:

@DataProvider(name="methodData")

public Object[][] methodDataTest(Method method){

Object[][] result=null;

if(method.getName().equals("test1")){

result = new Object[][]{

{"zhangsan",20},

{"lisi",25}

};

}else if(method.getName().equals("test2")){

result = new Object[][]{

{"wangwu",50},

{"zhaoliu",60}

};

}

return result;

}

@Test 测试执行脚本:

@Test(dataProvider = "methodData")

public void test1(String name,int age){

log.info("test111方法: name = [{}] ; age = [{}]" ,name,age);

}

@Test(dataProvider = "methodData")

public void test2(String name,int age){

log.info("test222方法: name = [{}] ; age = [{}]" ,name,age);

}

执行结果:

test111方法: name = [zhangsan] ; age = [20]

test111方法: name = [lisi] ; age = [25]

test222方法: name = [wangwu] ; age = [50]

test222方法: name = [zhaoliu] ; age = [60]

===============================================

Default Suite

Total tests run: 7, Failures: 0, Skips: 0

===============================================

延迟数据提供者

有的场景我们需要大量参数进行读取,比如参数数据源是 DB,而数据达到百万级,这样测试程序遍历所有数据时,可能就会导致内存溢出,

那么我们怎样解决这个问题?当我们获取了一条数据,对它执行测试方法,然后就废弃这个数据对象,再测试下一个书。这个原则是延迟初始化,这个思想就是当你真正需要一个对象时才创建它,而不是提前创建它。

为了实现这种方法,TestNG 允许我们从数据提供者返回一个 Iterator 对象,而不是一个二维对象数组。

Iterator 是 java.util 包中的一个接口,它的方法签名如下:

public interface Iterator<E> {

boolean hasNext();

E next();

default void remove();

}

它可以通过 next 调用下一组数据,这样就有机会在最后一刻实例化相应的对象,即刚好在需要在这些参数的测试方法被调用之前。

下面例子是重写后的例子,我们实现了一个 Iterator,它将返回 4 个带有不同ID的对象:

public class AccoutIterator implements Iterator {

private int index =0;

static private final int MAX =4;

@Override

public boolean hasNext() {

return index < MAX;

}

@Override

public Object next() {

return new Object[]{

//这里就是放入要实现的对象或者一组数据

"延迟数据提供:"+ (index++)

};

}

@Override

public void remove() {

throw new UnsupportedOperationException("remove");

}

@DataProvider函数调用:

@DataProvider(name = "iterator")

public Iterator<Object[]> iteratorDataProvider(){

return new AccoutIterator();

}

@Test测试运行函数:

@Test(dataProvider = "iterator")

public void testcase2(String name){

log.info(" name = [{}] " ,name);

}

运行结果:

name = [延迟数据提供:0]

name = [延迟数据提供:1]

name = [延迟数据提供:2]

name = [延迟数据提供:3]

===============================================

Default Suite

Total tests run: 4, Failures: 0, Skips: 0

===============================================

其他的高级玩法

数据提供程序可以与并行属性并行运行:

@DataProvider(parallel = true)

// ...

从 XML 文件运行的并行数据提供程序共享相同的线程池,默认情况下大小为 10。可以在 XML 文件的 suite 标记中修改此值:

name="Suite1" data-provider-thread-count="20" >

如果要在不同的线程池中运行几个特定的数据提供程序,则需要从其他 XML文件运行它们。

小结

这篇的知识点:

  • 需要参数化来创建数据驱动测试;

  • TestNG 支持两种参数化,使用 @Parameter + TestNG.xml 并使用 @DataProvider;

  • 在 @Parameter + TestNG.xml中,参数可以放在套件级别和测试级别。如果在两个地方声明相同的参数名称,测试级别参数将优先于套装级别参数;

  • 使用 @Parameter + TestNG.xml,一次只能设置一个值,但 @DataProvider 返回一个2维的 Object 数组;

  • 如果 DataProvider 存在于不同的类中,那么测试方法所在的类,DataProvider 应该是静态方法;

  • 有通过支持两个参数的 DataProvider 的方法和 ITestContext;

  • TestNG 允许我们从数据提供者返回一个 Iterator 对象,实现延迟提供数据。

当然,DataProvider 只是从行为操作上分离了数据的提供方式,没有从根本上解决自动化测试中测试数据本身的稳定性、快速响应变化、数据丢失、数据被修改的这些难点和阻碍:

  • 比如生产数据库里的数据导入并刷新测试数据库,之前用例里使用的数据被覆盖;

  • 比如几个小组在一个系统里使用同一个测试数据库,AB组使用存在交叉,B组还要把数据改变一下再用,或者B组用完后测试数据已经发生改变;

  • 比如使用的测试数据具备时效性,状态会改变的,从 active 变成 inactive 的等;

自动化测试的其他方面都不是什么大问题,最主要的阻碍就是测试数据本身(特别是在真实的测试环境上时)。

本文源码:

https://github.com/7DGroup/Java-API-Test-Examples/tree/master/springboot-testng-data-driven-demo

参考资料:[1]:https://blog.csdn.net/LangSand/article/details/53895654 [2]:https://testng.org/doc/index.html [3]:软件测试52讲 茹炳晟

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

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

相关文章

Windows更新右下角出现 天气温度等提示,如何取消

Windows更新后出现桌面下面出现 天气温度等提示&#xff0c;如何取消 解决&#xff1a;点击鼠标右键

经济专业为什么学python_既然有了会计学专业,为什么还要有税收学专业?

很多人说会计学也学税务知识&#xff0c;税务局招收公务员也面向会计&#xff0c;税务师事务所也招会计专业&#xff0c;那还有设置税收学专业的必要吗&#xff1f;按照国际通用说法&#xff0c;税收学只是会计学的组成部分&#xff0c;也可以说是一个方向&#xff0c;考会计师…

解决MongoDB Compass

远程连接mongoDB踩过的坑 我使用的是阿里云的服务器&#xff0c;用在服务器上安装完mongoDB之后&#xff0c;使用mongoDB Compass远程连接&#xff0c;连接不上。防火墙27017端口开放了&#xff0c;阿里云安全组27017端口也开放了&#xff0c;还是无法成功。 最后发现ping我的…

预测回归_回归分析预测技术简介

回归分析的基本概念是用一群变量预测另一个变量的方法。通俗点来讲&#xff0c;就是根据几件事情的相关程度来预测另一件事情发生的概率。回归分析的目的是找到一个联系输入变量和输出变量的最优模型。回归方法有许多种&#xff0c;可通过 3 种方法进行分类&#xff1a;自变量的…

【MongoDB 工具篇】MongoDB Compass介绍与简单使用

MongoDB Compass 是一款GUI工具&#xff0c;用于对MongoDB进行简单管理。 1 软件环境 使用的软件分别为&#xff1a; MongoDB Compass 1.19.12 MongoDB 4.2.0 2 软件介绍 2.1 连接到主机界面 安装完MongoDB Compass后&#xff0c;打开软件&#xff0c;进入连接到主机界面…

计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块

计算机网络&#xff1a;一个自治系统有5个局域网&#xff0c;其连接图如图所示。LAN2至LAN5上的主机数分别为&#xff1a;91&#xff0c;150&#xff0c;3&#xff0c;15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块&#xff08;包括前缀&#xf…

使用python打印数字三角形_11届省赛python试题 H: 数字三角形

试题 H: 数字三角形【问题描述】上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右…

csdn博客markdown 如何输入上下标(如平方指数等)

csdn博客markdown 如何输入上下标&#xff08;如平方指数等&#xff09; 输入上标&#xff0c;如&#xff1a;x2&#xff0c;则输入x^2^ 输入下标&#xff0c;如&#xff1a;x0&#xff0c;则输入 x~0~

取消语法检测_中考取消了考纲,学生要如何得高分

日前&#xff0c;教育部宣布取消初中学业水平考试大纲。对于广州的考生而言&#xff0c;意味着中考考纲取消。连日来&#xff0c;这一消息引发了学生、家长、老师们的巨大关注。为此&#xff0c;广州日报邀请了广州大学附属中学语文一级教师王琪、数学高级教师罗剑文以及广州广…

java中的ListNode链表

ListNode 刷LeetCode碰到一个简单链表题&#xff0c;题目已经定义了链表节点ListNode struct ListNode {int val; //定义val变量值&#xff0c;存储节点值struct ListNode *next; //定义next指针&#xff0c;指向下一个节点&#xff0c;维持节点连接}在节点ListNode定义…

暴风酷播云二期配置_暴风播酷云二期 黑群晖

暴风播酷云二期 安装黑群晖 全记录安装前准备硬件准备拆机&#xff0c;主板扣掉电池后&#xff0c;用螺丝刀或其他导体连接主板上放置纽扣电池的正负极造成短路放电。软件准备下载群晖引导文件&#xff0c;本文中采用1.04b&#xff1b;下载群晖系统文件&#xff0c;群晖官网即可…

判定覆盖与条件覆盖的区别

判定覆盖与条件覆盖的区别 判定覆盖只关心判定表达式的值&#xff08;真/假&#xff09;&#xff0c;而条件覆盖涉及到判定表达式的每个条件的值&#xff08;真/假&#xff09;。 举个最简单的例子&#xff0c;方便理解&#xff1a; 判定表达式&#xff1a;a>1 or b>1…

mysql scrapy 重复数据_MySQL大数据量表中删除重复记录

MySQL大数据量表中删除重复记录最近工作中需要抓取大量新闻&#xff0c;抓取的数据中由于一些原因存在一些重复数据&#xff0c;而整个数据表的记录数接近10万条&#xff0c;大小接近1个G&#xff0c;又在我自己的渣渣本本上&#xff0c;查询速度十分不理想&#xff0c;想要完成…

某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女,任中层领导

软件测试——决策表 10.某公司为本科以上学历的人重新分配工作&#xff0c;分配原则如下。 (1)如果年龄不满18岁&#xff0c;学历是本科&#xff0c;男性要求报考研究生&#xff0c;女性则担任行政工作; (2)如果年龄满18岁不满5o 岁&#xff0c;学历本科&#xff0c;不分男女&…

分布式锁 哨兵模式_手撕redis分布式锁,隔壁张小帅都看懂了!

前言上一篇老猫和小伙伴们分享了为什么要使用分布式锁以及分布式锁的实现思路原理&#xff0c;目前我们主要采用第三方的组件作为分布式锁的工具。上一篇运用了Mysql中的select …for update实现了分布式锁&#xff0c;但是我们说这种实现方式并不常用&#xff0c;因为当大并发…

.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时,用1个字母加3位数字表

软件测试——等价类划分法 1.某学校的学生公寓有14栋楼&#xff0c;用A&#xff5e;N这14个大写字母的其中一个代表楼号&#xff0c;每栋楼的层数为6层&#xff0c;用1&#xff5e;6六个数字表示。每层楼有40个房间&#xff0c;编号为01&#xff5e;40。具体表示一个宿舍房间时…

python 贪吃蛇大作战_python实现简单贪吃蛇游戏

本文实例为大家分享了python实现贪吃蛇游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码&#xff1a;from turtle import *from random import randrangefrom time import sleep### 定义变量snake [[0,0],[10,0],[20,0],[30,0],[40,0],[50,0]]apple_x rand…

如何免费下载和安装Windows 11

微软今天放出了 Windows 11 Build 22000.51 预览版&#xff0c;如果你想要尝鲜或者冒险&#xff0c;那么本文分享如何免费下载和安装 Windows 11 的小技巧。再次需要提醒的是&#xff0c;目前 Windows 11 系统极不稳定&#xff0c;充斥着大量 BUG&#xff0c;可能会导致系统崩溃…

python函数被调用才能执行吗_python3x函数在不被调用的情况下运行

这是我的密码code__author__ Jared Reabow__name__ Assignment 2 Dice game#Date created: 14/11/2014#Date modified 17/11/2014#Purpose: A game to get the highest score by rolling 5 virtual dice.import random#pre defined variablesNumberOfDice 5 #this variable …

Java 为什么数组下标只能为int不能为long?int32位,为何最大值不是2^32 -1 ? java基本类型取值范围

一个小标为int的byte数组全部放满东西需要的内存为&#xff08;2^31-11&#xff09;*1b2Gb0.25GB 一个小标为long的byte数组全部放满东西需要的内存为&#xff08;2^631)*1b 需要的内存太大 &#xff01;&#xff01; byte&#xff1a; byte 数据类型是8位、有符号的&#xf…