基于testNG框架的分层式数据驱动自动化测试设计与研发(一)

本文深入解析了TestNG框架的核心概念及使用方法,包括@BeforeClass、@Test等注解的应用场景,以及@DataProvider如何实现数据驱动测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前整个流程已经基本研发完成,我们首先从测试脚本开发的工程师角度入门,由简到繁慢慢剖析这个过程,

从分析一段测试脚本的code开始,简略code大致如下:

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){

    ......
    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获取到我们想要的测试数据,完成数据驱动。

转载于:https://my.oschina.net/u/659658/blog/131113

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值