python+request+pytest+auller 搭建接口自动化测试框架

**

接口自动化测试框架

一、项目目录

)在这里插入图片描述
项目整体框架分为6个模块公共方法(common)配置模块(conf)测试用例(data)日志(log)测试报告(report)测试套件(test_case) 启动项目运行主函数(main)即可
主函数代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# fileName: main.py

"""
作者:白帝城的农村人
时间:2021年3月
版本:v1.0
内容:接口自动化测试主函数
更新:
"""
from AotoInterfaceTest.conf import settings,logsettings
from AotoInterfaceTest.common import SendEmail
from logging import config, getLogger
config.dictConfig(logsettings.LOGGING_DIC)
log = getLogger('log_msg')
import os
import pytest

if __name__ == '__main__':

    # pytest.main(['-vs' ,f'--alluredir={settings.RESULT_JSON_FILE_PATH}',f'{settings.TEST_CASE_PATH}/'])
    os.system(f'pytest -v -s --alluredir={settings.RESULT_JSON_FILE_PATH} {settings.TEST_CASE_PATH}')
    REPORT=os.popen(settings.GENERATE_ALLURE_REPORT,"r").read()# 读取CMD内容
    log.info(f'生成allure报告:{REPORT}')
    SendEmail.send_email(settings.SEND_REPORT_EMAIL_PATH)

二、 common模块

主要是针对使用频率较高的方法进行封装列如;请求方法、定制断言方法、用例读取、或者发送邮件等等都可以放在该模块

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# fileName: RequestsMethod.py

import requests
from logging import config, getLogger
from AotoInterfaceTest.conf import logsettings

config.dictConfig(logsettings.LOGGING_DIC)
log = getLogger('log_msg')


class RequestsMethod(object):

    def post_requests(self, url, headers, data):
        # 忽略不安全的请求警告信息
        # requests.packages.urllib3.disable_warnings()
        # 遇到requests的ssl验证,若想直接跳过不验证,设置verify=False即可
        try:
             response = requests.post(url=url, headers=headers, data=data, verify=False)
             return response
        except Exception as ex:
            log.warning(ex)


    def get_requestsn(self, url, headers, data=None):
        # 忽略不安全的请求警告信息
        # requests.packages.urllib3.disable_warnings()
        try:
            response = requests.get(url=url, headers=headers, data=data, verify=False)
            return response
        except Exception as ex:
            log.warning(ex)
    def request(self, url, method, headers=None, data=None):
        # # 忽略不安全的请求警告信息
        # requests.packages.urllib3.disable_warnings()
        # requests.adapters.DEFAULT_RETRIES = 5

        if method == "POST":
            log.info('调用POST请求')
            response = self.post_requests(url, headers, data)
        elif method == "GET":
            log.info('调用GET请求')
            response = self.get_requestsn(url, headers, data)
        # 将响应的的数据以字典数据结构和json数据格式返回
        else:
            log.warning('请求方式不存在')

        return response


三、conf配置模块

该模块主要放日志配置、及相关路径配置、或者部分公告需要用的参数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# fileName: settings.py

"""
配置
"""
import os
import time

# 时间格式
timestamp = time.strftime('%Y-%m-%d %H:%M:%S')

## 获取项目当前运行路径
BASE_PATH = os.path.dirname(
    os.path.dirname(__file__)
)
# 测试数据地址
CASE_TABLE = 'test_Case.xls'

# 需要执行的case py文件
CASE_FILE = 'test_Demo.py'

# 测试用例路径
TEST_CASE_PATH = os.path.join(
    BASE_PATH, 'test_case')

# 获取测试用例EXCEL表格 路径
CASE_DATA_PATH = os.path.join(
       BASE_PATH, 'data', CASE_TABLE)

# 运行日志存放路径
CASE_RUN_PATH = os.path.join(
    BASE_PATH, 'log')


# allure  JONS文件路径
RESULT_JSON_FILE_PATH = os.path.join(
    BASE_PATH,'report','result')

# allure HTML报告路径
RESULT_HTML_FILE_PATH = os.path.join(
    BASE_PATH,'report','HTML')

# 发送邮件 报告所在地址
SEND_REPORT_EMAIL_PATH = os.path.join(
    BASE_PATH,'report','HTML','index.html')

RUN_TEST_CASE = ''

# 生成测试报告命令
GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -o  {RESULT_HTML_FILE_PATH} --clean' #
# GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -c  {RESULT_HTML_FILE_PATH} --clean' #清楚历史数据
# 邮件配置
smtp_server = 'smtp.qq.com'
smtp_user = '@qq.com' # 发件邮箱
smtp_password = ''  # 授权码

sender = smtp_user  # 发件人
receiver = '@126.com'  # 收件人
subject = '自动化接口测试报告'  # 邮件主题

日志配置

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from AotoInterfaceTest.conf import settings
import os

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

test_format = '%(asctime)s] %(message)s'

# 3、日志配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
        'test': {
            'format': test_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },

        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
            'formatter': 'standard',
            # 可以定制日志文件路径
            # BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
            # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
            'filename': os.path.join(settings.CASE_RUN_PATH,'接口自动化测试.log'),  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        'log_msg': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
            'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
        },
    },
}

四、data测试用例模块

该模块可以根据自己的需求、或者业务场景设计用例、常用Excel、Yaml等两种方式编写测用例
在这里插入图片描述
预期结果这里只使用了状态码,实际仅状态码是不够严谨的,常用为查询数据库相关表数据

五、log模块

日志模块就是来存放项目运行的日志,或者某个 测试用例出错或者函数报异常进行记录

六、test_case 测试套件

该模块主要使用pytest做为测试套件进行测试

pytest须要知识点

pytest以特定规则搜索测试用例,所以测试用例文件、测试类以及类中的方法、测试函数这些命名都必须符合规则,才能被pytest搜索到并加入测试运行队列中。

搜索规则

如果pytest命令行有指定目录,则从该目录中开始查找测试用例文件,如果没有指定,则从当前运行目录开始查找文件。注意,该查找是递归查找,子目录中的文件也会被查找到。
并不是能够查找到目录下的所有文件,只有符合命名规则的文件才会被查找。默认规则是以test_开头或者以_test结尾的.py文件。
在测试文件中查找Test开头的类,以及类中以test_开头的方法,查找测试文件中test_开头的函数。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# fileName: test_Demo.py
import pytest
import json
from AotoInterfaceTest.common.RequestsMethod import RequestsMethod
from AotoInterfaceTest.common.DataProcee import Procee
from AotoInterfaceTest.common.Asert import Asert
from logging import config, getLogger
from AotoInterfaceTest.conf import logsettings
import allure
config.dictConfig(logsettings.LOGGING_DIC)

log = getLogger('log_msg')
req = RequestsMethod()
data = Procee()


@allure.feature('测试')
@pytest.mark.parametrize('datas',data.runCase_excel_Data())
def test_fk_api(datas):

     log.info(f'开始测试用例编号:{datas["用例编号"]}  *******************开始测试*****************')
     r = req.request(url=datas['请求URL'], method=datas['请求方式'], headers=json.loads(datas['headers']), data=datas['请求参数'])
     assert r.status_code == int(datas['预期结果'])
     log.info(f'用例编号:{datas["用例编号"]}  *************测试测试完成*************************')

if __name__ == '__main__':

    pytest.main(['-v', '-s', "test_Demo.py"])

pytest相关用法可以去pytest官方文档进行学习

七、report测试报告模块

该模块需要使用allure插件 pip instal allure-pytest 装好该插件前提还需要安装JDK 、和下载allure Java包 将allure下的bin文件配置到环境变量里面
在这里插入图片描述
然后在使用CMD里面输入allure查看是否成功

生成的报告还是非常nice allure也可以对页面进行定制化处理,详细就自己去学吧
在这里插入图片描述
allure生成流程

参数说明
RESULT_JSON_FILE_PATH 生成JSON文件的所在位置
TEST_CASE_PATH:测试套件所在位置
RESULT_HTML_FILE_PATH:生成的allure测试报告位置

1.先要使用pytest执行测试用例生成json文件
cmd命令 pytest -v -s --alluredir={RESULT_JSON_FILE_PATH}{TEST_CASE_PATH}
2、使用json文件生成allure测试报告这样就完成了
cmd命令 allure generate {RESULT_JSON_FILE_PATH} -o {RESULT_HTML_FILE_PATH} --clean

分享结束

<think>好的,我现在需要帮助用户学习如何结合使用Pythonrequests库和pytest进行测试。首先,我应该回顾用户提供的引用内容,看看有没有相关的信息。引用[2]提到了pytest的使用方法,包括如何执行用例和配置pytest.ini,这可能对测试结构有帮助。引用[3]提到了pytest-httpbin,这可能用于模拟HTTP请求的测试。引用[4]讨论了pytest的用例识别规则,这对于组织测试文件很重要。 用户的需求是学习requests和pytest的结合使用,所以需要分步骤指导。首先,安装必要的库,如requests和pytest,可能还需要pytest-httpbin来模拟服务端响应。然后,创建测试文件,按照pytest的命名规则,比如test_*.py。接下来,编写测试用例,使用requests发送请求,并利用pytest的断言机制来验证响应。可能还需要使用fixture来共享资源,比如模拟的HTTP端点。 需要考虑如何结构清晰地组织回答,可能分为环境搭建、测试编写、运行测试、高级技巧等部分。同时,根据用户提供的引用,特别是引用[2]中的配置方法,可以建议用户配置pytest.ini来优化测试执行。此外,引用[3]中的pytest-httpbin可以用来创建临时HTTP服务,测试请求的不同情况,比如状态码、响应内容等。 还需要确保示例代码正确,比如使用requests.get()并检查status_code和响应内容。同时,结合pytest的参数化功能,展示如何测试多种情况。可能还需要提到如何模拟异常情况,如网络错误,使用pytest的raises处理异常。 最后,生成的相关问题需要围绕用户可能进一步想了解的内容,比如测试覆盖率、Mock的使用、CI集成等,确保问题具有引导性,帮助用户深入学习。</think># Python requests与pytest测试开发指南 ## 一、环境准备 1. 安装核心库: ```bash pip install requests pytest pytest-httpbin ``` 2. 验证安装: ```python import requests import pytest print(requests.__version__, pytest.__version__) # 应输出对应版本号 ``` ## 二、基础测试编写 创建`test_api.py`文件: ```python import requests def test_httpbin_get(): response = requests.get("https://httpbin.org/get") assert response.status_code == 200 assert response.json()["url"] == "https://httpbin.org/get" ``` ## 三、使用pytest特性优化测试 ### 3.1 参数化测试(参数组合验证) ```python import pytest @pytest.mark.parametrize("status", [200, 404, 500]) def test_status_codes(status): response = requests.get(f"https://httpbin.org/status/{status}") assert response.status_code == status ``` ### 3.2 Fixture装置(共享测试资源) ```python @pytest.fixture def api_client(): return requests.Session() def test_with_fixture(api_client): response = api_client.get("https://httpbin.org/headers") assert "headers" in response.json() ``` ## 四、本地测试环境搭建 使用`pytest-httpbin`创建本地服务: ```python def test_local_httpbin(httpbin): response = requests.get(httpbin.url + "/get") assert response.status_code == 200 assert httpbin.url in response.json()["url"] ``` ## 五、测试执行与配置 1. 基础执行命令: ```bash pytest -v test_api.py ``` 2. 创建`pytest.ini`配置文件: ```ini [pytest] addopts = -v testpaths = tests/ python_files = test_*.py ``` ## 六、高级测试场景 ### 6.1 异常处理测试 ```python def test_timeout_handling(): with pytest.raises(requests.exceptions.Timeout): requests.get("https://httpbin.org/delay/5", timeout=2) ``` ### 6.2 响应内容验证 ```python def test_response_structure(): response = requests.post("https://httpbin.org/post", data={"key": "value"}) json_data = response.json() assert json_data["form"] == {"key": "value"} assert "Content-Type" in json_data["headers"] ``` ## 七、最佳实践建议 1. 将敏感信息存储在环境变量中 2. 为不同测试环境创建配置文件 3. 使用`pytest-mock`进行请求模拟 4. 设置合理的超时时间(建议2-5秒)
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值