接口自动化测试中,往往测试的接口参数可能较多且测试场景复杂,比如测试参数必填、参数值非法,用例层如果直接定义接口的参数,存在大量重用数据且如果接口发生变更(删除一个参数、修改一个参数名)需要在用例层修改很多地方
为解决这个问题,肯定是要将接口定义和用例层分离处理。
具体思路如下:
1.按模块**将接口定义在对应的yaml文件中,参数使用${parmaname}表示**(方便使用string.safe_substitute()方法进行参数的替换)
*substitute的解释可以查看这篇文章《python-字符串的模板替换》*
2.在baseapi这个父类的__init__方法中读取接口yaml的内容
3.业务api类继承baseapi,在具体接口方法中根据关键字拿到接口定义,根据case层传过来的参数做参数替换,替换后的内容去调用requestUtil中封装的接口处理方法
4.requestUtil的接口处理方法将接口参数没有被替换的${param}进行删除,返回给业务api
5.业务api调用requestsUtil封装的api方法,去发起请求
get接口按这个思路实现很简单,但是post、put接口因为其请求body体是json接口,处理起来稍微复杂一些
样例代码如下:
首先从简单的get接口开始:GET /v1/domains/ d o m a i n i d / p o l i c y 这个接口只有一个路径参数 {domain_id}/policy 这个接口只有一个路径参数 domainid/policy这个接口只有一个路径参数{domain_id}需要替换,headers中有一个$authtoken需要替换。
- 在yaml中这样定义接口:
show_domain_policy:
method: get
url: /v1/domains/${
domain_id}/policy
headers:
Content-Type: application/json;charset=utf8
authToken: $authtoken
2.在baseapi的init中定义从yaml文件中读取该业务api对应文件的所有api定义,会赋值到self.apiconfig变量
class BaseApi():
__envdir = DIR_NAME + "/conf/env.yml"
env = yamlUtil(__envdir).readyaml()
def __init__(self,serviceyaml):
self.baseurl = self.env['protocl']+'://'+self.env['envConfig'][self.env['default']] ##从env文件读取参数拼接调用域名
apidir = os.path.abspath(os.path.realpath(__file__) + os.path.sep +'../')+'/apiyaml/'+serviceyaml
self.apiconfig =yamlUtil