目前整个流程已经基本研发完成,咱们首先从测试脚本开发的工程师角度入门,由简到繁慢慢剖析这个过程, 设计模式
从分析一段测试脚本的code开始,简略code大体以下: app
public class BasicOrderCancelOperateServiceTest { 框架
@BeforeClass
public void beforeClass(){
Environment.set4If();
}
/**
* 订单取消
* @throws Exception
*/
@Test(description = "订单取消检查", dataProvider = "basicOrderCancelProcess", timeOut = 70000, enabled=true)
public void basicOrderCancelProcess(Map < String, String > datadriven) throws Exception {
....
}
@DataProvider(name = "basicOrderCancelProcess", parallel = false)
public Iterator<Object[]> data4basicOrderCancelProcess(Method method) throws Exception {
return new ExcelProvider2(this, "basicOrderCancelProcess");
}
private CheckResultBean doCheck(BasicOrderCancelResponse response,Map < String, String > datadriven){ ide
......
return new CheckResultBean(result,content);
}
}
说说testNG框架的注解 测试
1.@before class这一段方法执行Environment.set4If(),其实很简单,作的事就是系统环境变量初始化, 经过读取d:/TA/TA.properties这个文件,把这个文件里设置的base.properities里全部环境变量设置到系统properties中 2.@Test(description = "订单取消检查", dataProvider = "basicOrderCancelProcess", timeOut = 70000, enabled=true)为例: 玩过自动化测试框架的,对基于注解的这种设计方式应该不会陌生,框架封装好各类自定义注解,咱们根据需求很Happy的调用就行了。 @Test把一个类或者方法标记为测试的一部分,括号里的部分根据测试需求进行配置。欲详细了解testNG基于注解的设计模式,一句话,全部的真相都在源码里,反编译testNG jar包,找org.testng.annotations包 ,这个包提供全部注解关键词的接口类,以@Test为例,能够在这个包里找到对应的Test注解接口类,固然必需要实现注解解析器,不难在 code里找到org.testng.internal.annotations包,这个包里对全部自定义注解作了详细解析,咱们来看包里TestAnnotation类对应解析的 就是org.testng.annotations.Test,无非就是把注解里的各类attibutes各类set,好,既然dataProvider咱们set的值是basicOrderCancelProcess, 咱们须要在code里定义一个被注解为@DataProvider name = "basicOrderCancelProcess"的方法, 缘由能够查看testNG的注解指南:@DataProvider标识一个方法用于为测试方法提供数据。被注解的方法必须返回Object[][], 其中每一个Object[]能够指派为测试方法的参数列表。从这个DataProvider接收数据的@Test方法须要使用一个和当前注解相同名称的dataProvider名称. 有兴趣的同窗能够在testNG的源码中追踪到被注解为DataProvider的方法是如何被invoke的,最后定位到MethodInvocationHelper的invokeDataProvider方法,总之最后返回了 Iterator<Object[]>这个数据对象。 咱们回到case自己继续看data4basicOrderCancelProcess这个被注解为DataProvider的方法具体是如何实现的:调用了ExcelProvider2这个玩意(这是咱们分层式测试框架中实现的一个类) ,返回了Iterator<Object[]>对象, 因而乎,追踪到ExcelProvider2这个类,在实例化这个对象的时候一共作了三件事: 1)getInfo(aimob, aimmathod); 第一个参数是咱们test case自己这个对象实例,第二个参数是被注解为@Test的成员方法 看源码实现细节,首先调用locateTestMethod(aimob, aimmathod),返回该成员方法的Method实例,取得注解对象实例,强转为DataDriven类型对象,第一次load该对象时,分别 调用modifydata,modifysheet,modifyType这三个方法,modifydata获取系统变量Selenium.DatadrivenRoot对应的值,该值为数据文件存放全路径,该方法返回全路径字符串;modifysheet 直接返回该被注解为@Test的成员方法名;modifyType默认返回字符串“excel”,表示数据文件类型为 excel类型。 2)openSheet(); 顾名思义,解析前面load到的excel数据文件 3)getRowname(); 获取第一行row的每一个cell对应的值即每一列的列名 接着仔细分析ExcelProvider2这个类的具体实现,它继承了Iterator<Object[]>,而且覆写了迭代器的成员方法next(),,迭代器中的每一个item由一个hashmap实现, map里填充从excel文件解析出来的数据:(列名:每行的列值 一一对应) 继续回到case的code,这下咱们有了DataProvider数据集,数据集的每个Item为一个hashmap对象,那么在case中被注解为@Test的成员方法中传递的参数类型即为一个hashmap对象,方法 定义以下: public void basicOrderCancelProcess(Map < String, String > datadriven) throws Exception 从参数datadriven获取到咱们想要的测试数据,完成数据驱动。