数据驱动自动化接口测试进阶
上一章我们实现的接口自动化只能对单个yaml文件生效,如果我们有一堆yaml文件,就抓瞎了,所以诞生了这篇进阶篇
思路
前置数据
1
2- 很多yaml文件(login.yaml、regiser.yaml)
- 模板文件通过yaml文件和模板文件生成.py类
- 通过unittest.defaultTestLoader.discover加载所有的测试类
- 执行所有的用例
1.测试数据
login_case.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27-
url : http://118.24.3.40/api/user/login # 访问url
method : post # 请求方式
detail : 登录接口-成功用例 # 用例描述
header:
cookie:
is_json : False
data: # 请求数据
username : niuhanyang
passwd : aA123456
check: # 检查点
- sign
- userId
-
url : http://118.24.3.40/api/user/login # 访问url
method : post # 请求方式
detail : 登录接口-失败用例 # 用例描述
header:
cookie:
is_json : False
data: # 请求数据
username : niuhanyang
passwd : aA1234567
check: # 检查点
- 用户名/密码错误
- error_coderegiser_case.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27-
url : http://118.24.3.40/api/user/login # 访问url
method : post # 请求方式
detail : 注册接口-成功用例 # 用例描述
header:
cookie:
is_json : False
data: # 请求数据
username : niuhanyang
passwd : aA123456
check: # 检查点
- sign
- userId
-
url : http://118.24.3.40/api/user/login # 访问url
method : post # 请求方式
detail : 注册接口-失败用例 # 用例描述
header:
cookie:
is_json : False
data: # 请求数据
username : niuhanyang
passwd : aA1234567
check: # 检查点
- 用户名/密码错误
- error_code
2.模板文件
- case_template(在之前的基础上去除执行器,并且将测试类名和文件名都进行%s替换,方便我们后续处理)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35import unittest
import ddt
import requests
@ddt.ddt
class %s(unittest.TestCase):
@ddt.file_data(r'%s') # 导入yaml用例文件
def test_interface(self,**test_data):
url = test_data.get('url',None)
method = test_data.get('method',None)
detail = test_data.get('detail',None)
self._testMethodDoc = detail # ※添加用例描述
header = test_data.get('header',None)
cookie = test_data.get('cookie',None)
is_json = test_data.get("is_json",None)
data = test_data.get('data',None)
check = test_data.get('check',None)
if method:
method = str(method).upper()
if method == "GET":
res = requests.get(url=url,params=data,headers=header,cookies=cookie)
elif method == "POST":
if is_json:
res = requests.post(url=url,json=data,headers=header,cookies=cookie)
else:
res = requests.post(url=url,data=data,headers=header,cookies=cookie)
else:
res = "CASE WRONG,CASEDATA:"+url+method+detail+header+cookie+is_json+data
else:
res = "CASE WRONG,CASEDATA:"+url+method+detail+header+cookie+is_json+data
# 比较接口执行结果
for c in check:
self.assertIn(c,res.text,detail+'--测试执行失败,'+c+'检查失败')
3.将模板文件和yaml数据处理成测试类
- 读取cases文件夹下所有以.yaml结尾的文件
- 获取文件名
- 读取模板文件
- 将文件名和文件地址传入到模板文件中
- 保存为数据文件.py结尾的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def create_py():
all_file = glob.glob('../cases/*.yaml')
all_class_name = []
for file in all_file:
file_name = file.split('%s'%os.sep).pop().replace('.yaml','')
all_class_name.append(file_name)
with open('../data/case_template',encoding='utf-8') as f:
template_str = f.read()
for class_name in all_class_name:
with open(os.path.join('../cases/',class_name+'.py'),'w',encoding='utf-8') as fw:
template_coding = template_str % (class_name.capitalize(), os.path.join('../cases/',class_name+'.yaml'))
fw.write(template_coding)
create_py()
4.执行用例
- 通过unittest.defaultTestLoader.discover(‘../cases/‘, “*.py”)读取所有的测试类文件
- 将所有的case添加到suit中
- 执行器执行
1
2
3
4
5
6
7def run_all_case():
test_suit = unittest.TestSuite()
all_case = unittest.defaultTestLoader.discover('../cases/', "*.py")
[test_suit.addTest(case) for case in all_case]
print("加载%s条用例" % test_suit.countTestCases())
runner = BeautifulReport.BeautifulReport(test_suit)
runner.report(description="测试用例描述", filename="report.html")
5.开始执行吧
1 | create_py() |