我们在做api测试的时候,如果只要测试单个接口,可以用httprunner。 这个工具的思维我们可以借鉴一下。 如果我们想灵活的应用呢,可以自己用数据驱动的方式,来实现自己的自动化框架。 用pytest就可以实现。 首先我们将charles的har包转换成yaml文件。 用命令
har2case test_login_demo.har -2y
就可以得到类似的这个文件:
teststeps:
- name: /services/api/mobile/service/appversion
request:
headers:
Accept-Encoding: gzip
Connection: Keep-Alive
Content-Length: '77'
Content-Type: application/json; charset=UTF-8
Host: stg-ec.ef.com.cn
User-Agent: Android/SmartEnglish:2.1.14(okhttp/4.8.1)
json:
serviceRequest:
appVersion: 2.1.14
platform: Android
productId: 4
method: POST
url: https:///services/api/mobile/service/appversion
validate:
- eq:
- status_code
- 200
- eq:
- headers.Content-Type
- application/json; charset=utf-8
将这个文件提取出来:
import yaml
import os
def get_test_data(filepath):
if os.path.exists(filepath):
case = [] # 存放测试用例名
requests = [] # 存放http请求对象
validate = [] # 存放断言
with open(filepath, encoding='utf-8') as f:
data = yaml.load(f.read(), Loader=yaml.SafeLoader)['teststeps']
print(data)
for i in range(len(data)):
case.append(data[i]['name'])
requests.append(data[i]['request'])
validate.append(data[i]['validate'])
params = zip(case, requests, validate)
return case, params
else:
print("file not exist!")
cases, parameters = get_test_data('C:\\work\\code\\python\\oneapp.yaml')
好了,我们可以写case了
from apitest import get_test_data
import pytest
import requests
import allure
cases, parameters = get_test_data('C:\\work\\code\\python\\oneapp.yaml')
list_params = list(parameters)
class TestApi():
@pytest.fixture(scope="session")
def get_cookie_session(self):
url = "https://services/api/mobile/service/login"
json = {
"serviceRequest": {
"userName": "stestc13035",
"password": "1",
"appVersion": "2.1.14",
"platform": "Android",
"productId": 4
}
}
res = requests.session().post(url=url, json=json, verify=False)
token = res.json()["serviceResponse"]["token"]
session = res.json()["serviceResponse"]["sessionId"]
yield token, session
# return cookie, session
@pytest.mark.parametrize('case, parameters,ids', list_params, ids=cases)
def test_each_api(self, case, parameters, ids, get_cookie_session):
token, session = get_cookie_session
with allure.step("test the case {}".format(case)):
header = parameters["headers"]
json = parameters["json"]
parameters["json"]["serviceRequest"]["token"] = token
parameters["json"]["serviceRequest"]["sessionId"] = session
method = parameters["method"]
url = parameters["url"]
res = requests.request(method, url=url, headers=header, json=json, verify=False)
assert res.status_code == 200
import os
if __name__ == "__main__":
pytest.main(['-s', '-q', 'test_oneapp_api.py', "--alluredir", "./xml", '--reruns', '1', '--reruns-delay', '1'])
os.system("allure serve ./xml")
这样就可以运行起来了,运行的报告如下: 总体如下:
具体如下:
这样一个很简单的框架就搭建起来了。