zoukankan      html  css  js  c++  java
  • 【框架】用excel管理测试用例需要的参数数据(二)

    一、总体思路

    以类为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"));
    	}
    

      

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/Jourly/p/7000003.html
Copyright © 2011-2022 走看看