当前位置:   article > 正文

python接口篇-python框架搭建_python接口自动化框架

python接口自动化框架

一、框架介绍

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

config:存放config.ini配置文件。
org_business:需要进行测试的接口极其参数。
org_data:这里将测试数据放在excel中,通过read_data方法读取。
org_logs:生成的日志文件。
org_report:存放生成的测试报告。
org_testcase:存放测试用例。
conftest.py:存放了一些通用方法(读Excel数据,比较json串等)。
pytest.ini:主配置文件,可以改变pytest的默认行为。
requirements.txt:项目依赖包。
run_org_api:主程序入口,执行测试用例

二、框架详解

1、allure下载及环境变量配置

(1)下载allure(前提:电脑需要安装jdk,linux安装Linux搭建测试环境)
1)下载allure-commandline并解压,下载地址:
(2)配置环境变量
  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. import requests
  2. from logging import config, getLogger
  3. from AotoInterfaceTest.conf import logsettings
  4. config.dictConfig(logsettings.LOGGING_DIC)
  5. log = getLogger('log_msg')
  6. class RequestsMethod(object):
  7. def post_requests(self, url, headers, data):
  8. # 忽略不安全的请求警告信息
  9. # requests.packages.urllib3.disable_warnings()
  10. # 遇到requests的ssl验证,若想直接跳过不验证,设置verify=False即可
  11. try:
  12. response = requests.post(url=url, headers=headers, data=data, verify=False)
  13. return response
  14. except Exception as ex:
  15. log.warning(ex)
  16. def get_requestsn(self, url, headers, data=None):
  17. # 忽略不安全的请求警告信息
  18. # requests.packages.urllib3.disable_warnings()
  19. try:
  20. response = requests.get(url=url, headers=headers, data=data, verify=False)
  21. return response
  22. except Exception as ex:
  23. log.warning(ex)
  24. def request(self, url, method, headers=None, data=None):
  25. # # 忽略不安全的请求警告信息
  26. # requests.packages.urllib3.disable_warnings()
  27. # requests.adapters.DEFAULT_RETRIES = 5
  28. if method == "POST":
  29. log.info('调用POST请求')
  30. response = self.post_requests(url, headers, data)
  31. elif method == "GET":
  32. log.info('调用GET请求')
  33. response = self.get_requestsn(url, headers, data)
  34. # 将响应的的数据以字典数据结构和json数据格式返回
  35. else:
  36. log.warning('请求方式不存在')
  37. return response
  1. Conf目录(配置模块)

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

编号

脚本名称

脚本描述

1

