数据驱动(3)
3.1使用TestNG、Apache POI和Excel文件进行数据驱动测试
测试逻辑:
(1)打开百度首页
(2)在搜索框中输入两个搜索关键词
(3)单击搜索按钮
(4)断言搜索结果页是否包含Excel文件每行第三个单元格的关键词
测试环境准备:
(1)从http://poi.apache.org/download.html#POI-4.0.1下载POI安装包的压缩文件
(2)将压缩文件进行解压,将解压的压缩文件根目录下的JAR文件和ooxml-lib文件夹、lib文件夹下的所有JAR文件均加入到Eclipse的Build Path中
Excel文件内容
测试代码:
package cn.datadriven; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterMethod; public class TestDataDrivenByExcelFile { WebDriver driver; String url = "http://www.baidu.com"; //使用注解DataProvider,将数据集合命名为testData @DataProvider(name ="testData") public static Object[][] words() throws IOException{ //调用静态方法获取xlsx文件的测试数据 return getTestData("E:\\材料\\selenium\\","testData.xlsx","Sheet1"); } public static Object[][] getTestData(String filePath,String fileName, String sheetName) throws IOException{ //根据参数传入的数据文件路径和文件名称,组合出excel数据文件的绝对路径 File file = new File(filePath+"\\"+fileName); //创建FileInputStream对象用于读取Excel文件 FileInputStream inputStream = new FileInputStream(file); //声明Workbook对象 Workbook Workbook = null; //获取文件参数扩展名,判断是.xlsx文件还是.xls文件 String fileExtensionName = fileName.substring(fileName.indexOf(".")); if(fileExtensionName.equals(".xlsx")){ Workbook = new XSSFWorkbook(inputStream); } else if(fileExtensionName.equals(".xls")){ Workbook =new HSSFWorkbook(inputStream); } //通过sheetName参数生成Sheet对象 Sheet sheet = Workbook.getSheet(sheetName); //获取excel数据文件Sheet1中数据的行数,getLastRowNum方法获取数据的最后一行行号 //getFirstRowNum方法获取数第一行的行号相减之后计算出数据的行数 //注意:Excel文件的行号和列号都是从0开始的 int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum(); //创建名为records的list对象来存储Excel数据文件读取的数据 List<Object[]>records = new ArrayList<Object[]>(); //遍历Excel文件所有数据除第一行为标题所有从1开始 for(int i=1 ; i<rowCount+1; i++){ Row row = sheet.getRow(i); //声明一个数组,用来存储Excel数据文件每行中的3个数据,数组的大小用getLastCellNum() //进行动态声明,实现测试数据个数和数组大小一致 String fields[] = new String[row.getLastCellNum()]; for(int j=0;j<row.getLastCellNum();j++){ //调用getCell和getStringCellValue获取单元格数据 fields[j] = row.getCell(j).getStringCellValue(); } //将单元格数据存储到records 的list中 records.add(fields); } //定义函数返回值 //将测试数据list转为一个Object的二维数组 Object[][] results = new Object[records.size()][]; //设置二维数组每行的值,每行是一个Object对象 for(int i=0;i<records.size();i++){ results[i] = records.get(i); } return results; } @Test(dataProvider="testData") public void testSearch(String searchWord1,String searchWord2, String searchResult) { //文件每行单元格的前两个值进行搜索 driver.findElement(By.id("kw")).sendKeys(searchWord1+""+searchWord2); //单机搜索 driver.findElement(By.id("su")).click(); //使用显示等待确认页面已加载完成,帮助已显示在页面底部 (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver d){ return d.findElement(By.xpath("//*[@id='help']/a[1]")).getText().contains("帮助"); } }); //断言判断每行搜索的内容页面是否包含单元格的第三值 Assert.assertTrue(driver.getPageSource().contains(searchResult)); } @BeforeMethod public void beforeMethod() { System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(url); } @AfterMethod public void afterMethod() { driver.quit(); } }
测试结果: