pytest + excel参数驱动
背景
最近紧急支持一个接口测试,打算把接口的参数都放到execl中维护,且一个接口需要请求两次。
使用技术
excel中写入要测试的用例,包含接口、传入的参数、请求预期结果、等级等
openpyxl读取excel
@pytest.mark.parametrize('data', all_list)接受读取的excel数据其中all_list是列表,元素是字典==每一行的excel数据
思路
1.execl中构造参数
接口需要请求两次或者多次,比较两次后台返回的结果,那么对应的execl中的数据下图:

红色的代表第一次请求参数和请求结果,蓝色的代表第二次请求参数和结果;
2.pytest接受excel中的数据
2.1 先用openpyxl读取excel数据

public_execl.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
=================================================
操作excel
==================================================
"""
from public.public_logger import get_logger
from openpyxl import load_workbook
case_list_file_path = '/home/tarzan/Desktop/mytest.xlsx'
logger = get_logger()
# 读取execl数据
def read_excel_fun(start: int, end: int) -> list:
"""
start: int 用例开始行数
end: int 用例结束行数
读取execl思路:因为需要传两次参数,所以我们把参数均放到字典中以键值对的方式存放。
先获取key:['name-1','name-2]
再获取value:[one,tow]
最后行程key-value:{'name-1':'one','name-2','two'}
传给pytest中:[{'name-1':'one','name-2','two'},{'name-1':'one','name-2','one'}]
"""
logger.info('读取execl中的数据')
wbook = load_workbook(filename=case_list_file_path)
wsheet = wbook['Sheet1']
# 1.获取key[name-1 ,name-2 ,age-1 ,age-2 ,code-1 ,code-2]
name_range = wsheet["C2":"H2"]
list_name = []
for x in name_range[0]:
# print(x.value)
list_name.append(x.value)
#
all_list = []
for x in range(start, end):
dict1 = {}
list_value = []
# 读取一行数据
cell_range = wsheet["C%s" % x:"H%s" % x]
# print(cell_range)
# 将行数据添加到列表中[one ,two ,one ,two ,one ,two]
for y in cell_range[0]:
# print(y.value)
list_value.append(y.value)
# 将key和value对应 在字典中{name-1:one,name-2:two}
for z in range(len(list_name)):
dict1[list_name[z]] = list_value[z]
# print(dict1)
# 将字典放到列表中[{name-1:one,name-2:two},{name-1:one,name-2:one},] 这个列表将传给pytest中
all_list.append(dict1)
# print(all_list)
logger.info(all_list)
wbook.save(filename=case_list_file_path)
return all_list
if __name__ == '__main__':
print(read_excel_fun(3, 5))
输出结果:
[{'name-1': 'one', 'name-2': 'two', 'age-1': 'one', 'age-2': 'two', 'code-1': 'one', 'code-2': 'two'},
{'name-1': 'one', 'name-2': 'one', 'age-1': 'one', 'age-2': 'one', 'code-1': 'one', 'code-2': 'one'}]
注意:我这里没有读取url,因为是固定的,所以在代码中写死
2.2 测试用例读取
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
import allure
import os
import requests
from assertpy import assert_that
from public.public_logger import get_logger
from public.public_execl import read_excel_fun
logger = get_logger()
all_list = read_excel_fun(3, 5)
logger.info(all_list)
@pytest.mark.parametrize('data', all_list)
class TestCase:
def test_chanage(self, cache, clean_teardown, data):
"""
"""
logger.info('\n' + os.environ.get('PYTEST_CURRENT_TEST'))
logger.info('测试数据:')
logger.info(data) # {'name-1': 'one', 'name-2': 'two', 'age-1': 'one', 'age-2': 'two', 'code-1': 'one', 'code-2': 'two'}
message = '用例执行步骤:获取参数1'
with allure.step(message):
data_1 = {'name': data.get('name-1'), 'age': data.get('age-1')}
res1 = requests.post('/test', json=data_1)
message = '用例执行步骤:获取参数2'
with allure.step(message):
data_2 = {'name': data.get('name-1'), 'age': data.get('age-1')}
res2 = requests.post('/test', json=data_2)
message = '用例执行步骤:判断第一次和第二次请求结果'
with allure.step(message):
logger.info('\n' + message)
if data.get('code-1') == data.get('code-2'):
assert_that(res1.json().get('code')).is_equal_to(res2.json().get('code'))
else:
assert_that(res1.json().get('code')).is_not_equal_to(res2.json().get('code'))

浙公网安备 33010602011771号