首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HttpRunner 通过 skip 机制实现对测试用例的分组执行控制

背景介绍

近期,某位同学对提了一个需求点:

能否支持类似unittest中的skip注解,方便灵活剔除某些用例,不执行。

目前在接口测试日常构建中,会遇到一些接口开发暂时屏蔽了或者降级,导致用例执行失败;所以想当遇到这些情况的时候,能够临时剔除掉某些用例不执行;等后续恢复后,再去掉,然后恢复执行。

针对这种情况,的确没有直接支持。之所以说是没有支持,是因为在中存在关键字,可以指定某个的运行次数。

例如,如下中指定了为3,那么该就会运行3次。

假如要实现临时屏蔽掉某些,那么就可以将对应的设置为0。

这虽然也能勉强实现需求,但是这跟直接将临时不运行的注释掉没什么区别,都需要对测试用例内容进行改动,使用上很是不方便。

考虑到该需求的普遍性,的确应该增加对该种情况的支持。

在这方面,已经有了清晰的定义,有三种常用的装饰器可以控制单元测试用例是否被执行:

@unittest.skip(reason):无条件跳过当前测试用例

@unittest.skipIf(condition, reason):当条件表达式的值为true时跳过当前测试用例

@unittest.skipUnless(condition, reason):当条件表达式的值为false时跳过当前测试用例

该功能完全满足我们的需求,因此,我们可以直接复用其概念,尝试实现同样的功能。

实现方式

目标明确了,那需要怎么实现呢?

首先,我们先看下中这三个函数是怎么实现的;这三个函数定义在中。

不难看出,核心有两点:

对于,只需要在该测试用例中,而是中定义的一个异常类;

对于和,相比于,主要是需要指定一个条件表达式(condition),然后根据该表达式的实际值来决定是否当前测试用例。

明确了这两点之后,我们要如何在中实现同样的功能,思路应该就比较清晰了。

因为同样也是采用来组织和驱动测试用例执行的,而具体的执行控制部分都是在的方法中;同时,在方法中会传入,也就是具体测试用例的全部信息。

那么,最简单的做法,就是在测试用例中,新增参数,然后在方法中根据参数内容来决定是否执行。

例如,在测试用例中,我们可以按照如下形式新增字段,其中对应的值部分就是我们需要的。

接下来在方法,要处理就十分简单,只需要判断中是否包含字段,假如包含,则执行即可。

这对于机制来做,完全满足需求;但对于,可能就会麻烦些,因为我们的用例是在文本格式的文件中,没法像在中执行那样的Python表达式。

嗯?谁说在中就不能执行函数表达式的?在中,我们已经实现了该功能,即:

在中定义函数,例如

在中通过对函数进行调用

在此基础上,我们要实现就很简单了;很自然地,我们可以想到采用如下形式来进行描述。

其中,定义在文件中。

然后,在方法中,我们只需要判断中是否包含字段,假如包含,则将其对应的函数表达式取出,运行得到其结果,最后再根据运算结果来判断是否执行。对函数表达式进行解析的方法在的函数中,具体实现方式可阅读之前的文章。

与类似,不再重复。

通过该种方式,我们就可以实现在不对测试用例文件做任何修改的情况下,通过外部方式(例如设定环境变量的值)就可以控制是否执行某些测试用例。

效果展示

机制实现后,我们对测试用例的执行控制就更加灵活方便了。

例如,我们可以很容易地实现如下常见的测试场景:

对测试用例进行分组,P0/P1/P2等,然后根据实际需求选择执行哪些用例

通过环境变量来控制是否执行某些用例

更重要的是,我们无需对测试用例文件进行任何修改。

在项目中存在一个示例文件,,大家可以此作为参考。

在运行该测试集后,生成的测试报告如下所示。

最后做个预告,在中文使用文档方面一直比较缺失,近期将集中时间进行梳理,争取尽快给大家一个比较系统的文档手册。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G05MW500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券