广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >TestNG数据驱动简介
  • 874
分享到

TestNG数据驱动简介

java教程java 2021-10-13 07:10:36 874人浏览 无得
摘要

TestNG数据驱动testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是excel,XML,YAML,甚至可以是TXT文本。@DataProvider注解简介:@DataProvider标记专门为测试方法

TestNG数据驱动

testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是excel,XML,YAML,甚至可以是TXT文本。

@DataProvider注解简介:

@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[ ][ ]类型的二维数组或者Iterator[],每一行的Object[],都是测试方法的一个测试数据集,测试方法会为每个测试数据集执行一次。如果没有指定参数的名称,则默认为方法的名称,方法的名称没有限制。

@DataProvider的小例子:

import java.lang.reflect.Method;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class test {
    @DataProvider(name = "user")
    public Object[][] createUser(Method m) {
        System.out.println(m.getName());
        return new Object[][] { { "root", "root" }, { "test", "root" }, { "test", "test" } };
    }
    @Test(dataProvider = "user")
    public void verifyUser(String username, String passWord) {
        System.out.println("Verify User : " + username + ":" + password);
        assert username.equals(password);
    }
}

如上所示@DataProvider注解了createUser方法,返回的二位数组里有三行数据,每行两列。

所以@Test(dataProvider = "user")注解的verifyUser方法有两个参数,用来接收每一行的两个数据,如果createUser返回的数据数组的列数和verifyUser的参数个数不同就会报错的。

因为返回的有三行,所以verifyUser会被执行三次。结果如下:

PASSED: verifyUser("root", "root")
FaiLED: verifyUser("test", "root")
PASSED: verifyUser("test", "test")

CSV文件数据读取和@DataProvider

我自己做了一个以csv为例的测试架子,部分代码可通用。

CSV文件读取类(可通用,目录自己可以修改,也可改变成读取EXCEL、TXT等文件):

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
public class CSVData implements Iterator {
    private BufferedReader br        = null;
    //行数
    private int            rowNum    = 0;
    //获取次数
    private int            curRowNo  = 0;
    //列数
    private int            columnNum = 0;
    //key名
    private String[]       columnName;
    //csv中所有行数据
    private List   csvList;
    //实际想要的行数据
    private List   csvListNeed;
    
    public CSVData(String fileName, String caseId) {
        try {
            File directory = new File(".");
            String ss = "resources.";
            File csv = new File(directory.getCanonicalFile() + "src	est" + ss.replaceAll(".", Matcher.quoteReplacement(""))
                                + fileName + ".csv");
            br = new BufferedReader(new FileReader(csv));
            csvList = new ArrayList();
            while (br.ready()) {
                csvList.add(br.readLine());
                this.rowNum++;
            }
            String stringValue[] = csvList.get(0).split(",");
            this.columnNum = stringValue.length;
            columnName = new String[stringValue.length];
            for (int i = 0; i < stringValue.length; i++) {
                columnName[i] = stringValue[i].toString();
            }
            this.curRowNo++;
            csvListNeed = new ArrayList();
            for (int i = 1; i < rowNum; i++) {
                String values[] = csvList.get(i).split(",");
                if (caseId.equals(values[0])) {
                    csvListNeed.add(csvList.get(i));
                }
            }
            this.rowNum = 2;//就取一行
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public boolean hasNext() {
        if (this.rowNum == 0 || this.curRowNo >= this.rowNum) {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        } else {
            return true;
        }
    }
    @Override
    public Object[] next() {
        
        Map s = new TreeMap();
        String csvCell[] = csvListNeed.get(0).split(",");
        for (int i = 0; i < this.columnNum; i++) {
            String temp = "";
            try {
                temp = csvCell[i].toString();
            } catch (ArrayIndexOutOfBoundsException ex) {
                temp = "";
            }
            s.put(this.columnName[i], temp);
        }
        Object r[] = new Object[1];
        r[0] = s;
        this.curRowNo++;
        return r;
    }
    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove unsupported");
    }
}

这个类实现了Iterator迭代器,TestNG调用此类实现的hasNext()、next()方法得到一行数据,在next()方法中可以看到,我把数据是放在Map中的,再把map放在Object[]里,所以测试方法的参数就必须是一个Map。我这里改成了只读取一行,因为一个csv文件的一个caseId只应该有一行。

数据驱动类:

import java.lang.reflect.Method;
import java.util.Iterator;
import org.testng.annotations.DataProvider;
public class DataProviderTest {
    
    @DataProvider
    public Iterator dataSource(Method method) {
        return (Iterator) new CSVData(method.getDeclarinGClass().getSimpleName(), method.getName());
    }
}

Method方法是通过反射获取的,总之哪个方法调用我Method就是那个方法。

method.getDeclaringClass().getSimpleName()可以获取方法所属的类的类名。

我这里规定了csv的文件名就是测试类的类名,用例名就是方法名。

return (Iterator) new CSVData(…)就是将CSV读取类读取的结果返回,返回的类型是Iterator的,符合@DataProvider的返回值类型要求。当@Test(dataProvider = "dataSource")注解的测试方法执行时就会调用Iterator的hasNext()判断是否有数据和next()获取数据。

测试类:

import java.util.Map;
import org.testng.annotations.Test;
public class DataTest extends DataProviderTest {
    @Test(dataProvider = "dataSource")
    public void id2(Map data) {
        System.out.println(data);
    }
    @Test(dataProvider = "dataSource")
    public void id1(Map data) {
        System.out.println(data);
    }
}

输出结果如下:

PASSED: id1({caseId=id1, flag=Y, property=flowModel, type=com.mybank.bkloanapply.core.model.BaseModel, value=BaseModel.csv@1})
PASSED: id2({caseId=id2, flag=M, property=context, type=java.util.Map, value=a:Object.csv@1})

总结

通过以上例子可以看到,无论@DataProvider注解的方法返回的是Object[ ][ ]还是Iterator[],最后测试方法获得的参数都是Object[ ]里放的东西,第一个例子里放了两列String,第二个例子里放了Map,所以第一个测试类的测试方法的参数是两个String,第二个测试类的测试方法的参数是Map,必须保持一致才行。

--结束END--

本文标题: TestNG数据驱动简介

本文链接: https://www.lsjlt.com/news/3006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TestNG数据驱动简介
    TestNG数据驱动testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。@DataProvider注解简介:@DataProvider标记专门为测试方法...
    99+
    2021-10-13
    java教程 java
  • Oracle数据库简介
    简介 Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移...
    99+
    2018-11-26
    Oracle数据库简介
  • DataSource与数据库连接池简介(JDBC简介)
    目录起源为何放弃DriverManager连接池数据源实现核心架构DataSourceAPI小结应用数据库连接池示例总结DataSource是作为DriverManager的替代品而...
    99+
    2022-11-13
    数据库连接池Data Source JDBC数据库连接池Data Source
  • [python]数据类(dataclass)简介
    文章目录 数据类定义装饰器field初始化数据比较后处理 dataclasses方法 Python3.7引入了dataclass。dataclass装饰器可以声明Python类为...
    99+
    2023-10-20
    python dataclass field 装饰器
  • SQL Server 数据库简介
    使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速,方便地管理数据。数据库具有以下特点:         1、可以结构...
    99+
    2022-10-18
  • 数据库系统简介
    什么是数据库系统? 数据库系统=数据库(DataBase(DB))+数据库管理系统(Database Management System (DBMS))+数据库应用程序(Database Application (DBA)) 数据库:为了满...
    99+
    2015-08-02
    数据库系统简介 数据库入门 数据库基础教程 数据库 mysql
  • MySQL数据库(三)简介
      前提要述:参考书籍《MySQL必知必会》 2.1 MySQL简介 2.1.1 什么是MySQL MySQL是一种关系数据库管理系统。负责数据库中数据的存储,检索,管理和处理。 2.1.2 MySQL的优点 成本低——M...
    99+
    2021-02-21
    MySQL数据库(三)简介
  • CIFAR-10 数据集简介
    文章目录 CIFAR-10 简介 CIFAR-10 简介 官网:http://www.cs.toronto.edu/~kriz/cifar.html CIFAR-10和CIFAR-100...
    99+
    2023-09-03
    python 开发语言
  • MySQL默认数据库简介
        类似于MS SQL Server等大型数据库,MySQL数据库也提供了内置的数据库,它们是:INFORMATION_SCHEMAmysqltest1.information_sc...
    99+
    2022-10-18
  • python的数据类型简介
    ipython:原生python不具有命令行补全等功能,这个工具提供了类似shell的功能,方便学习使用安装:wget https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86...
    99+
    2023-01-31
    数据类型 简介 python
  • mysql与msql2数据驱动
    mysql基本使用 数据库操作(DDL) -- 数据考操作-- 1.查询所有数据库SHOW DATABASES;-- 2.选择数据库USE learn_mysql;-- 3.当前正在使用的数据库SEL...
    99+
    2023-09-22
    mysql 数据库 oracle mongodb
  • Android中的SQLite数据库简介
    SQLite简介: SQLite是Android系统采用的一种开源的轻量级的关系型的数据库,Android中允许每个应用程序都拥有自己独立的数据库,每个应用程序的数据库的位置一...
    99+
    2022-06-06
    sqlite数据库 SQLite Android
  • Python数据类型简介之numpy
    本篇文章给大家带来了关于Python的相关知识,其中主要整理了numpy数据类型的相关问题,包括了numpy的基本数据类型、numpy自定义复合数据类型、使用ndarray保存日期数据类型等等内容,下面一起来看一下,希望对大家有帮助。【相关...
    99+
    2022-08-08
    python
  • Redis数据库的简单介绍
    这篇文章给大家分享的是有关Redis数据库的简单介绍的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.Redis数据库介绍redis数据库是一种基于内存可持久化的键值对非关系性数...
    99+
    2022-10-18
  • ceRNA数据库的简单介绍
    这篇文章主要介绍“ceRNA数据库的简单介绍”,在日常操作中,相信很多人在ceRNA数据库的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ceRNA数据库的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-19
  • PythonUnittestddt数据驱动的实现
    1、数据驱动介绍: @ddt.ddt(类装饰器,申明当前类使用ddt框架)@ddt.data(函数装饰器,用于给测试用例传递数据),支持传python所有数据类型:数字(int,lo...
    99+
    2023-02-27
    Python Unittest ddt数据驱动 Python Unittest ddt
  • JS代理对象Proxy初体验简单的数据驱动视图
    目录引言Proxy对象是什么使用Proxy写一个简单的数据驱动视图引言 上大学的时候,最流行的框架是JQuery,它是事件驱动类型的,也就是说,当一个数据与DOM的某个内容相关联的时...
    99+
    2022-11-13
  • 简单操作mysql数据库介绍
    下文主要给大家带来简单操作mysql数据库介绍,希望这些内容能够带给大家实际用处,这也是我编辑简单操作mysql数据库介绍这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。1、显示所有数据库:  SH...
    99+
    2022-10-18
  • 简要介绍MongoDB的数据模型
        MongoDB数据是特别灵活的,与SQL数据库相比,它不需要在插入数据前先定义表的结构。MongoDB的集合不强调固定的文档结构。这种灵活性使它能够轻松映射文档结构。每一个文档都...
    99+
    2022-10-18
  • ADO.NET数据类型ParameterDirection属性简介
    ParameterDirection属性是ADO.NET中的一个枚举,用于指定参数的类型。它有以下几个可能的值:- Input:表示...
    99+
    2023-09-23
    ADO.NET
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作