在轻量级测试框架(一)中,可以很清晰的看到Easy to Write, Easy to Read and Understand的设计。下面我们还是结合复杂的API测试用例来看这部分的应用,也就是说我们依据前面的案例逐步的分离出响应数据和请求头信息,以及API接口之间的依赖关系,原始的Yaml文件内容为:
test_name: 登录GET请求
stages:
- name: 登录GET请求
request:
url: http://localhost:5000/login
method: POST
json:
username: wuya
password: admin
sex: 男
age: 18
response:
status_code: 200
json:
age: 18
password: admin
sex: "男"
username: wuya
这个时候我们分离把响应数据,一般针对被测的API来说,它的响应数据是特别多,我们分离出外部的文件里面,然后来进行验证,那么分离出的Python文件为testing_utils.py,该文件里面的内容为:
#!/usr/bin/env python
#!coding:utf-8
def message_login_success(response):
dict1={"age": 18,"password": "admin","sex": "男","username": "wuya"}
assert response.json()==dict1
这样我们可以直接在Yaml文件里面调用该外部文件的,具体最新的Yaml文件的内容为:
test_name: 登录GET请求
stages:
- name: 登录GET请求
request:
url: http://localhost:5000/login
method: POST
json:
username: wuya
password: admin
sex: 男
age: 18
response:
status_code: 200
verify_response_with:
function: testing_utils:message_login_success
在如上的文件中,当我们在结果验证中分离出外部文件,这个地方使用verify_response_with,然后来加载外部的文件信息。
下面具体演示如何使用外部文件来处理参数之间的传递,这地方具体以登录成功后,把认证信息token传递给登录成功后的接口请求,我们把token认证的这部分单独写在外部文件中,然后通过外部文件的模式来解决参数之间的传递问题。我们先在PostMan来看这部分,登录认证授权的接口为:
下来调用查看所有书籍的信息,我们需要传递token的认证信息,具体如下所示:
下面具体结合Tavern来实现这部分,外部文件处理登录成功后的认证信息:
#!/usr/bin/env python
#!coding:utf-8
from box import Box
import requests
def generate_token():
'''获取token的信息'''
r=requests.post(
url='http://localhost:5000/auth',
json={"username":"wuya","password":"asd888"})
headers={'Authorization':'jwt {0}'.format(r.json()['access_token'])}
return Box(headers)
Yaml文件的内容为:
test_name: 获取所有书籍信息
stages:
- name: 获取所有书籍信息
request:
url: http://localhost:5000/v1/api/books
method: GET
headers:
$ext:
function: testing_utils:generate_token
response:
status_code: 200
下来把断言的部分增加到外部文件中,这些主要是获取全部书籍后的信息,那么更新后的外部文件内容为:
#!/usr/bin/env python
#!coding:utf-8
from box import Box
import requests
def generate_token():
'''获取token的信息'''
r=requests.post(
url='http://localhost:5000/auth',
json={"username":"wuya","password":"asd888"})
headers={'Authorization':'jwt {0}'.format(r.json()['access_token'])}
return Box(headers)
datas={
"datas": [
{
"author": "wuya",
"done": True,
"id": 1,
"name": "Python接口自动化测试实战"
},
{
"author": "无涯",
"done": False,
"id": 2,
"name": "Selenium3自动化测试实战"
}
],
"msg": "ok",
"status": 0
}
def get_all_books(response):
assert response.json()==datas
当然这个时候把数据分离到文件中,修改后的外部文件代码为:
#!/usr/bin/env python
#!coding:utf-8
from box import Box
import requests
import json
def generate_token():
'''获取token的信息'''
r=requests.post(
url='http://localhost:5000/auth',
json={"username":"wuya","password":"asd888"})
headers={'Authorization':'jwt {0}'.format(r.json()['access_token'])}
return Box(headers)
def get_all_books(response):
assert response.json()==json.load(open('data.json'))
再次查看最新的Yaml文件,把断言和授权认证都分离到外部文件来加载外部文件来执行,具体如下:
test_name: 获取所有书籍信息
stages:
- name: 获取所有书籍信息
request:
url: http://localhost:5000/v1/api/books
method: GET
headers:
$ext:
function: testing_utils:generate_token
response:
status_code: 200
verify_response_with:
function: testing_utils:get_all_books
再次执行,就可以看到执行后的结果输出:
在如上中,我们可以看到使用Tavern很轻松的就能够实现API的自动化测试,以及很轻松的处理数据的分离以及API之间的依赖关系。再次强调Tavern的设计哲学:Easy to Write, Easy to Read and Understand。