博客
关于我
Python+requests+unittest执行接口自动化测试详情
阅读量:796 次
发布时间:2023-03-07

本文共 5159 字,大约阅读时间需要 17 分钟。

Python接口自动化测试实践指南

随着软件开发的快速迭代,自动化测试已成为保障代码质量的重要环节。以下将从基础到高级实践,指导你如何利用Python、requests、unittest等工具实现接口自动化测试。

1. 环境搭建

安装所需的第三方库是自动化测试的基础。通过以下命令可以快速完成安装:

pip install requestspip install xlrdpip install jsonpip install unittest

2. 项目框架设计

基于Page Object Model设计理念,我们创建了六个核心Python包,分别为:

  • base:封装所有公共请求方法。
  • common:存储通用功能模块,如日志记录、Excel数据读取等。
  • pages:根据业务功能划分页面类。
  • test_cases:存储测试用例,采用数据驱动测试方式。
  • reports:用于存储测试报告。
  • config:存储测试配置信息,如路径设置。
  • 3. 核心功能模块开发

    3.1 Base Page 实现

    base/Base_Page.py 是核心模块,封装了所有常见的HTTP请求方法:

    import requestsclass Base:    def method_post(self, url, params=None, data=None, headers=None, files=None):        return requests.post(url=url, params=params, data=data, headers=headers, files=files)        def method_get(self, url, params=None, data=None, headers=None, files=None):        return requests.get(url=url, params=params, data=data, headers=headers, files=files)        def method_put(self, url, params=None, data=None, headers=None, files=None):        return requests.put(url=url, params=params, data=data, headers=headers, files=files)        def method_delete(self, url, params=None, data=None, headers=None, files=None):        return requests.delete(url=url, params=params, data=data, headers=headers, files=files)    def requests_type(self, method, url, params=None, data=None, headers=None, files=None):        if method in ['post', 'POST']:            return self.method_post(url=url, params=params, data=data, headers=headers, files=files)        elif method in ['get', 'GET']:            return self.method_get(url=url, params=params, data=data, headers=headers, files=files)        elif method in ['put', 'PUT']:            return requests.put(url=url, params=params, data=data, headers=headers, files=files)        elif method in ['delete', 'DELETE']:            return requests.delete(url=url, params=params, data=data, headers=headers, files=files)

    3.2 通用功能模块开发

    common/Common.py 实现了日志记录、Excel数据读取等功能:

    import loggingimport timeimport xlrd# 配置日志路径和报告路径log_path = r'D:\PycharmProjects\自动化接口测试\report\logs'report_html = r'D:\PycharmProjects\自动化接口测试\report\html'read_xlrd = r'D:\PycharmProjects\自动化接口测试\data'class Common:    def get_logs(self, path=log_path):        # 初始化日志器        logs = logging.getLogger()        logs.setLevel(logging.DEBUG)                # 生成日志文件路径        timestamp = time.strftime('%Y-%m-%d-%H-%M-%S')        log_file = f'{path}/{timestamp}.log'                # 配置文件处理器        file_handler = logging.FileHandler(log_file, 'a+', encoding='utf-8')        file_handler.setLevel(logging.DEBUG)                # 设置日志格式        formatter = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s')        file_handler.setFormatter(formatter)        pycharm_handler = logging.StreamHandler()        pycharm_handler.setFormatter(formatter)                # 添加日志处理器        logs.addHandler(file_handler)        logs.addHandler(pycharm_handler)        return logs    def ReadExcelTypeDict(self, file_name, path=read_xlrd):        # 读取Excel文件并转换为字典        path = f'{path}/{file_name}'        work_book = xlrd.open_workbook(path)        sheets = work_book.sheet_names()        DatasList = []        for sheet in sheets:            sheets = work_book.sheet_by_name(sheet)            nrows = sheets.nrows            for i in range(nrows):                values = sheets.row_values(i)                DatasList.append(values)                # 转换为字典        title_list = DatasList[0]        content_list = DatasList[1:]        new_list = []        for content in content_list:            dic = {}            for i in range(len(content)):                dic[title_list[i]] = content[i]            new_list.append(dic)        return new_list

    4. 测试用例设计

    4.1 测试用例框架

    在 test_cases/TestLogin.py 中,使用 unittest 和 ddt 框架设计测试用例:

    import unittestimport ddtfrom common import commons as commonfrom base import Base_Page as Base@ddt.ddtclass TestLogin(unittest.TestCase):    def setUp(self):        self.logs = common.Common().get_logs()        self.logs.debug('开始本条接口用例')            def tearDown(self):        self.logs.debug('结束本条用例')        @ddt.data(*common.Common().ReadExcelTypeDict('cezxhi.xlsx'))    def test_logins(self, pars):        import json        dic = json.loads(pars['body参数值'])        url = pars['接口地址']        fs = pars['请求方式']        result = Base().requests_type(method=fs, url=url, data=dic)        self.assertEqual(result.text, pars['预期结果'])

    4.2 数据驱动测试

    通过读取Excel文件,动态加载测试数据,实现数据驱动测试:

    # 读取Excel文件并获取测试数据test_data = common.Common().ReadExcelTypeDict('cezxhi.xlsx')

    5. 测试报告生成

    在测试用例执行后,调用 common.Common().GetHtmlResult 生成HTML测试报告:

    from unittest import TestLoader, Suiteimport HTMLTestReportCNdef run_tests():    loader = TestLoader()    test_cases = loader.loadTestsFromTestCase(TestLogin)    suite = Suite([test_cases])    common.Common().GetHtmlResult(suite, '登录测试用例')    if __name__ == '__main__':    run_tests()

    6. 运行结果分析

    运行测试后,查看控制台输出和生成的测试报告:

    运行结果:INFO:root:开始写入接口自动化测试用例...INFO:root:自动化接口用例结束测试报告路径:D:\PycharmProjects\自动化接口测试\report\html\2024-03-21-10-23-59.html

    7. 常见问题

  • HTTP 400 错误:可能是由于接口地址错误、参数不完整或空参数导致。
  • sessionId 不稳定:需要检查登录接口是否返回正确的 sessionId。
  • 通过以上步骤,你可以实现一套完整的接口自动化测试框架,并根据实际项目需求进行扩展和调整。

    转载地址:http://dgofk.baihongyu.com/

    你可能感兴趣的文章