关键字驱动框架入门教程-8-测试套件执行引擎

       当我们谈论自动化测试框架,更多的我们会想到框架的高效。在当前我们搭建的框架阶段,我们只是跑了一条单个的测试用例。在实际自动化测试项目中,很可能是几百条测试用例或者很多个测试组件。有时候我们需要全部执行这些测试用例,有时候我们只需要执行每个测试套件里面的一部分测试用例,一个好的测试框,需要执行类似这样的需求。在这一篇文章,我们将会学到如何在一个测试组里面把测试用例一条一条地执行。所以我们需要设计实现如何从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内容大致如下

       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;
            }
        }
    }

}

运行结果:可以启动浏览器,点击登录,在用户名输入这个步骤还是报错,这个问题我们后面数据驱动文章部分来解决。如果仿照本篇内容运行还是失败,请参考本篇全部项目代码,点击这里

当前项目层级结构图如下






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值