自动化框架之Excel的数据驱动

     用Excel来实现数据驱动是比较常用的做法,好处是可以将数据轻松的管理在Excel里面,维护起来简单。

    另外还可以实现数据的循环调用,节省了代码重复使用。假如要自动测试一个登陆界面,除了要输入正确的用户名密码外,还要

输入错误的用户密码。总不可能写N个相同的脚本去做测试吧。用Excel就很容易管理。只要在Excel里面这样写:

                                                 

     那么怎么来读取Excel呢,有两个比较流行的插件可以办到:POI和JXL。

     POI插件更重量级,对Excel支持更全面,但是读取速度慢。JXL比较轻便,但是对中文的支持好,读取速度快。

我们在这里使用JXL插件。 

 

    import java.io.File;

     import java.util.HashMap;

     import java.util.Iterator;

     import java.util.Map;

     import jxl.Cell;import jxl.Sheet;

     import jxl.Workbook;

  public class ExcelDataProvider implements Iterator<Object[]>{

    private Workbook book = null;

    private Sheet sheet = null;

    private int rowNum = 0;

    private int curRowNo = 0;

    private int columnNum = 0;

    private String[] columnnName;

    private static String sPath=System.getProperty("user.dir")+"/src/test/resources/";


    public ExcelDataProvider(String classname, String methodname) {

        try {

            String wbookFile = sPath.replace("\\", "/") + classname.replaceAll("\\.", "/") + ".xls";

            System.out.println("Excel Path:" + wbookFile);

            this.book = Workbook.getWorkbook(new File(wbookFile));

            this.sheet = book.getSheet(methodname);

            this.rowNum = sheet.getRows();


            Cell[] c = sheet.getRow(0);

            this.columnNum = c.length;

            columnnName = new String[c.length];

            for (int i = 0; i < c.length; i++) {

                 System.out.println( c[i].getContents().toString()); 

                columnnName[i] = c[i].getContents().toString();

            }

            this.curRowNo++;


        } catch (Exception e) {

            e.printStackTrace();

        }

    }


    public boolean hasNext() {

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

            try {

                book.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

            return false;

        } else

            return true;

    }


    public Object[] next() {

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

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

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

            String temp = "";

            try {

                temp = c[i].getContents().toString();

            } catch (ArrayIndexOutOfBoundsException ex) {

                temp = "";

            }

            s.put(this.columnnName[i], temp);

        }


        Object r[] = new Object[1];

        r[0] = s;

        this.curRowNo++;

        return r;

    } 


    public void remove() {

        throw new UnsupportedOperationException("remove unsupported.");

    }

}

     然后用TestNG的dataProvider来做注脚:

 

      import java.io.IOException;

      import java.lang.reflect.Method;

      import java.util.Iterator;

      import jxl.read.biff.BiffException;

      import org.testng.annotations.DataProvider;

 

  public class StaticProvider{                    

    @DataProvider(name = "dp")

    public static Iterator<Object[]> getDataByTestMethodName(Method method) throws BiffException, IOException {

        return new ExcelDataProvider(method.getDeclaringClass().getName(),method.getName());

    }

}

      在脚本中调用,用Map的get方法来做接收:

 

      @Test(groups = {"All"}, dataProvider = "dp", dataProviderClass = StaticProvider.class)

 

        public void toLogin(Map<String, String> data) throws Throwable

            String username = data.get("账号");

            String pwd= data.get("密码");

            driver.findElementById("cn.microinvestment.weitou:id/login_phone_et").sendKeys(username);

            driver.findElementById("cn.microinvestment.weitou:id/login_pwd_et").sendKeys(pwd);

            driver.findElementByName("登录").click();