当前位置: 首页 > news >正文

pytest+requests+allure生成接口自动化测试报告

1. 目录结构

在这里插入图片描述

2. session.py

import logging
import requestslogging.basicConfig(level=logging.INFO, filename='requests.log', filemode="a", encoding='utf-8')
logger = logging.getLogger("mylogger")class MySession(requests.Session):"""支持BaseURL支持日志文件记录"""def __init__(self, base_url = ""):self.base_url = base_urlsuper().__init__()def request(self, method, url, **kwargs):if not url.startswith("http"):url = self.base_url + urlresponse = super().request(method, url, **kwargs)return responsedef send(self, request: requests.PreparedRequest, **kwargs):# print("发送请求:", request.method, request.url)logger.info(f"发送请求>>> 接口地址:{request.method}-{request.url}")logger.info(f"发送请求>>> 请求头:{request.headers}")logger.info(f"发送请求>>> 请求体:{request.body}")response = super().send(request, **kwargs)logger.info(f"接收响应<<< 响应状态码:{response.status_code}")logger.info(f"接收响应<<< 响应头:{response.headers}")logger.info(f"接收响应<<< 响应内容:{response.content}")return response

3. test_api.py

import pytest@pytest.mark.parametrize("data, code",[({}, 422),({"email": "1341935532@qq.com", "password": "123456"}, 422),({"username": "admin", "password": "123456"}, 200),({"username": "admin", "password": "wrongpassword"}, 401),]
)
def test_login(session, data, code):resp = session.post("/login/get_token", json=data)assert resp.status_code == codeif code == 200:print("=" * 100)print("token: ", resp.json()["token"])session.headers = {"Authorization": resp.json()["token"]}def test_create_task(session):resp = session.get("/todo", json={})assert resp.status_code == 200def test_get_task(session):# 获取任务resp = session.get(f"/todo/1")assert resp.status_code == 200def test_delete_task(session):# 删除任务resp = session.delete("/todo/1")assert resp.status_code == 204

4. app.py

from typing import Annotatedfrom fastapi import FastAPI, Request, Form, Body, Response
from fastapi.responses import JSONResponseapp = FastAPI()@app.post("/login/with_form")
async def login_form(username: Annotated[str, Form()],password: Annotated[str, Form()],
):return {"username": username, "password": password}@app.post("/login/with_json")
async def login_json(username: Annotated[str, Body()],password: Annotated[str, Body()]
):return {"username": username, "password": password}@app.post("/set_cookie")
async def set_cookie():response = {"message": "Cookie set"}response_obj = JSONResponse(response)response_obj.set_cookie("cookie", "123789")return response_obj@app.get("/get_cookie")
async def get_cookie(request: Request):cookie = request.cookies.get("cookie")if cookie:return {"cookie": cookie}else:return JSONResponse(status_code=401, content={"message": "Cookie not found"})@app.post("/login/get_token")
async def get_token(username: Annotated[str, Body()],password: Annotated[str, Body()]
):if username == "admin" and password == "123456":return {"token": "123789"}else:return JSONResponse(status_code=401, content={"message": "Invalid credentials"})@app.get("/todo")
async def get_todo(request: Request):token = request.headers.get("Authorization")if token != "123789":return JSONResponse(status_code=401, content={"message": "Invalid or missing token"})return {"todos": ["task1", "task2", "task3"]}@app.delete("/todo/{item_id}")
async def delete_todo(request: Request, item_id: int):token = request.headers.get("Authorization")if token != "123789":return JSONResponse(status_code=401, content={"message": "Invalid or missing token"})return Response(status_code=204)@app.get("/todo/{item_id}")
async def get_todo(request: Request, item_id: int):token = request.headers.get("Authorization")if token != "123789":return JSONResponse(status_code=401, content={"message": "Invalid or missing token"})if item_id != 1:return JSONResponse(status_code=404, content={"message": "Task not found"})return {"task": f"task{item_id}"}

5. conftest.py

import _pytest.hookspec
import pytestfrom commons.session import MySession# 共享性:在conftest.py中定义的fixture,在其所在目录及所有子目录中自动可用
@pytest.fixture(scope="session")
def session():yield MySession("http://127.0.0.1:8000")def pytest_configure():print("pytest_configure: 测试会话开始前执行")def pytest_unconfigure():print("pytest_unconfigure: 测试会话结束后执行")def pytest_yaml_run_step(item):print("正在执行第几个步骤", item)return True

6. main.py

import osimport pytest# 启动pytest测试框架
pytest.main()# 生成测试报告
os.system("allure generate -o report ./allure_results --clean")

7. my_yaml.py

from pprint import pprint
import yamlwith open("test.yaml", "r", encoding="utf-8") as f:data = yaml.safe_load(f)pprint(data)

8. pytest.ini

[pytest]
addopts = -vs --alluredir=./allure_results --clean-alluredirlog_file = pytest.log
log_file_level = debug
log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
log_file_date_format = %Y-%m-%d %H:%M:%S
result_log_level_verbose = info;run_yaml_case = truemarkers =login: 登录相关db: 数据库相关upload: 上传相关maya: maya相关
http://www.dtcms.com/a/457361.html

相关文章:

  • leetcode 2300 咒语和药水的成功对数
  • 湖南城乡建设部网站首页长沙网红店
  • 从 0 到 1 搭建实时数据看板:RabbitMQ+WebSocket 实战指南
  • Linux(含嵌入式设备如泰山派)VNC 完整配置指南:含开机自启动(适配 Ubuntu/Debian 系)
  • 网站营销活动泰安市高新区建设局网站
  • 玳瑁的嵌入式日记 --------API总结
  • [xboard] 26 kernel启动流程之initrd、initramfs、ramdisk核心异同
  • 鸿蒙实现滴滴出行项目之侧边抽屉栏以及权限以及搜索定位功能
  • 从OpenAI发布会看AI未来:中国就业市场的重构与突围
  • 乔拓云网站建设wps怎么做网站
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 立即执行模式(Eager Execution)
  • 监控系统2 - framebuffer
  • 大型网站响应式wordpress3.8.3
  • Django `models.Field` 所有常见配置参数的完整清单与说明表
  • 音乐播放器-单html文件
  • 18+网站推广平面设计师素材网站
  • 告别传统SEO!拥抱下一代流量密码:生成式引擎优化(GEO)实战指南
  • 不抽佣美团核销API接口,同时支持美团抖音核销,快速接入
  • 优化网站关键词的技巧建设银行忘记密码网站
  • 网站建设属于服务还是货物为什么asp.net做的网站上传后不显示照片
  • TT直流减速电机(STM32)
  • MQTT协议三个核心函数的详解
  • 马拉松网站建设方案汽车网站管理系统
  • 【企业架构】TOGAF架构标准规范-技术架构
  • 【Proteus仿真】甲单片机(AT89C51)控制乙单片机(AT89C51)
  • 南阳网站推广优化公司discuz和wordpress区别
  • XSLT `<value-of>` 标签详解
  • 做外贸网站注册什么邮箱懒人模板网站
  • 案例-使用Postman向百度首页发送带时间戳的GET请求
  • leetcode排序链表