basicConf.ini

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

  1. """
  2. 配置
  3. """
  4. import os
  5. import time
  6. # 时间格式
  7. timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
  8. ## 获取项目当前运行路径
  9. BASE_PATH = os.path.dirname(
  10. os.path.dirname(__file__)
  11. )
  12. # 测试数据地址
  13. CASE_TABLE = 'test_Case.xls'
  14. # 需要执行的case py文件
  15. CASE_FILE = 'test_Demo.py'
  16. # 测试用例路径
  17. TEST_CASE_PATH = os.path.join(
  18. BASE_PATH, 'test_case')
  19. # 获取测试用例EXCEL表格 路径
  20. CASE_DATA_PATH = os.path.join(
  21. BASE_PATH, 'data', CASE_TABLE)
  22. # 运行日志存放路径
  23. CASE_RUN_PATH = os.path.join(
  24. BASE_PATH, 'log')
  25. # allure JONS文件路径
  26. RESULT_JSON_FILE_PATH = os.path.join(
  27. BASE_PATH,'report','result')
  28. # allure HTML报告路径
  29. RESULT_HTML_FILE_PATH = os.path.join(
  30. BASE_PATH,'report','HTML')
  31. # 发送邮件 报告所在地址
  32. SEND_REPORT_EMAIL_PATH = os.path.join(
  33. BASE_PATH,'report','HTML','index.html')
  34. RUN_TEST_CASE = ''
  35. # 生成测试报告命令
  36. GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -o {RESULT_HTML_FILE_PATH} --clean' #
  37. # GENERATE_ALLURE_REPORT = f'allure generate {RESULT_JSON_FILE_PATH} -c {RESULT_HTML_FILE_PATH} --clean' #清楚历史数据
  38. # 邮件配置
  39. smtp_server = 'smtp.qq.com'
  40. smtp_user = '@qq.com' # 发件邮箱
  41. smtp_password = '' # 授权码
  42. sender = smtp_user # 发件人
  43. receiver = '@126.com' # 收件人
  44. subject = '自动化接口测试报告' # 邮件主题
  1. from AotoInterfaceTest.conf import settings
  2. import os
  3. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  4. '[%(levelname)s][%(message)s]'
  5. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  6. test_format = '%(asctime)s] %(message)s'
  7. # 3、日志配置字典
  8. LOGGING_DIC = {
  9. 'version': 1,
  10. 'disable_existing_loggers': False,
  11. 'formatters': {
  12. 'standard': {
  13. 'format': standard_format
  14. },
  15. 'simple': {
  16. 'format': simple_format
  17. },
  18. 'test': {
  19. 'format': test_format
  20. },
  21. },
  22. 'filters': {},
  23. 'handlers': {
  24. #打印到终端的日志
  25. 'console': {
  26. 'level': 'DEBUG',
  27. 'class': 'logging.StreamHandler', # 打印到屏幕
  28. 'formatter': 'simple'
  29. },
  30. #打印到文件的日志,收集info及以上的日志
  31. 'default': {
  32. 'level': 'DEBUG',
  33. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
  34. 'formatter': 'standard',
  35. # 可以定制日志文件路径
  36. # BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
  37. # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
  38. 'filename': os.path.join(settings.CASE_RUN_PATH,'接口自动化测试.log'), # 日志文件
  39. 'maxBytes': 1024*1024*5, # 日志大小 5M
  40. 'backupCount': 5,
  41. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  42. },
  43. },
  44. 'loggers': {
  45. #logging.getLogger(__name__)拿到的logger配置
  46. 'log_msg': {
  47. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  48. 'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
  49. 'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
  50. },
  51. },
  52. }
  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. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # fileName: run_email.py
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6. from email.header import Header
  7. import smtplib
  8. # 定义发邮件
  9. def send_mail(file_path):
  10. f = open(file_path, 'rb')
  11. mail_body = f.read()
  12. f.close()
  13. smtpserver = 'smtp.qq.com'
  14. # 设置登录邮箱的账号和授权密码
  15. user = 'XXX@qq.com'
  16. password = ""
  17. sender = 'XXX@qq.com'
  18. # 可添加多个收件人的邮箱
  19. receives = ['XXX@qq.com']
  20. # 构造邮件对象
  21. msg = MIMEMultipart('mixed')
  22. # 定义邮件的标题
  23. subject = '接口自动化测试报告'
  24. # HTML邮件正文,定义成字典
  25. msg['Subject'] = Header(subject, "utf-8")
  26. msg['From'] = sender
  27. msg['To'] = ','.join(receives)
  28. # 构造文字内容
  29. text_plain = MIMEText("附件是最新的接口自动化测试报告,请查看", 'html', 'utf-8')
  30. msg.attach(text_plain)
  31. # 构造附件
  32. text_attr = MIMEText(mail_body, 'base64', 'utf-8')
  33. text_attr["Content-Type"] = 'application/octet-stream'
  34. text_attr['Content-Disposition'] = 'attachment; filename = "test.html"'
  35. msg.attach(text_attr)
  36. # 邮箱设置时勾选了SSL加密连接,进行防垃圾邮件,SSL协议端口号要使用465
  37. smtp = smtplib.SMTP_SSL(smtpserver, 465)
  38. # 向服务器标识用户身份
  39. smtp.helo(smtpserver)
  40. # 向服务器返回确认结果
  41. smtp.ehlo(smtpserver)
  42. # 登录邮箱的账号和授权密码
  43. smtp.login(user, password)
  44. print("开始发送邮件...")
  45. # 开始进行邮件的发送,msg表示已定义的字典
  46. smtp.sendmail(sender, receives, msg.as_string())
  47. smtp.quit()
  48. print("已发送邮件")
  49. if __name__ == "__main__":
  50. report = "../testcase/report/report.html"
  51. send_mail(report)
  1. TestSuite目录(测试套件)

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

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

pytest须要知识点:

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

搜索规则

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

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

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # fileName: test_Demo.py
  4. import pytest
  5. import json
  6. from AotoInterfaceTest.common.RequestsMethod import RequestsMethod
  7. from AotoInterfaceTest.common.DataProcee import Procee
  8. from AotoInterfaceTest.common.Asert import Asert
  9. from logging import config, getLogger
  10. from AotoInterfaceTest.conf import logsettings
  11. import allure
  12. config.dictConfig(logsettings.LOGGING_DIC)
  13. log = getLogger('log_msg')
  14. req = RequestsMethod()
  15. data = Procee()
  16. @allure.feature('测试')
  17. @pytest.mark.parametrize('datas',data.runCase_excel_Data())
  18. def test_fk_api(datas):
  19. log.info(f'开始测试用例编号:{datas["用例编号"]} *******************开始测试*****************')
  20. r = req.request(url=datas['请求URL'], method=datas['请求方式'], headers=json.loads(datas['headers']), data=datas['请求参数'])
  21. assert r.status_code == int(datas['预期结果'])
  22. log.info(f'用例编号:{datas["用例编号"]} *************测试测试完成*************************')
  23. if __name__ == '__main__':
  24. 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、查看报告

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/820966
推荐阅读
相关标签
  

闽ICP备14008679号