原创:testng 参数化(3)- 使用 csv文件

简介

前篇提到,使用@DataProvider来管理和维护测试数据,已经实现数据和逻辑分离
但是,当一行数据列比较多的时候,管理起来比较费眼睛,不容易知道每一个列字段的含义,维护较难。
如果能够列数据和列名称对应起来,则极大的的改善测试数据的维护成本
使用csv文件来管理测试数据,然后将csv中的数据转化为Object[][], 是一个非常好的选择

csv文件

主流的开发工具,例如Idea支持csv文件的编辑,并且界面十分友好,编辑测试数据煞是方便快捷,参考下图:

一行数据代表一个用例,大致有描述信息数据,测试数据,验证数据三块
每一个字段都有对应的列名称,易于维护

读取csv文件数据数据

package common.util.csvutils;

import java.nio.charset.Charset;
import java.util.Map;
import java.util.TreeMap;
import com.csvreader.CsvReader;

public class CSVUtils {
    /**
     * 读取csv文件的内容
     * @param strFileName
     * @return
     */
    public static Map<Integer,Map<String,Object>> readFile(String strFileName){
        Map<Integer, Map<String,Object>> mapLine = new TreeMap<Integer, Map<String, Object>>();
        String filePath =System.getProperty("user.dir")+"/src/main/resources/testdata/"+strFileName;
        try{
            //需要增加对中文字符的处理
            CsvReader csvReader = new CsvReader(filePath,',',Charset.forName("UTF-8"));
            csvReader.readHeaders();
            int nRow = 0;
            while(csvReader.readRecord()){
                Map<String,Object> map = new TreeMap<String, Object>();
                for(int i=0; i<csvReader.getColumnCount(); i++){
                    map.put(csvReader.getHeader(i), csvReader.get(i));
                }
                mapLine.put(++nRow,map);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return mapLine;
    }
}

csv文件数据转化为Object[][]

package train.testng;

import common.util.csvutils.CSVUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Map;

public class Liang6DemoCsv {
    @DataProvider(name = "csvData")
    public Object[][] readCsvData(){
        String fileName = "liang6demo.csv";
        //读入csv文件数据并转化为Object[][]
        Map<Integer, Map<String,Object>> map = CSVUtils.readFile(fileName);
        Object[][] objects = new Object[map.size()][1];
        for(int i=0; i<map.size(); i++){
            Object[] temp = new Object[1];
            temp[0] = map.get(i+1);
            objects[i][0]=temp;
        }
        return objects;
    }

    @Test(dataProvider = "csvData")
    public void csvDataDemo(Object[] obj){
        Map<String, Object> mapLine = (Map<String, Object>)obj[0];
        System.out.println(obj[0]);
        System.out.println(mapLine.get("msg"));
    }
}

运行结果

{age=1, city=BJ, code=0, data=good cat, describe=冒烟测试, id=1, msg=success, name=tom}
success
{age=100, city=TOKYO, code=1, data=, describe=异常测试, id=2, msg=doesn't exist, name=jerry}
doesn't exist

===============================================
liang6Demo
Total tests run: 2, Failures: 0, Skips: 0
===============================================
版权所有,本文为原创文章,转载请注明出处
https://www.cnblogs.com/liang6/p/14395828.html

总结

使用csv管理测试数据,更加符合数据和逻辑相分离的原则
使用csv管理测试数据,灵活且更加易于维护
但是,仍然需要在DataProvider中来处理数据,有些繁琐

posted @ 2021-02-10 17:34  嘉良空间  阅读(243)  评论(0)    收藏  举报