Selenium Web 自動化 - 項目實戰(二)


Selenium Web 自動化 - 項目實戰(二)

2016-08-08

什么是數據驅動?簡答的理解就是測試數據決定了測試結果,這就是所謂數據驅動。數據驅動包含了數據,他就是測試數據,在自動化領域里,提倡數據分離,也就是說,測試用例和測試數據是分開(存儲)的。 

在本框架設計中,采用的是Excel存儲測試數據。

1 框架更改總覽

源代碼:autotestDataDriver.zip

在原來的框架下更改,如下圖所示

2 框架更改詳解

2.1 更改用例類:LoginPage_001_LoginSuccessFunction_Test.java

下面代碼中,紅色字體顯示出更改前后變化。更改后數據不是寫在代碼中,而是從excel中讀取。那么怎么讓讀取數據,且對應用例呢?

 

 2.2 測試數據如何保存-設計excel

先看看如何設計excel:

excel的表名以模塊名命名。excel中,有個sheet,名字為'001',對應用例編號,和設計用例的的類名第二部分是對應的,也就是說一個sheet就是一個測試用例的數據。在執行測試用例的時候,通過模塊名字找到對應的excel,然后再根據對應的用例編號找到對應的sheet,最后在讀取excel數據。 

2.3 通過數據提供者獲取測試數據

通過數據提供者(@DataProvider)來傳遞給測試用例,這里將數據提供者代碼放置在BaseParpare.java中,目的是為了每次運行一個用例都會讀取對應的測試用例。

    /**
     * 測試數據提供者 - 方法
     * */
    @DataProvider(name = "testData")
    public Iterator<Object[]> dataFortestMethod() throws IOException {
        String moduleName = null; // 模塊的名字
        String caseNum = null; // 用例編號
        String className = this.getClass().getName();
        int dotIndexNum = className.indexOf("."); // 取得第一個.的index
        int underlineIndexNum = className.indexOf("_"); // 取得第一個_的index

        if (dotIndexNum > 0) {    
            moduleName = className.substring(24, className.lastIndexOf(".")); // 取到模塊的名稱
        }

        if (underlineIndexNum > 0) {
            caseNum = className.substring(underlineIndexNum + 1, underlineIndexNum + 4); // 取到用例編號
        }
        //將模塊名稱和用例的編號傳給 ExcelDataProvider ,然后進行讀取excel數據
        return new ExcelDataProvider(moduleName, caseNum);
    }
View Code

 

2.4讀取Excel的方法

ExcelDataProvider.java,代碼如下:

package com.demo.test.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

import org.apache.log4j.Logger;
import org.testng.Assert;

/**
 * @author young
 * @description: 讀取Excel數據<br>
 *               說明:<br>
 *               Excel放在Data文件夾下<br>
 *               Excel命名方式:測試類名.xls<br>
 *               Excel的sheet命名方式:測試方法名<br>
 *               Excel第一行為Map鍵值<br>
 */
public class ExcelDataProvider implements Iterator<Object[]> {

    private Workbook book = null;
    private Sheet sheet = null;
    private int rowNum = 0;
    private int currentRowNo = 0;
    private int columnNum = 0;
    private String[] columnnName;
    private String path = null;
    private InputStream inputStream = null;
    public static Logger logger = Logger.getLogger(ExcelDataProvider.class.getName());

    /*
     * @description 
     * 2個參數:<br>
     * moduleName - 模塊的名稱
     * caseNum - 測試用例編號
     **/
    public ExcelDataProvider(String moduleName, String caseNum) {

        try {
            //文件路徑
            path = "data/" + moduleName + ".xls";
             inputStream = new FileInputStream(path);

            book = Workbook.getWorkbook(inputStream);
            // sheet = book.getSheet(methodname);
            sheet = book.getSheet(caseNum); // 讀取第一個sheet
            rowNum = sheet.getRows(); // 獲得該sheet的 所有行
            Cell[] cell = sheet.getRow(0);// 獲得第一行的所有單元格
            columnNum = cell.length; // 單元格的個數 值 賦給 列數
            columnnName = new String[cell.length];// 開辟 列名的大小

            for (int i = 0; i < cell.length; i++) {
                columnnName[i] = cell[i].getContents().toString(); // 第一行的值
                                                                    // 被賦予為列名
            }
            this.currentRowNo++;

        } catch (FileNotFoundException e) {
            logger.error("沒有找到指定的文件:" + "[" + path + "]");
            Assert.fail("沒有找到指定的文件:" + "[" + path + "]");
        } catch (Exception e) {
            logger.error("不能讀取文件: [" + path + "]",e);
            Assert.fail("不能讀取文件: [" + path + "]");
        }
    }
    /**是否還有下個內容*/

    public boolean hasNext() {

        if (this.rowNum == 0 || this.currentRowNo >= this.rowNum) {

            try {
                inputStream.close();
                book.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        } else {
            // sheet下一行內容為空判定結束
            if ((sheet.getRow(currentRowNo))[0].getContents().equals(""))
                return false;
            return true;
        }
    }
    /**返回內容*/
    public Object[] next() {

        Cell[] c = sheet.getRow(this.currentRowNo);

        Map<String, String> data = new HashMap<String, String>();

        for (int i = 0; i < this.columnNum; i++) {

            String temp = "";

            try {
                temp = c[i].getContents().toString();
            } catch (ArrayIndexOutOfBoundsException ex) {
                temp = "";
            }

            data.put(this.columnnName[i], temp);
        }
        Object object[] = new Object[1];
        object[0] = data;
        this.currentRowNo++;
        return object;
    }

    public void remove() {
        throw new UnsupportedOperationException("remove unsupported.");
    }
}
View Code

Pom.xml添加jar依賴:

        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
            <scope>provided</scope>
        </dependency>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM