1. HttpRunner安装
pip install httprunner
可在git上下载源码:https://github.com/HttpRunner/HttpRunner
2. 背景
在HttpRunner中,测试用例引擎最大的特色就是支持YAML/JSON格式的用例描述形式。
不过,问题在于,接口通常会出现在多个测试场景中,而每次都需要对接口进行定义描述,包括请求的URL、Header、Body、以及预期响应值等,这就会产生大量的重复。
3. 接口-模块-场景分层
httprunner中实现了接口-模块-场景分层。通过startproject命令创建项目,可以看到以下目录。
$ hrun --startproject OWInterfacesV2
INFO:root: Start to create new project: D:\python\OWInterfacesV2
INFO:root: created folder: D:\python\OWInterfacesV2
INFO:root: created folder: D:\python\OWInterfacesV2\tests
INFO:root: created folder: D:\python\OWInterfacesV2\tests\api
INFO:root: created folder: D:\python\OWInterfacesV2\tests\suite
INFO:root: created folder: D:\python\OWInterfacesV2\tests\testcases
INFO:root: created file: D:\python\OWInterfacesV2\tests\debugtalk.py
tests
├── api
├── debugtalk.py
├── suite
└── testcases
在组织测试用例描述的文件目录结构时,遵循以下约定:
- 将项目的所有API接口定义放置在api目录下,并在api目录中按照项目的系统模块来组织接口的定义。
备注:
---接口定义块的标识为api;
---接口定义块中包含def字段,形式为api_name(*args),作为接口的唯一标识ID;需要注意的是,即使api没有参数,也需要带上括号,api_name();这和编程语言中定义函数是一样的。
约定将项目的所有模块定义放置在suite目录下,并在suite目录中按照项目的功能来组织模块的定义。相当于,多个api的组合。
后续,在testcases目录中描述测试场景,可同时引用接口定义和模块定义。
另外,相关的函数定义放置在debugtalk.py中
4. 结合项目实践
结合到公司项目中的测试用例,遇到的问题:
一个接口B(如login接口)依赖于前一接口A(如getToken接口)的输出结果(获取validate token),在编写B的各种用例时,每个用例都需调用一次A。
比如下图:
validate接口测试完后,可以extract出输出结果中的token($valtoken),在login_success用例中作为入参。解决方法:
因为很多接口的前提是先获取validate token或先登录,所以把get_validate_token的接口封装出来,放在debugtalk.py下。这样在测试用例中可以直接调用。同时,也把一些由环境决定的参数提取出来(测试环境或生产环境)。
新增一个env.py文件,将环境的设置和一些公共不变的参数放在其中。如:test或prod环境,baseurl,headers等参数。
在debugtalk.py中添加方法:根据不同环境得到不同的变量,如:get_validate_token(), get_login_token(), login_email(), reg_email()等方法。
注意:
.yml中的测试用例是按顺序执行的。
比如:如果放置用例的顺序是login, logout, query。则在logout后,之前login获取的token就不能用了,到执行query时,用例会失败,提示invalidate token。
为了避免这种非被测内容本身引起的错误,需注意下用例的顺序。这里把logout放置在最后。