HttpRunner 通过 skip 机制实现对测试用例的分组执行控制
发布网友
发布时间:2024-10-24 14:10
我来回答
共1个回答
热心网友
时间:1天前
某同学提出了需求,希望HttpRunner能支持类似unittest中的skip注解,方便剔除某些测试用例,避免执行。在接口测试中,有时遇到接口未开发完成或暂时被屏蔽,导致用例执行失败。此时,希望能在遇到这些情况时,能临时不执行某些用例,等后续恢复后再执行。目前,HttpRunner并未直接支持此功能。
然而,一个替代方案是利用HttpRunner中的times关键字。比如,给某个测试用例设置times为3,那么该测试用例将执行3次。若要实现临时屏蔽某些测试用例,则可以将对应测试用例的times设置为0。此方法虽然勉强满足需求,但需要修改测试用例内容,操作不便。
考虑到该需求的普遍性,HttpRunner确实应该增加对这种需求的支持。在unittest中,已有三种装饰器控制单元测试用例的执行:skip、skipIf和skipUnless。此功能完全满足需求,我们可以通过复用unittest概念来实现。
实现方式如下:明确unittest中skip、skipIf和skipUnless的实现方式。在HttpRunner中,我们同样使用unittest组织和驱动测试用例执行。在httprunner/runner.py的_run_test方法中,我们通过传递testcase_dict(具体测试用例信息)来控制执行。
在YAML/JSON测试用例中,我们新增skip、skipIf和skipUnless参数。在_run_test方法中,根据参数内容判断是否执行raise SkipTest(reason)。例如,新增skip字段,值部分为reason。运行方法中,只需检查testcase_dict中是否包含skip字段,包含则执行raise SkipTest(reason)。
对于skipIf和skipUnless,由于用例在YAML/JSON文本格式文件中,无法直接使用像unittest中的condition那样的Python表达式。但在HttpRunner中,我们实现了函数表达式功能。因此,可以使用如下形式描述skipIf和skipUnless。其中,skip_test_in_production_env定义在debugtalk.py文件中。
在_run_test方法中,检查testcase_dict中是否包含skipIf字段,若包含,则取出对应的函数表达式,运行得到结果,再根据运算结果决定是否执行raise SkipTest(reason)。解析函数表达式的方法在httprunner/context.py的exec_content_functions函数中。
通过此方式,我们无需修改测试用例文件,就能通过外部方式(如设置环境变量值)控制是否执行某些测试用例。实现后,测试用例的执行控制更加灵活方便。
例如,可以轻松实现常见测试场景。在HttpRunner项目中有一个示例文件,httprunner/tests/data/demo_testset_cli.yml,可以作为参考。运行该测试集后,生成的测试报告如下所示。对于中文使用文档的缺失,HttpRunner近期将集中时间进行梳理,尽快提供系统文档手册。