Testng+DataProvider+自定義注解實(shí)現(xiàn)通用的數(shù)據(jù)讀取

1、正常情況是需要有一個(gè)方法提供data provider篙程,然后測(cè)試方法調(diào)用名字,而excel的路徑和sheet表名寫在調(diào)用的地方拥诡,

2氮发、通過注解實(shí)現(xiàn)excel文件配置讀取,用戶無需關(guān)心讀取過程爽冕,只需設(shè)置配置路徑

3、下面是測(cè)試用例


public class Demo extends ExcelDataHeleper {

     //excel文件讀取

    @Test(dataProvider="excel")

    @DataFile(path ="excel/addStudentTemplate.xls",sheet ="Sheet0")

    public void testmethod1(Map param){

              System.out.println(param.get("id")+"    "+param.get("phone"));

    }

   //csv文件讀取

    @Test(dataProvider="csv")

    @DataFile(path ="csv/a.csv")

    public void testmethodCsv(Map param){
              System.out.println(param.get("id")+"    "+param.get("phone"));

    }

    //yaml文件讀取
    @Test(dataProvider="yaml")

    @DataFile(path ="yaml/a.yaml",key="user")

    public void testmethodYaml(Map param){
              System.out.println(param.get("id")+"    "+param.get("phone"));

    }

}

dataProvider:標(biāo)注讀取的是excel文件

DataFile中的path:excel的相對(duì)路徑,在res下眯娱,sheet:表格的sheet名

param:為hashMap,通過表格中的鍵讀取值

DataFile類如下

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataFile {
    public String path();  //注解元素 為  id
    public String sheet() default "no description"; //設(shè)置默認(rèn)值试伙,
}

下面介紹繼承的基類:ExcelDataHeleper

import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.testng.annotations.DataProvider;
import java.io.*;
import java.lang.reflect.Method;
import java.util.*;
public class ExcelDataHeleper {

    @DataProvider(name = "excel")
    public Iterator<Object[]> dataMethod(Method m) {
        System.out.println(m.getName());
        DataFile d = m.getAnnotation(DataFile.class);
        System.out.println(d.path() + "   " + d.sheet());
        List<Object> item = new ArrayList<Object>();
        List<List<String>> list = read(d.path(), d.sheet());
        if (list != null || list.size() > 0) {
            int size = list.get(0).size();
            for (int i = 1; i < list.size(); i++) {
                Map<String, Object> map = new HashMap<>();
                for (int j = 0; j < size; j++) {
                    map.put(list.get(0).get(j), list.get(i).get(j));
                }
                item.add(map);
            }
        }
        List<Object[]> users = new ArrayList<Object[]>();
        for (Object u : item) {
            //做一個(gè)形式轉(zhuǎn)換
            users.add(new Object[]{u});
        }
        return users.iterator();
    }
   //yaml文件
    @DataProvider(name = "yaml")
    public Iterator<Object[]> dataMethodYaml(Method m) {
        System.out.println(m.getName());
        DataFile d = m.getAnnotation(DataFile.class);
        logger.info(d.path() + "   " + d.key());
        List<Object> item = new ArrayList<Object>();
        InputStream in = ClassLoader.getSystemResourceAsStream(d.path());
        Yaml yaml = new Yaml();
        Map<String, Object> map = yaml.loadAs(in, Map.class);
        List<Map<String,String> > appid = (List<Map<String,String>>) map.get(d.key());
//        System.out.println(appid.get(1).get("username"));
        List<Object[]> users = new ArrayList<Object[]>();
        for (Object u : appid) {
            //做一個(gè)形式轉(zhuǎn)換
            users.add(new Object[]{u});
        }
        return users.iterator();
    }

