一、总体思路

以类为excel名,测试方法名为sheet名,建立excel文件。用jxl包里的方法去读取excel文件里的内容,然后用testng里的dataprovider,将数据传递给测试用例

 

二、代码实现

package com.jxl.excel;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ExcelData {
	String classname;
	String casename;

	/**
	 * @param classname
	 *            excel文件名
	 * @param casename
	 *            sheet名
	 */
	public ExcelData(String classname, String casename) {
		this.classname = classname;
		this.casename = casename;
	}

	/**
	 * 获取excel文件的路径
	 * 
	 * @return
	 */
	public String getPath() {
		String path = "./testdata/" + classname + ".xls";
		return path;
	}

	/**
	 * 获取excel对应sheet中的数据
	 * 
	 * @return
	 * @throws IOException
	 */
	public Object[][] getExcelData() {
		File file = new File(getPath());
		Workbook book = null;
		Sheet sheet = null;
		try {
			book = Workbook.getWorkbook(file);
			sheet = book.getSheet(casename);
		} catch (Exception e) {
			System.out.println(classname + ".xls文件读取失败");
		}
		int rows = sheet.getRows();
		int cols = sheet.getColumns();
		// 如果行数少于2,则没有必要再继续运行下去了,不会返回数据,直接退出程序
		if (rows <= 1) {
			System.out.println(classname + ".xls的" + casename + " sheet没有数据");
			System.exit(0);
		}
		// 为了返回值是Object[][]类型,定义一个多行单列的二维数组
		HashMap<String, String>[][] arrMap = new HashMap[rows - 1][1];
		// 对数组中的所有元素初始化
		for (int i = 0; i < rows - 1; i++) {
			arrMap[i][0] = new HashMap<>();
		}
		// 定义一个list,存储第一行的标题,作为key用
		// 需要注意的是,getCell(col,row),第一个纵坐标,第二个位横坐标
		List<String> list = new ArrayList<String>();
		for (int c = 0; c < cols; c++) {
			list.add(sheet.getCell(c, 0).getContents());
		}
		// 以行为单位,将一行的数据,以键值对的形式,存进一个哈希表里
		for (int r = 1; r < rows; r++) {
			for (int c = 0; c < cols; c++) {
				arrMap[r - 1][0].put(list.get(c), sheet.getCell(c, r).getContents());
			}
		}
		book.close();
		return arrMap;
	}
}

 

testng的测试用例里,这样传递数据 

@DataProvider(name = "noNameTip")
	public Object[][] noNameData() {
    //excel的文件名和类名一致,为LoginTest,测试方法和sheet名一致,为testNoNameLogin
		ExcelData e = new ExcelData("LoginTest", "testNoNameLogin");
		return e.getExcelData();
	}

	/**
	 * 测试登录没有输入用户名
	 */
	@Test(dataProvider = "noNameTip")
	public void testNoNameLogin(HashMap<String, String> data) {
    //按列名取值
		String username = data.get("username");
		String password = data.get("password");
		loginPage.doLogin(username, password);
		assertEquals(loginPage.getNoNameTip(), data.get("expectedNoNameTip"));
	}

 testng中当有多个方法,需要传递数据的时候,将method传递给dataprovider

@DataProvider(name = "loginData")
	public Object[][] testData(Method method)  {		
		ExcelData e = new ExcelData("LoginTest", method.getName());
		return e.getExcelData();
	}

	/**
	 * 测试登录没有输入用户名
	 */
	@Test(dataProvider = "loginData")
	public void testNoNameLogin(HashMap<String, String> data) {
    //按列名取值
		String username = data.get("username");
		String password = data.get("password");
		loginPage.doLogin(username, password);
		assertEquals(loginPage.getNoNameTip(), data.get("expectedNoNameTip"));
	}

  

 

posted on 2017-06-13 10:56  Jourly  阅读(1084)  评论(0编辑  收藏  举报