接口自动化测试---ddt数据驱动框架(python+excel版)

在测试接口时,采用数据驱动的方式,将数据写在Excel表格中,代码则使用ddt数据驱动是非常方便。

代码调试成功后,只需要在Excel表格中维护测试用例,就可以实现自动化测试接口了。

Excel模板如下:

方法excel_to_list,将excel中每一条测试用例读取到一个列表中:

from openpyxl import load_workbook

def excel_to_list(sheet_name):
    data_list = []
    # 打开excel
    workbook1 = load_workbook(case_file)
    sheet1 = workbook1[sheet_name]  # 定位表单(test_data)
    max_row = sheet1.max_row  # 统计测试用例的行数
    header = get_row_values(sheet1, 1)
    for i in range(2, max_row+1):
        d = dict(zip(header, get_row_values(sheet1, i)))
        data_list.append(d)
    return data_list

简单说明:

1、sheet_name是Excel中的sheet页的名称

2、返回的数据类似:[{'title': '首页__今日__换一批', 'url': '/queryForIndex', 'data': '{}', 'method': 'get', 'exp1': 'stautscode=200', 'exp2': 'msg=查询成功'},{'title': '首页__今日__换一批', 'url': '/queryForIndex', 'data': '{}', 'method': 'get', 'exp1': 'stautscode=200', 'exp2': 'msg=查询成功'}]

具体执行用例(test_api.py)

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Lib.function import *
import requests
import ddt
import unittest
from Lib.case_log import *

data = excel_to_list(sheet_name[1])
@ddt.ddt
class TestCompanyApp(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.sheet_name = sheet_name[1]
        cls.s = requests.Session()
        r = cls.s.post(logUrl_c, data=data_company[1])

    @ddt.data(*data)
    def test_app(self,params):
        print('params:%s' % params)

        case_name = params.get('title')
        url = params.get('url')
        args = eval(params.get('data')) if isinstance(params.get('data'), str) else params.get('data')
        method = params.get('method')
        expct_res1 = params.get('exp1')
        expct_res2 = params.get('exp2')

        # 发起请求,获取返回数据
        if method == 'get':
            result = self.s.get(baseUrl + url, params=args)
        else:
            result = self.s.post(baseUrl + url, data=args)

        # 分析返回数据
        response_data = result.text.replace(':', '=')
        response_data = response_data.replace('"', '')
        # print(response_data)
        if result.status_code in (200, 2016):
            log_case_info(case_name, url, args, expct_res1, result.json())
            assert expct_res1 in response_data
            assert expct_res2 in response_data
        else:
            log_case_info(case_name, url, args, expct_res1, result.status_code)
            assert expct_res1 in response_data

if __name__ == '__main__':
    unittest.main()

 简单说明:

1、cls.s = requests.Session()
        r = cls.s.post(logUrl_c, data=data_company[1])

这2句代码是实例化一个session,访问登陆接口,获取登陆状态并保持。(大部分接口都是需要登录状态的。)

2、@ddt.data(*data)

使用这个代码,data数组有多少个元素,则会自动循环多少次。

--------------------------------------------------------------------------------------------

注:文章内容主要是记录学习过程中遇到的一些问题,以及解决方法。留个记录,同时分享给有需要的人。如有不足之处,欢迎指正,谢谢!  

猜你喜欢

转载自blog.csdn.net/elsa_yxy1984/article/details/108452447