    //csv文件讀取吱抚,還沒寫完
    @DataProvider(name = "csv")
    public Iterator<Object[]> dataMethod1(Method m) {
        DataFile d = m.getAnnotation(DataFile.class);
        File inFile = new File(System.getProperty("user.dir") + File.separator + "src/main/resources/" + d.path());
        try {
            BufferedReader reader = new BufferedReader(new FileReader(inFile));
            boolean sign = false;       //用來跳過第一行的名稱
            List<Object> item = new ArrayList<Object>();
            List<String> list = new ArrayList<>();
            String[] title = new String[0];
            while (reader.ready()) {
                String line = reader.readLine();
                String[] string = line.split(",");
                if (!sign) {
                    sign = true;
                    title = string;
                } else {
                    Map<String, Object> map = new HashMap<>();
                    if (string != null && string.length > 0 && title != null && title.length > 0) {
                        for (int j = 0; j < title.length; j++) {
                            map.put(specialUnicode(title[j]), string[j]);
                            //map.put(title[j], string[j]);
                        }
                        item.add(map);
                    }
                }
            }
            reader.close();
            List<Object[]> users = new ArrayList<Object[]>();
            for (Object u : item) {
                //做一個(gè)形式轉(zhuǎn)換
                users.add(new Object[]{u});
            }
            return users.iterator();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
        return null;
    }

    public List<List<String>> read(String fileName, String sheetName) {
        List<List<String>> maps = new ArrayList<>();
        if (fileName == null || !fileName.matches("^.+\\.(?i)((xls)|(xlsx))$"))
            return maps;
        try {
            InputStream inputStream = new FileInputStream(System.getProperty("user.dir") + File.separator + "src/main/resources/" + fileName);
            System.out.println(inputStream);
            Workbook wb = WorkbookFactory.create(inputStream);
            maps = read(wb, sheetName);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return maps;
    }

    private int totalRows = 0;// 總行數(shù)
    private int totalCells = 0;// 總列數(shù)

    private List<List<String>> read(Workbook wb, String sheetName) {
        List<List<String>> maps = new ArrayList<>();
        List<List<String>> list = new ArrayList<List<String>>();
        int delnumber = 0;// 第一頁去除行數(shù)
        Sheet sheet = wb.getSheet(sheetName);
        this.totalRows = sheet.getPhysicalNumberOfRows() - delnumber; // 獲取工作表中行數(shù)
        if (this.totalRows >= 1 && sheet.getRow(delnumber) != null) {
            this.totalCells = sheet.getRow(0)
                    .getPhysicalNumberOfCells(); // 得到當(dāng)前行的所有單元格
            for (int j = 0; j < totalRows; j++) {
                List<String> rowLst = new ArrayList<String>();
                for (int f = 0; f < totalCells; f++) {
                    if (totalCells > 0) {
                        String value = getCell(sheet.getRow(j).getCell(f));
                        rowLst.add(value);
                    }
                }
                list.add(rowLst);
            }
        }
        return list;
    }
    /*
     * private String getRightStr(String sNum) { DecimalFormat decimalFormat =
     * new DecimalFormat("##.00"); String resultStr = decimalFormat.format(new
     * Double(sNum)); if (resultStr.matches("^[-+]?\\d+\\.[0]+$")) { resultStr =
     * resultStr.substring(0, sNum.indexOf(".")); } return resultStr; }
     */

    public String getCell(Cell cell) {
        String cellValue = null;
        HSSFDataFormatter hSSFDataFormatter = new HSSFDataFormatter();
        cellValue = hSSFDataFormatter.formatCellValue(cell); // 使用EXCEL原來格式的方式取得值
        return cellValue;
    }

 /**
     * 去除 字符串收尾的 特殊的Unicode [ "\uFEFF" ]
     * csv 文件可能會(huì)帶有該編碼
     * @param str
     * @return
     */
    private static String specialUnicode(String str){
        if (str.startsWith("\uFEFF")){
            str = str.replace("\uFEFF", "");
        }else if (str.endsWith("\uFEFF")){
            str = str.replace("\uFEFF","");
        }
        return str;
    }
{

注:因?yàn)閏sv文件有時(shí)候會(huì)隱藏一些標(biāo)識(shí)符號(hào)既绕,如果不去除涮坐,會(huì)導(dǎo)致通過map的key獲取不到對(duì)應(yīng)的值,所以加入了specialUnicode方法

pom.xml添加依賴

 <dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.17</version>
</dependency>

excel中內(nèi)容:
image.png

運(yùn)行結(jié)果如下:
image.png

有問題聯(lián)系我疲扎,微信:fwrsmile

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末椒丧,一起剝皮案震驚了整個(gè)濱河市壶熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棒假,老刑警劉巖精盅,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹俏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佳头,警方通過查閱死者的電腦和手機(jī)鹰贵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門碉输,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枝哄,你說我怎么就攤上這事∧幼叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵粱侣,是天一觀的道長齐婴。 經(jīng)常有香客問我稠茂,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任叼耙,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匀哄。我一直安慰自己雏蛮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布法梯。 她就那樣靜靜地躺著犀概,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姻灶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天捂掰,我揣著相機(jī)與錄音,去河邊找鬼这嚣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姐帚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惫皱,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼旅敷,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颤霎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起友酱,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤缔杉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后系羞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椒振,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了选调。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哮洽,死狀恐怖枝笨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剔桨,我是刑警寧澤徙融,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站树绩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饺饭。R本人自食惡果不足惜职车,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扛芽。 院中可真熱鬧积瞒,春花似錦、人聲如沸叮喳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩瞪。三九已至,卻和暖如春李破,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毛嫉。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工承粤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辛臊。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像彻舰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隔心,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355