前言

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

数据驱动的优势?

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

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

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

常见提供数据的方式?

  • 硬编码

  • txt文件

  • Json

  • Yaml

  • 配置文件properties

  • execl

  • db

  • 网络中

数据驱动的原理?

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

TestNG如何实现?

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

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

  • 使用 testng.xml 

  • DataProvider 

 注意:

  • 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讲 茹炳晟

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

  1. java移动端接口测试_使用java如何进行接口测试

    关于接口测试, 我们之前介绍过很多方法了, 有postman, soapUI, Jmeter等, 他们各有优势和劣势, 今天和大家分享的是如何用java TestNG来实现接口测试. 开始测试之前需要 ...

  2. java移动端接口测试_移动端质量体系之性能测试(上)

    目前应用越来越多,竞争也越来越激烈,那用户体验就变得越来越重要.曾经一份报告这么说: 71%用户希望在手机上打开网页能跟电脑一样快 5秒钟被认为是用户能忍受的最长响应时间,如果响应时间超过5秒,50% ...

  3. java移动端接口测试_借助Charles来测试移动端-下篇

    本篇是借助Charles来测试移动端的下半篇.(上篇任意门点我) 上次说到可以借助Charles来抓移动端的网络请求,接下来,我们来看一下怎么通过Charles来模拟返回,还是以网页版豆瓣为例. 先找 ...

  4. java多端登录_【Java】一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录...

    需求场景 说起登录,你可能会不屑一顾,还有比这更简单的功能吗? 获取一下用户提交参数 username + password 和数据库中一比对,有记录返回[登录成功],无记录返回[用户名或密码错误] ...

  5. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  6. 后端代码之服务端 - MongoDB数据库的连接、重启测试与(Studio3T)查看 - 讲解篇

    文章目录 前言 一. 在项目中安装Mongoose中间件 二. 安装完毕,新建一个路由作为测试路由 通过WebStorm软件,打开项目,编辑index.js文件: 三.重启服务,浏览器查看:测试连接是 ...

  7. 走进Java接口测试大门之测试框架TestNG

    一.简介 TestNG 是一个受 JUnit 和 NUnit 启发的测试框架,旨在简化广泛的测试需求,从单元测试到接口测试. 但引入了一些新功能,使其更强大,更易于使用,例如: 注释. 在线程池中运行 ...

  8. java 是否含有日文_《JAVA编程思想》5分钟速成:第9章(接口)

    第9章 接口 前言: 1.抽象类(abstract class)和接口(interface)有什么异同? 2.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(n ...

  9. java 外部接口调用 设计模式_《Java设计模式》之接口模式

    -----------模式是思想的体现,而非具体的实现. 抽象的讲,类的接口是类允许其他类对象访问的方法与字段集.接口通常代表一种承诺,即方法需要实现接口方法名表示的操作,遵循代码注释和其他文档说明, ...

最新文章

  1. 【线性回归】面向新手的基础知识
  2. SAP标准培训课程C4C10学习笔记(三)第三单元
  3. 八段锦八个动作名称_八段锦工间操“动”起来 全民健身精气神“燃”起来
  4. (日常搬砖)之environment.yml的使用
  5. 微信小程序——尤克里里和弦查询
  6. PHP云购源码附教程(源码)
  7. 【全网最全】Python Package Installer (pip)镜像源使用
  8. 【React】利用Dooringx快速制作H5搭建平台
  9. python图像质量评价_图像质量评价和视频质量评价(IQA/VQA)
  10. Visual studio 无法打开源文件的问题或系统找不到指定文件
  11. Google IO 2018开发者大会:Android P
  12. SpringBoot——检索
  13. RE:Working outside of application context
  14. ubuntu16.04安装onlyoffice
  15. Unity3D —— 手机设备震动接口
  16. 【思维导图】Excel转成思维导图
  17. 开源的跨平台AI模型部署总有一款是你的菜
  18. Python图像识别-Opencv02 二值图像、灰度图像以及彩色图像
  19. 末日启示:向死而生--《罗辑思维》第一季第一期
  20. automator来解决mac terminal终端快速连接

热门文章

  1. aptitude_PHP Numbers Aptitude问题与解答
  2. tohexstring方法_Java Float类toHexString()方法的示例
  3. 如何在python中获取浮点数的十六进制值?
  4. nodejs在Liunx上的部署生产方式-PM2
  5. jsp中redirect和forward的区别
  6. VB中KeyCode常数用法 VB 按键
  7. C语言文本文件与二进制文件转换
  8. python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “
  9. java.lang.ClassNotFoundException: retrofit2.Retrofit$Builder解决思路
  10. python基础学习_转行零基础该如何学习python?很庆幸,三年前的我选对了