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

发布网友 发布时间:2024-10-24 14:10

我来回答

1个回答

热心网友 时间:2024-10-30 08:32

某同学提出了需求,希望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近期将集中时间进行梳理,尽快提供系统文档手册。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com