关键字驱动框架入门教程-8-测试套件执行引擎
2018-02-07 15:45
871 查看
当我们谈论自动化测试框架,更多的我们会想到框架的高效。在当前我们搭建的框架阶段,我们只是跑了一条单个的测试用例。在实际自动化测试项目中,很可能是几百条测试用例或者很多个测试组件。有时候我们需要全部执行这些测试用例,有时候我们只需要执行每个测试套件里面的一部分测试用例,一个好的测试框,需要执行类似这样的需求。在这一篇文章,我们将会学到如何在一个测试组里面把测试用例一条一条地执行。所以我们需要设计实现如何从excel文件依次读取并执行相关的测试用例。
步骤1:新建一个Test Cases的工作簿
1.打开dataEngine.xlsx文件,新建一个工作簿(sheet),名称为Test Cases
2.设置3列,分别为“Test Case ID”, “Description”,”Run Mode”
3.在Test Case ID中可以这样写 Login_001,Login_002等
4.Description就是一句简短的测试用例的描述
5.Run Mode列表示这条用例是否需要执行,Yes表示执行,No表示不需要
这个新的sheet内容大致如下
![](http://img.blog.csdn.net/20180207153432140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTU0MTk0Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
PS:这里提醒一下在Test Cases表的Test Case ID一定要和之前的Test Steps里面的Test Case ID要一致,不然执行本篇的代码就好报执行成功,但是没有看到启动浏览器等操作。这种问题不是异常不是报错,我debug了半个小时都没找错原因,最后阅读执行引擎的具体代码才发现这个问题。
步骤2:更新常量文件
1. 添加Test Case ID 和Run Mode两个常量
2. 添加一个Test Cases sheet 常量
添加后整个常量文件如下
刚好前后两个excel工作表都有Test Case ID这个,由于我们之前在常量文件添加过一次Test Case ID, 所以这里不需要再次添加,这个Test Case ID相当于SQL的主键一样的作用。
步骤3:修改ExcelUtils类
1.修改方法setExcelFile,之前这个方法有两个形式参数,一个是path一个是sheet name,由于我们新增了一个Test Cases的sheet,所以这个方法只保留path这个参数。
2.修改方法getCellData(),增加excel path参数
3.新增一个getRowContains()方法,这个方法有三个参数,第一个是Test Case Name,第二个是列的索引好,第三个是sheet名称,该方法的返回值是当前测试用例的行号。
4.新增一个方法getTestStepsCount(),同样有三个参数,分别是Test Case ID, Test Case第一个步骤和sheet名称,返回值是测试用例的步骤数。
修改后的全部代码如下:
步骤4:修改DriverScript类代码测试从excel得到数据
1. 外层for循环,得到Test Cases表的Test Case ID, 控制从第一个测试用例开始执行到最后一个测试用例
2.得到Run Mode的值来控制当前测试用例是否被执行。
3.写另外一个内层for循环,控制Test Step表的Test Case ID列。作用就是在当前测试用例,从第一个测试步骤执行到最后一个测试步骤。
完整的Driver Script类代码如下
运行结果:可以启动浏览器,点击登录,在用户名输入这个步骤还是报错,这个问题我们后面数据驱动文章部分来解决。如果仿照本篇内容运行还是失败,请参考本篇全部项目代码,点击这里。
当前项目层级结构图如下
步骤1:新建一个Test Cases的工作簿
1.打开dataEngine.xlsx文件,新建一个工作簿(sheet),名称为Test Cases
2.设置3列,分别为“Test Case ID”, “Description”,”Run Mode”
3.在Test Case ID中可以这样写 Login_001,Login_002等
4.Description就是一句简短的测试用例的描述
5.Run Mode列表示这条用例是否需要执行,Yes表示执行,No表示不需要
这个新的sheet内容大致如下
PS:这里提醒一下在Test Cases表的Test Case ID一定要和之前的Test Steps里面的Test Case ID要一致,不然执行本篇的代码就好报执行成功,但是没有看到启动浏览器等操作。这种问题不是异常不是报错,我debug了半个小时都没找错原因,最后阅读执行引擎的具体代码才发现这个问题。
步骤2:更新常量文件
1. 添加Test Case ID 和Run Mode两个常量
2. 添加一个Test Cases sheet 常量
添加后整个常量文件如下
package config; public class Constants { // 这里定义为public static的类型,方便其他任何类进行访问和调用 public static final String URL = "https://www.baidu.com"; public static final String Path_TestData = ".//src//dataEngine//dataEngine.xlsx"; public static final String File_TestData = "dataEngine.xlsx"; // OR(对象仓库)文件路径 public static final String Path_OR =".//src//config/OR.txt"; // dataEngine.xlsx中一些单元格的索引值 public static final int Col_TestCaseID = 0; public static final int Col_TestScenarioID =1; public static final int Col_PageObject =3 ; public static final int Col_ActionKeyword =4 ; public static final int Col_RunMode =2 ; // DataEngmine.excel中sheet的名称 public static final String Sheet_TestSteps = "Test Steps"; // 第二个工作簿的名称 public static final String Sheet_TestCases = "Test Cases"; // 测试登录用到的用户数据 public static final String UserName = "xxxxxx"; public static final String Password = "xxxxxxx"; }
刚好前后两个excel工作表都有Test Case ID这个,由于我们之前在常量文件添加过一次Test Case ID, 所以这里不需要再次添加,这个Test Case ID相当于SQL的主键一样的作用。
步骤3:修改ExcelUtils类
1.修改方法setExcelFile,之前这个方法有两个形式参数,一个是path一个是sheet name,由于我们新增了一个Test Cases的sheet,所以这个方法只保留path这个参数。
2.修改方法getCellData(),增加excel path参数
3.新增一个getRowContains()方法,这个方法有三个参数,第一个是Test Case Name,第二个是列的索引好,第三个是sheet名称,该方法的返回值是当前测试用例的行号。
4.新增一个方法getTestStepsCount(),同样有三个参数,分别是Test Case ID, Test Case第一个步骤和sheet名称,返回值是测试用例的步骤数。
修改后的全部代码如下:
package utility; import config.Constants; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; public class ExcelUtils { private static XSSFSheet ExcelWSheet; private static XSSFWorkbook ExcelWBook; private static XSSFCell Cell; // 设置Excel文件路径,方便读取到文件 public static void setExcelFile(String Path) throws Exception { FileInputStream ExcelFile = new FileInputStream(Path); ExcelWBook = new XSSFWorkbook(ExcelFile); } // 读取Excel文件单元格数据 // 新增sheetname参数,这样就可以去读取Test Steps和Test Cases两个工作表的单元格数据 public static String getCellData(int RowNum, int ColNum, String SheetName ) throws Exception{ ExcelWSheet = ExcelWBook.getSheet(SheetName); try{ Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum); String CellData = Cell.getStringCellValue(); return CellData; }catch (Exception e){ return""; } } //得到一共多少行数据 public static int getRowCount(String SheetName){ ExcelWSheet = ExcelWBook.getSheet(SheetName); int number=ExcelWSheet.getLastRowNum()+1; return number; } //得到测试用例的行号 public static int getRowContains(String sTestCaseName, int colNum,String SheetName) throws Exception{ int i; ExcelWSheet = ExcelWBook.getSheet(SheetName); int rowCount = ExcelUtils.getRowCount(SheetName); for (i=0 ; i<rowCount; i++){ if (ExcelUtils.getCellData(i,colNum,SheetName).equalsIgnoreCase(sTestCaseName)){ break; } } return i; } //计算一个测试用例有多少个步骤 public static int getTestStepsCount(String SheetName, String sTestCaseID, int iTestCaseStart) throws Exception{ for(int i=iTestCaseStart;i<=ExcelUtils.getRowCount(SheetName);i++){ if(!sTestCaseID.equals(ExcelUtils.getCellData(i, Constants.Col_TestCaseID, SheetName))){ int number = i; return number; } } ExcelWSheet = ExcelWBook.getSheet(SheetName); int number=ExcelWSheet.getLastRowNum()+1; return number; } }
步骤4:修改DriverScript类代码测试从excel得到数据
1. 外层for循环,得到Test Cases表的Test Case ID, 控制从第一个测试用例开始执行到最后一个测试用例
2.得到Run Mode的值来控制当前测试用例是否被执行。
3.写另外一个内层for循环,控制Test Step表的Test Case ID列。作用就是在当前测试用例,从第一个测试步骤执行到最后一个测试步骤。
完整的Driver Script类代码如下
package executionEngine; import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const; import config.ActionsKeywords; import config.Constants; import utility.ExcelUtils; import java.io.FileInputStream; import java.lang.reflect.Method; import java.util.Properties; /** * create by Anthony on 2018/1/30 */ public class DriverScript { // 声明一个public static的类对象,所以我们可以在main方法范围之外去使用。 public static ActionsKeywords actionsKeywords; public static String sActionKeyword; // 下面是返回类型是方法,这里用到反射类 public static Method method[]; // 新建一个Properties对象 public static Properties OR; public static String sPageObject; public static int iTestStep; public static int iTestLastStep; public static String sTestCaseID; public static String sRunMode; // 这里我们初始化'ActionsKeywords'类的一个对象 public DriverScript() throws NoSuchMethodException, SecurityException{ actionsKeywords = new ActionsKeywords(); method = actionsKeywords.getClass().getMethods(); } public static void main(String[] args) throws Exception { ExcelUtils.setExcelFile(Constants.Path_TestData); // 创建一个文件输入流对象,参数来源外部OR.txt文件 FileInputStream fs = new FileInputStream(Constants.Path_OR); // 创建一个Properties对象 OR = new Properties(System.getProperties()); // 加载全部对象仓库文件 OR.load(fs); // 执行用例 DriverScript startEngine = new DriverScript(); startEngine.execute_TestCase(); } private void execute_TestCase() throws Exception { //获取测试用例数量 int iTotalTestCases = ExcelUtils.getRowCount(Constants.Sheet_TestCases); //外层for循环,有多少个测试用例就执行多少次循环 for(int iTestcase=1;iTestcase<=iTotalTestCases;iTestcase++){ //从Test Case表获取测试ID sTestCaseID = ExcelUtils.getCellData(iTestcase, Constants.Col_TestCaseID, Constants.Sheet_TestCases); //获取当前测试用例的Run Mode的值 sRunMode = ExcelUtils.getCellData(iTestcase, Constants.Col_RunMode,Constants.Sheet_TestCases); // Run Mode的值控制用例是否被执行 if (sRunMode.equals("Yes")){ // 只有当Run Mode的单元格数据是Yes,下面代码才会被执行 iTestStep = ExcelUtils.getRowContains(sTestCaseID, Constants.Col_TestCaseID, Constants.Sheet_TestSteps); iTestLastStep = ExcelUtils.getTestStepsCount(Constants.Sheet_TestSteps, sTestCaseID, iTestStep); //下面这个for循环的次数就等于测试用例的步骤数 for (;iTestStep <= iTestLastStep;iTestStep++){ sActionKeyword = ExcelUtils.getCellData(iTestStep, Constants.Col_ActionKeyword,Constants.Sheet_TestSteps); sPageObject = ExcelUtils.getCellData(iTestStep, Constants.Col_PageObject, Constants.Sheet_TestSteps); execute_Actions(); } } } } private static void execute_Actions() throws Exception { for(int i=0;i<method.length;i++){ if(method[i].getName().equals(sActionKeyword)){ method[i].invoke(actionsKeywords,sPageObject); break; } } } }
运行结果:可以启动浏览器,点击登录,在用户名输入这个步骤还是报错,这个问题我们后面数据驱动文章部分来解决。如果仿照本篇内容运行还是失败,请参考本篇全部项目代码,点击这里。
当前项目层级结构图如下
相关文章推荐
- 关键字驱动框架入门教程-13-项目打包交付给手工测试人员
- 关键字驱动框架入门教程-4-搭建数据引擎-用Apache POI去读取数据
- 关键字驱动框架入门教程-11-测试结果报告
- 关键字驱动框架入门教程-9-用log4j输出日志
- 关键字驱动框架入门教程-7-对象仓库
- 关键字驱动框架入门教程-10-异常处理
- 关键字驱动框架入门教程-2-写关键字框架的步骤
- 关键字驱动框架入门教程-6-建立常数变量
- 关键字驱动框架入门教程-1-介绍
- 关键字驱动框架入门教程-12-数据驱动技术
- 关键字驱动框架入门教程-5-用Java反射机制优化
- 关键字驱动框架入门教程-3-识别并设计实现动作关键字
- Visual Studio 2012 Fakes框架测试驱动开发TDD教程
- [唐胡璐]QTP框架 - 关键字驱动测试框架之八 - Test Run
- testng入门教程5TestNG套件测试
- Appium实践—关键字驱动测试教程(一)
- [唐胡璐]QTP框架 - 关键字驱动测试框架之一 - 框架思想
- testng入门教程2用TestNG编写测试及执行测试
- [唐胡璐]QTP框架 - 关键字驱动测试框架之九 - 测试报告
- 用TestComplete实现一个关键字驱动测试框架