pytest + excel参数驱动

背景

最近紧急支持一个接口测试,打算把接口的参数都放到execl中维护,且一个接口需要请求两次。

使用技术

excel中写入要测试的用例,包含接口、传入的参数、请求预期结果、等级等
openpyxl读取excel
@pytest.mark.parametrize('data', all_list)接受读取的excel数据其中all_list是列表,元素是字典==每一行的excel数据

思路

1.execl中构造参数

接口需要请求两次或者多次,比较两次后台返回的结果,那么对应的execl中的数据下图:
image

红色的代表第一次请求参数和请求结果,蓝色的代表第二次请求参数和结果;

2.pytest接受excel中的数据

2.1 先用openpyxl读取excel数据

image

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'))



posted @ 2022-11-28 11:57  Tarzen  阅读(927)  评论(0)    收藏  举报