• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python接口篇-python+request+pytest框架搭建

武飞扬头像
清微清微
帮助1

一、目录介绍

python接口自动化采用的框架是:python request pytest excel/yaml allure

学新通
学新通
  1. Common目录(公共方法)

主要是针对使用频率较高的方法进行第一次封装。例如:请求方法、基本配置读取、DEBUG日志获取、发送邮件、业务流封装、数据库操作等都可以放在此模块。

编号

脚本名称

脚本描述

1

__init__.py

 

2

db_opera.py

数据库的基础操作包含

1、数据库连接方法

2、sql语句执行方法

3

logger.py

日志模块:定义日志的输出目录、格式、内容

4

read_basic_conf.py

读取配置文件basicConf.ini并转换列表展示

5

reload_yaml.py

yaml文件解析

1、yaml文件读取

2、yaml文件中变量数据替换

6

send_email.py

打包测试结果发送邮件【暂时用不到】

  1.  
     
  2.  
    import requests
  3.  
    from logging import config, getLogger
  4.  
    from AotoInterfaceTest.conf import logsettings
  5.  
     
  6.  
    config.dictConfig(logsettings.LOGGING_DIC)
  7.  
    log = getLogger('log_msg')
  8.  
     
  9.  
     
  10.  
    class RequestsMethod(object):
  11.  
     
  12.  
    def post_requests(self, url, headers, data):
  13.  
    # 忽略不安全的请求警告信息
  14.  
    # requests.packages.urllib3.disable_warnings()
  15.  
    # 遇到requests的ssl验证,若想直接跳过不验证,设置verify=False即可
  16.  
    try:
  17.  
    response = requests.post(url=url, headers=headers, data=data, verify=False)
  18.  
    return response
  19.  
    except Exception as ex:
  20.  
    log.warning(ex)
  21.  
     
  22.  
     
  23.  
    def get_requestsn(self, url, headers, data=None):
  24.  
    # 忽略不安全的请求警告信息
  25.  
    # requests.packages.urllib3.disable_warnings()
  26.  
    try:
  27.  
    response = requests.get(url=url, headers=headers, data=data, verify=False)
  28.  
    return response
  29.  
    except Exception as ex:
  30.  
    log.warning(ex)
  31.  
    def request(self, url, method, headers=None, data=None):
  32.  
    # # 忽略不安全的请求警告信息
  33.  
    # requests.packages.urllib3.disable_warnings()
  34.  
    # requests.adapters.DEFAULT_RETRIES = 5
  35.  
     
  36.  
    if method == "POST":
  37.  
    log.info('调用POST请求')
  38.  
    response = self.post_requests(url, headers, data)
  39.  
    elif method == "GET":
  40.  
    log.info('调用GET请求')
  41.  
    response = self.get_requestsn(url, headers, data)
  42.  
    # 将响应的的数据以字典数据结构和json数据格式返回
  43.  
    else:
  44.  
    log.warning('请求方式不存在')
  45.  
     
  46.  
    return response
学新通
  1. Conf目录(配置模块)

该模块主要放日志配置、邮件配置、相关路径配置、数据库配置、优先级配置等需要用的参数。

编号

脚本名称

脚本描述

1

basicConf.ini

存放连接配置等信息:数据库、radis等

  1.  
     
  2.  
    """
  3.  
    配置
  4.  
    """
  5.  
    import os
  6.  
    import time
  7.  
     
  8.  
    # 时间格式
  9.  
    timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
  10.  
     
  11.  
    ## 获取项目当前运行路径
  12.  
    BASE_PATH = os.path.dirname(
  13.  
    os.path.dirname(__file__)
  14.  
    )
  15.  
    # 测试数据地址
  16.  
    CASE_TABLE = 'test_Case.xls'
  17.  
     
  18.  
    # 需要执行的case py文件
  19.  
    CASE_FILE = 'test_Demo.py'
  20.  
     
  21.  
    # 测试用例路径
  22.  
    TEST_CASE_PATH = os.path.join(
  23.  
    BASE_PATH, 'test_case')
  24.  
     
  25.  
    # 获取测试用例EXCEL表格 路径
  26.  
    CASE_DATA_PATH = os.path.join(
  27.  
    BASE_PATH, 'data', CASE_TABLE)
  28.  
     
  29.  
    # 运行日志存放路径
  30.  
    CASE_RUN_PATH = os.path.join(
  31.  
    BASE_PATH, 'log')
  32.  
     
  33.  
     
  34.  
    # allure JONS文件路径
  35.  
    RESULT_JSON_FILE_PATH = os.path.join(
  36.  
    BASE_PATH,'report','result')
  37.  
     
  38.  
    # allure HTML报告路径
  39.  
    RESULT_HTML_FILE_PATH = os.path.join(
  40.  
    BASE_PATH,'report','HTML')
  41.  
     
  42.  
    # 发送邮件 报告所在地址
  43.  
    SEND_REPORT_EMAIL_PATH = os.path.join(
  44.  
    BASE_PATH,'report','HTML','index.html')
  45.  
     
  46.  
    RUN_TEST_CASE = ''
  47.  
     
  48.  
    # 生成测试报告命令
  49.  
    GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -o {RESULT_HTML_FILE_PATH} --clean' #
  50.  
    # GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -c {RESULT_HTML_FILE_PATH} --clean' #清楚历史数据
  51.  
    # 邮件配置
  52.  
    smtp_server = 'smtp.qq.com'
  53.  
    smtp_user = '@qq.com' # 发件邮箱
  54.  
    smtp_password = '' # 授权码
  55.  
     
  56.  
    sender = smtp_user # 发件人
  57.  
    receiver = '@126.com' # 收件人
  58.  
    subject = '自动化接口测试报告' # 邮件主题
学新通
  1.  
     
  2.  
    from AotoInterfaceTest.conf import settings
  3.  
    import os
  4.  
     
  5.  
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  6.  
    '[%(levelname)s][%(message)s]'
  7.  
     
  8.  
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  9.  
     
  10.  
    test_format = '%(asctime)s] %(message)s'
  11.  
     
  12.  
    # 3、日志配置字典
  13.  
    LOGGING_DIC = {
  14.  
    'version': 1,
  15.  
    'disable_existing_loggers': False,
  16.  
    'formatters': {
  17.  
    'standard': {
  18.  
    'format': standard_format
  19.  
    },
  20.  
    'simple': {
  21.  
    'format': simple_format
  22.  
    },
  23.  
    'test': {
  24.  
    'format': test_format
  25.  
    },
  26.  
    },
  27.  
    'filters': {},
  28.  
    'handlers': {
  29.  
    #打印到终端的日志
  30.  
    'console': {
  31.  
    'level': 'DEBUG',
  32.  
    'class': 'logging.StreamHandler', # 打印到屏幕
  33.  
    'formatter': 'simple'
  34.  
    },
  35.  
     
  36.  
    #打印到文件的日志,收集info及以上的日志
  37.  
    'default': {
  38.  
    'level': 'DEBUG',
  39.  
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
  40.  
    'formatter': 'standard',
  41.  
    # 可以定制日志文件路径
  42.  
    # BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
  43.  
    # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
  44.  
    'filename': os.path.join(settings.CASE_RUN_PATH,'接口自动化测试.log'), # 日志文件
  45.  
    'maxBytes': 1024*1024*5, # 日志大小 5M
  46.  
    'backupCount': 5,
  47.  
    'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  48.  
    },
  49.  
    },
  50.  
    'loggers': {
  51.  
    #logging.getLogger(__name__)拿到的logger配置
  52.  
    'log_msg': {
  53.  
    'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  54.  
    'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
  55.  
    'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
  56.  
    },
  57.  
    },
  58.  
    }
学新通
  1. Data目录 (测试用例)

该模块可以根据自己的需求、或者业务场景设计用例、常用excel、Yaml等2中方式编写测试用例,若因用例过多,后期可能会考虑创建子目录来定义用例范围。

本架构中使用yaml文件作为数据传入

目录分层与用例脚本一个一个地对应

yaml文件分为公共数据文件和用例数据文件

学新通
  1. Log目录 (日志)

日志模块就是用来存放项目运行的日志,或某个用例运行出错,异常做一下记录,方便查阅,定位问题。

日志级别分为:"info"、 "debug"、"warning"、"error"4种,由conf中的配置文件来控制。

  1. Report目录(测试报告)

  1. 安装pytest-html插件。也可以使用allure插件生成测试报告,但是如果pytest版本过高,就无法识别allure插件。

  1. 添加“--self-contained-html”可以整合样式文件到html文档中,方便之后发送测试报告到邮箱。

学新通
  1.  
     
  2.  
    #!/usr/bin/env python
  3.  
    # -*- coding:utf-8 -*-
  4.  
    # fileName: run_email.py
  5.  
    from email.mime.text import MIMEText
  6.  
    from email.mime.multipart import MIMEMultipart
  7.  
    from email.header import Header
  8.  
    import smtplib
  9.  
     
  10.  
     
  11.  
    # 定义发邮件
  12.  
    def send_mail(file_path):
  13.  
     
  14.  
    f = open(file_path, 'rb')
  15.  
    mail_body = f.read()
  16.  
    f.close()
  17.  
     
  18.  
    smtpserver = 'smtp.qq.com'
  19.  
    # 设置登录邮箱的账号和授权密码
  20.  
    user = 'XXX@qq.com'
  21.  
    password = ""
  22.  
    sender = 'XXX@qq.com'
  23.  
    # 可添加多个收件人的邮箱
  24.  
    receives = ['XXX@qq.com']
  25.  
    # 构造邮件对象
  26.  
    msg = MIMEMultipart('mixed')
  27.  
    # 定义邮件的标题
  28.  
    subject = '接口自动化测试报告'
  29.  
    # HTML邮件正文,定义成字典
  30.  
    msg['Subject'] = Header(subject, "utf-8")
  31.  
    msg['From'] = sender
  32.  
    msg['To'] = ','.join(receives)
  33.  
    # 构造文字内容
  34.  
    text_plain = MIMEText("附件是最新的接口自动化测试报告,请查看", 'html', 'utf-8')
  35.  
    msg.attach(text_plain)
  36.  
    # 构造附件
  37.  
    text_attr = MIMEText(mail_body, 'base64', 'utf-8')
  38.  
    text_attr["Content-Type"] = 'application/octet-stream'
  39.  
    text_attr['Content-Disposition'] = 'attachment; filename = "test.html"'
  40.  
    msg.attach(text_attr)
  41.  
     
  42.  
    # 邮箱设置时勾选了SSL加密连接,进行防垃圾邮件,SSL协议端口号要使用465
  43.  
    smtp = smtplib.SMTP_SSL(smtpserver, 465)
  44.  
    # 向服务器标识用户身份
  45.  
    smtp.helo(smtpserver)
  46.  
    # 向服务器返回确认结果
  47.  
    smtp.ehlo(smtpserver)
  48.  
    # 登录邮箱的账号和授权密码
  49.  
    smtp.login(user, password)
  50.  
     
  51.  
    print("开始发送邮件...")
  52.  
    # 开始进行邮件的发送,msg表示已定义的字典
  53.  
    smtp.sendmail(sender, receives, msg.as_string())
  54.  
    smtp.quit()
  55.  
    print("已发送邮件")
  56.  
     
  57.  
     
  58.  
    if __name__ == "__main__":
  59.  
    report = "../testcase/report/report.html"
  60.  
    send_mail(report)
学新通
  1. TestSuite目录(测试套件)

使用pytest作为测试套件进行测试,如果pytest命令行有指定目录,则从该目录中开始查找测试用例文件,如果没有指定,则从当前运行目录开始查找文件。注意,该查找是递归查找,子目录中的文件也会被查找到。

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

pytest须要知识点:

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

搜索规则

如果pytest命令行有指定目录,则从该目录中开始查找测试用例文件,如果没有指定,则从当前运行目录开始查找文件。注意,该查找是递归查找,子目录中的文件也会被查找到。

并不是能够查找到目录下的所有文件,只有符合命名规则的文件才会被查找。默认规则是以test_开头或者以_test结尾的.py文件。

在测试文件中查找Test开头的类,以及类中以test_开头的方法,查找测试

  1.  
     
  2.  
    #!/usr/bin/env python
  3.  
    # -*- coding:utf-8 -*-
  4.  
    # fileName: test_Demo.py
  5.  
    import pytest
  6.  
    import json
  7.  
    from AotoInterfaceTest.common.RequestsMethod import RequestsMethod
  8.  
    from AotoInterfaceTest.common.DataProcee import Procee
  9.  
    from AotoInterfaceTest.common.Asert import Asert
  10.  
    from logging import config, getLogger
  11.  
    from AotoInterfaceTest.conf import logsettings
  12.  
    import allure
  13.  
    config.dictConfig(logsettings.LOGGING_DIC)
  14.  
     
  15.  
    log = getLogger('log_msg')
  16.  
    req = RequestsMethod()
  17.  
    data = Procee()
  18.  
     
  19.  
     
  20.  
    @allure.feature('测试')
  21.  
    @pytest.mark.parametrize('datas',data.runCase_excel_Data())
  22.  
    def test_fk_api(datas):
  23.  
     
  24.  
    log.info(f'开始测试用例编号:{datas["用例编号"]} *******************开始测试*****************')
  25.  
    r = req.request(url=datas['请求URL'], method=datas['请求方式'], headers=json.loads(datas['headers']), data=datas['请求参数'])
  26.  
    assert r.status_code == int(datas['预期结果'])
  27.  
    log.info(f'用例编号:{datas["用例编号"]} *************测试测试完成*************************')
  28.  
     
  29.  
    if __name__ == '__main__':
  30.  
     
  31.  
    pytest.main(['-v', '-s', "test_Demo.py"])
学新通
  1. Assert_set目录(断言封装)

存储相关用例的断言封装,特殊接口无法采用公共断言方法时,可在此处单独设置封装,后期可能再创建子目录进行分类。

  1. Utils目录(工具类)

工具类封装,common中主要封装跟业务逻辑相关的方法,此目录可存放与业务无关的工具类,如随机生成字符串,excel解析等。

编号

脚本名称

脚本描述

1

__init__.py

 

2

json_analysis.py

对字典或者列表进行解析

从解析的数据中获取想要的value

3

random_str.py

随机生成指令类型的字符串

4

xls_to_dict.py

读取xls文件转为字典

  1. API目录

最底层api的封装,以接口请求参数的service_uri为基准,相同service_uri的接口封装在同一个文件中。

编号

脚本名称

脚本描述

1

request_method.py

请求方法封装

2

assert_response.py

公共断言

1、code断言

2、响应结果全部匹配

3、部分响应结构断言

3

get_token.py

获取身份令牌

  1. Conftest.py文件

用于封装多个不同目录下的用例执行时需要用到的前置和后置,即fixture函数,以及pytest的钩子函数。

编号

脚本名称

脚本描述

1

根目录层conftest.py

1、钩子函数pytest_addoption

2、cache:清理日志并获取公共的token、id等信息

2

用例层conftest.py

做当前用例目录的公共数据

  1. Pytest.ini文件

用于mark标记注册,当测试用例增多时,增加mark标记可以给用例设置执行的优先级,按mark标记执行。

  1. Main.py文件

程序执行入口,主要用于本地调试。

代码形式如下:

二、框架的使用流程

  1. 用例层编写

  1. 目录根据模块进行设置

  1. 目录下设置当前目录的conftest.py准备公共数据

  1. 用例脚本调用日志方法、yaml文件读取、请求方法和断言调用

  1. 数据层准备

  1. 公共数据yaml文件

  1. 用例数据yaml文件

  1. 执行脚本

main.py

4、查看报告

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggakci
系列文章
更多 icon
同类精品
更多 icon
继续加载