# 基于unittest+requests的接口自动化测试框架 **Repository Path**: testcodes/interface-automation ## Basic Information - **Project Name**: 基于unittest+requests的接口自动化测试框架 - **Description**: 基于Unittest + requests+ unittestreport搭建的接口自动化测试框架: 用例支持失败重试,多线程并发执行; 可生成3种不同风格的测试报告;并支持将报告及结果发送钉钉和企业微信。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-28 - **Last Updated**: 2025-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: 接口自动化, 自动化测试, unittest, Requests, unittestreport ## README ## 接口自动化测试框架 ### 介绍 - 基于Unittest + requests + unittestreport 搭建的接口自动化测试框架: - Unittest是Python标准库中自带的测试框架,不需要安装任何额外的包,可以在任何Python环境中使用。 - requests是 Python中一个非常流行且强大的HTTP库,它简化了与Web服务的交互,提供了简单易用的API,使得发送请求变得非常方便。 - unittestreport是柠檬班-木森老师基于unittest开发的的一个功能扩展库,支持3种风格HTML测试报告生成,支持失败重试、多线程并发执行、发送测试结果及报告到邮箱、钉钉及企业微信。 unittest 官方文档: https://docs.python.org/zh-cn/3/library/unittest.html requests 官方文档:https://requests.readthedocs.io/en/latest/ unittestreport 官方文档:https://unittestreport.readthedocs.io/en/latest/ ### 项目结构 |----application 应用配置目录 | |----configs 环境配置 | |----testing.py 测试环境 | |----pro.py 生产环境 | |----setting.py 核心配置 | |----core 核心文件目录 | |----auth.py 认证服务 | |----custom_assert.py 自定义断言 | |----database.py 数据库操作配置 | |----http_request.py 请求配置 | |----unit_case.py 基础类 | |----utils 通用方法及工具目录 | |----testCase 测试用例目录 | |----script 脚步运行目录 | |----caseFiles 用例文件 | | |----testCase.xlsx Excel用例模板 | | |----execute.py Excel用例执行文件 | | | |----template 模板目录 | | |----case.py 用例文件生成模板 | | | |----sync_from_swagger.py 从swagger同步接口 | |----testResult 测试结果目录 |----requirements.txt 依赖包信息 |----main.py 程序主文件 ## 开发环境 开发语言:Python 3.10 开发框架:unittest + requests + unitestreport ## 开发工具 Pycharm 2023.2 推荐插件:Chinese (Simplified) Language Pack / 中文语言包 ## 使用 ``` # 安装依赖库 pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 第三方源: 1. 阿里源: https://mirrors.aliyun.com/pypi/simple/ 2. 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple/ 3. 中国科技大学: https://mirrors.bfsu.edu.cn/pypi/web/simple/ 4. 豆瓣: https://mirrors.cloud.tencent.com/pypi/simple/ ``` ### 从swagger同步接口并生成用例 ```shell python sync_from_swagger.py ``` ### 执行测试用例集 ```shell python main.py ``` ## 其他操作 用例规范 - 用例文件需存放于testCase目录下,且以test开头(示例:test_login.py); - 用例必须要写在类中,并且类要继承UnittestCase,类中用例名称要以test_开头; 用例默认执行顺序 - 同一层级的文件名通过ASC码排序,先找到的文件,先收集里面的用例; - 不同层级的文件:从外到内,即先把外层目录下的收集完成后,在找文件夹里面的; - 文件当中的用例执行顺序:从上到下,按照代码顺序; - 需要跳过用例不执行时,在用例方法中添加装饰器@unittest.skip即可; - 想要按照自定义顺序执行时: ``` 文件顺序:在test*.py中加入序号,如:test_01login.py,test_02register.py 用例顺序:在方法名称中加入序号,如:def test_01normal_login, def test_02empty_name_login ``` 代码示例: ```python # test_user_reset_password.py from core.unit_case import * # 引入公共类 from ddt import ddt, data, unpack, file_data # 引入数据驱动测试 # 非数据驱动测试 class UserRegister(MyUnit): """重置密码""" url = '/api/user/reset/password' # @unittest.skip('skip this case') def test_user_reset_password_normal(self): """重置密码-正确传参""" logger.info("开始执行用例.") # 获取信息 token = self.auth.get() # 获取授权token # Body请求参数 body_data = { "username": 'tester', # *用户名 "password": 'Test@123456' # *会员密码 } # 调用请求 # 自定义请求参数,减少重复性代码,按需调用 # 调用方法参照core/http_request.py 如:set_params/set_headers/set_files... # 也可以直接调用self.http.base_request(method, **kwargs), 同session.request self.http.set_url(self.url) # 设置接口地址 self.http.set_json(body_data) # 设置接口请求json参数 self.http.add_token(token) # 添加授权token response = self.http.post() # 发起请求并获取响应数据 # 断言 assertion = CustomAssert(response) # 断言服务 assertion.response_normal() # 判断response是否正常返回 assertion.status_code_equal() # 状态码是否为预期值,默认200 assertion.code_equal() # 错误状态码是否为预期值,默认200 # 用例执行结束 logger.info("用例执行完成.") @ddt # 数据驱动测试 class UserRegister01(MyUnit): """重置密码""" url = '/api/user/reset/password' # 第一种:导入测试数据 normal_data = [ {"user": "tester01", "pwd": ""}, {"user": "", "pwd": "Test@123456"} ] @data(*normal_data) # @unittest.skip('skip this case') def test01_user_reset_password_empty(self, values): """重置密码-参数为空""" logger.info("开始执行用例.") # 获取信息 token = self.auth.get() # 获取授权token # Body请求参数 body_data = { "username": values['user'], # *用户名 "password": values['pwd'] # *会员密码 } # 调用请求 self.http.set_url(self.url) # 设置接口地址 self.http.set_json(body_data) # 设置接口请求json参数 self.http.add_token(token) # 添加授权token response = self.http.post() # 发起请求并获取响应数据 # 断言 assertion = CustomAssert(response) # 断言服务 assertion.response_normal() # 判断response是否正常返回 assertion.status_code_equal() # 状态码是否为预期值,默认200 assertion.code_equal(400) # 错误状态码是否为预期值,默认200 # 用例执行结束 logger.info("用例执行完成.") # 第二种:导入外部文件中的测试数据 @file_data('test_data.json') @unpack # 对测试数据进行拆分 # @unittest.skip('skip this case') def test02_user_reset_password_not_exist(self, values): """重置密码-用户不存在""" logger.info("开始执行用例.") # 获取信息 token = self.auth.get() # 获取授权token value = values[0] # 获取参数值 # Body请求参数 body_data = { "username": value['user'], # *用户名 "password": value['pwd'] # *会员密码 } # 调用请求 self.http.set_url(self.url) # 设置接口地址 self.http.set_json(body_data) # 设置接口请求json参数 self.http.add_token(token) # 添加授权token response = self.http.post() # 发起请求并获取响应数据 # 断言 assertion = CustomAssert(response) # 断言服务 assertion.response_normal() # 判断response是否正常返回 assertion.status_code_equal() # 状态码是否为预期值,默认200 assertion.desc_equal('用户不存在') # 断言错误描述信息是否等于预期 # 用例执行结束 logger.info("用例执行完成.") if __name__ == '__main__': unittest.main() ```