Pytest接口自动化测试框架搭建模板

auto_api_test

开发环境: Pycharm

开发语言&版本: python3.7.8

测试框架: Pytest、测试报告: Allure

项目源码Git地址

项目目录结构

  • api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用
  • config – 配置文件目录
  • data – 测试数据目录
  • doc – 文档存放目录
  • log – 日志
  • report – 测试报告
  • scripts – 测试脚本存放目录
  • tools – 工具类目录
  • .gitignore – git忽略
  • app.py – 命令行启动入口
  • pytest.ini – pytest测试框架配置文件
  • README.md – 开发说明文档

代码分析

pytest.ini

pytest框架的配置文件

1

2

3

4

5

6

7

[pytest]

addopts = --html=../report/report.html  # pytest-html报告插件配置

;addopts = -s --alluredir report  # allure-pytest报告插件配置

testpaths = ./scripts  # 设置用例目录识别名称

python_files = test*_*.py  # 设置测试文件识别名称

python_classes = Test*  # 设置测试类识别名称

python_functions = test_*  # 设置测试方法识别名称

app.py

1

2

3

4

5

6

7

8

# 基础路由(方便在部署环境发生变化时切换全局基础路由)

BASE_URL = "http://xxxx.com"

# 获取脚本的绝对路径(脚本在项目根目录就可以理解为项目路径)

ABS_PATH = os.path.abspath(__file__)

BASE_DIR = os.path.dirname(ABS_PATH)

# 命令行启动此脚本时执行测试用例

pytest.main(["scripts/"])

/config/config.json

配置文件, 目前包含全局请求头配置、类似全局变量的设置, 可通过tools内的工具函数进行读写
请求头具体参数根据需要自行配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

{

 "headers": {

  "Host": "xxx.com",

  "Connection": "keep-alive",

  "Accept": "application/json, text/plain, */*",

  "Authorization": "xxxx",

  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",

  "Content-Type": "application/json;charset=UTF-8",

  "Origin": "http://xxx.com",

  "Referer": "http://xxx.com/",

  "Accept-Encoding": "gzip, deflate",

  "Accept-Language": "zh-CN,zh;q=0.9"

 }

}

/api/template_api.py

页面类模板, 包含页面接口的请求方法(增删改查)封装, 主要在此定义好接口和请求入参等内容

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

# 导包

import app

import json

from tools.config_info import get_header

class TemplateAPI:

  # xx添加接口

  api_add_url = app.BASE_URL + "/xxx/xxxx/add"

  # xx修改接口

  api_upd_url = app.BASE_URL + "/xxx/xxxx/upd"

  # xx查询接口

  api_get_url = app.BASE_URL + "/xxx/xxxx/get"

  # xx删除接口

  api_del_url = app.BASE_URL + "/xxx/xxxx/del/{id}"

  # xx添加接口函数实现

  def api_add(self, session, attr1, attr2):

    post_data = {

      "attr1": attr1,

      "attr2": attr2

    }

    return session.post(self.api_add_url, headers=get_header(), data=json.dumps(post_data))

  # xx修改接口函数实现

  def api_upd(self, session, attr1, attr2):

    put_data = {

      "attr1": attr1,

      "attr2": attr2

    }

    return session.put(self.api_upd_url, headers=get_header(), data=json.dumps(put_data))

  # xx查询接口函数实现

  def api_get(self, session, attr1, attr2):

    params = {

      "attr1": attr1,

      "attr2": attr2

    }

    return session.get(self.api_get_url, headers=get_header(), params=params)

  # xx删除接口函数实现

  def api_del(self, session, uid):

    return session.delete(self.api_del_url.format(id=uid), headers=get_header())

/scripts/test_template.py

测试类以Test开头, 测试类和测试方法添加allure装饰器

前置测试类方法 - 初始化requests请求库的session对象, 创建对应的页面对象

后置测试类方法 - 关闭session对象

前置测试方法 - 加休眠

测试方法中添加可选参数化装饰器, 测试方法中通过页面对象调用页面接口请求方法, 传入requests的session对象和方法需要的必要参数, 进行响应结果的处理和断言等操作

日志器可通过引入工具调用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

# 导包

import pytest

import requests

from time import sleep

from api.template_api import TemplateAPI

from tools.get_log import GetLog

from tools.read_file import read_json

import allure

# 获取日志器

log = GetLog.get_log()

@allure.feature('测试类模板')

class TestTemplate:

  session = None

  # 初始化方法

  @classmethod

  def setup_class(cls):

    cls.session = requests.Session()  # 初始化session对象

    cls.template = TemplateAPI()

  # 结束方法

  @classmethod

  def teardown_class(cls):

    cls.session.close()

  @classmethod

  def setup(cls):

    sleep(1.5)

  # 测试方法

  @allure.story("测试方法模板-add")

  @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_add"))

  def test_add(self, attr1, attr2, success, expect):

    # 添加功能API调用

    response = self.template.api_add(self.session, attr1, attr2)

    # 打印日志

    log.info("添加功能-状态码为: {}".format(response.status_code))

    # 断言状态码

    assert response.status_code == expect, "状态码断言失败"

  @allure.story("测试方法模板-upd")

  @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_upd"))

  def test_upd(self, attr1, attr2, success, expect):

    # 添加功能API调用

    response = self.template.api_upd(self.session, attr1, attr2)

    # 打印日志

    log.info("修改功能-状态码为: {}".format(response.status_code))

    # 断言状态码

    assert response.status_code == expect, "状态码断言失败"

  @allure.story("测试方法模板-get")

  @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_get"))

  def test_get(self, attr1, attr2, success, expect):

    # 添加功能API调用

    response = self.template.api_get(self.session, attr1, attr2)

    # 打印日志

    log.info("查询功能-状态码为: {}".format(response.status_code))

    # 断言状态码

    assert response.status_code == expect, "状态码断言失败"

  @allure.story("测试方法模板-del")

  @pytest.mark.parametrize(("uid", "success", "expect"), read_json("test_del"))

  def test_del(self, uid, success, expect):

    # 添加功能API调用

    response = self.template.api_del(self.session, uid)

    # 打印日志

    log.info("删除功能-状态码为: {}".format(response.status_code))

    # 断言状态码

    assert response.status_code == expect, "状态码断言失败"

/data | /tools

测试数据和具体的操作工具类根据需要自定义

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习设计模式的网站

Refactoring and Design Patternshttps://refactoring.guru/

vue.js怎么保证计算精度

为什么js计算会丢失精度? JavaScript 中的精度丢失问题通常出现在处理浮点数时。 这是因为 JavaScript 使用双精度浮点数格式(64位),无法精确表示所有的小数。举例来说,尝试计算 0.1 0.2 会得到一个近似值 0.300000…

华为云RDS通用型(x86) vs 鲲鹏(ARM)架构的性能对比

概述 之前,我们对比了阿里云RDS的经济版(ARM)与x86版的性价比,这次我们来看看华为云的RDS MySQL的“通用型”(x86)与“鲲鹏通用增强型”(ARM)版本的情况如何。 这里依旧选择了用户较为常用的4c16g的规格进行测试,测试…

【Rust与AI】概览和方向

本系列主要介绍Rust与AI的那些天作之合(开源项目),我们会以开源项目代码阅读的方式推进,以Rust为主,同时科普AI相关知识,目的是让更多非算法、非Rust的程序员进一步学习Rust和AI相关知识。当然,…

【Python】 pip 常用命令及相关作用和使用场景

pip是Python的包管理工具,它允许开发者安装、升级和管理Python软件包。以下是一些常用的pip命令: 1. **列出已安装的包**: pip list 或者 pip freeze 2. **安装包**: pip install [package-name]…

git的基本命令操作超详细解析教程

Git基础教学 1、初始化配置2、初始化仓库3、工作区域和文件状态4、添加和提交文件5、git reset 回退版本6、git diff查看差异7、删除文件git rm8、.gitignore10、分支基础应用1、本地文件提交到远程仓库 Git:一个开源的分布式版本控制系统,它可以在本地和…

AIGC创作ChatGPT源码+AI绘画(Midjourney绘画)+支持GPT-4-Turbo模型+DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

嵌入式硬件和软件哪个好?

嵌入式硬件和软件哪个好? 嵌入式软硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程师的,首先我们先来看看嵌入式硬件工程师吧! 嵌入式硬件开发工程师主要编写嵌入式系统硬件总体方案和详细方案,要求理解嵌入式系统架构,有一…

智能优化算法应用:基于世界杯算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于世界杯算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于世界杯算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.世界杯算法4.实验参数设定5.算法结果6.参考文献7.…

java学习part36set

157-集合框架-Set不同实现类的对比及Set无序性、不可重复性的剖析_哔哩哔哩_bilibili 1.Set 加入集合的时候会先调用重写的hash方法计算hash值,不一样就加入。 如果hash一样且equals也是true就是重复 ,调equals是为了保险,保证排除hash碰撞…

MySQL数据误删除恢复

1.1 问题简述 开发反馈误删除了部分业务数据,需要恢复数据。 这里采用binlog2sql工具进行数据回滚。 1.2 环境 CentOS Linux release 7.4.1708 (Core) mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL) 1.3 数据库开启binlog 因为数据库serve…

Windows环境下RocketMQ的安装及配置

目录 1.环境准备2.下载RocketMQ3.配置RocketMQ环境变量4.启动RecoketMQ4.1启动 name server4.2 启动 broker 5、启动报错问题解决5.1 java_HOME变量找不到5.2 启动闪退问题 1.环境准备 JDK和Maven需要先安装好。 RocketMQ是用Java语言写的,所以需要JDK的支持。 后面…

Mac电脑vm虚拟机 VMware Fusion Pro中文 for mac

VMware Fusion Pro是一款功能强大的虚拟机软件,适用于需要在Mac电脑上运行其他操作系统的用户。它具有广泛的支持、快速稳定的特点以及多种高级功能,可以满足用户的各种需求和场景。 多操作系统支持:VMware Fusion Pro允许在Mac电脑上运行多…

Wireshark中的TCP协议包分析

Wireshark可以跟踪网络协议的通讯过程,本节通过TCP协议,在了解Wireshark使用的基础上,重温TCP协议的通讯过程。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传…

人工智能-机器翻译:技术发展与代码实战

在本文中,我们深入探讨了机器翻译的历史、核心技术、特别是神经机器翻译(NMT)的发展,分析了模型的优化、挑战及其在不同领域的应用案例。同时,我们还提出了对未来机器翻译技术发展的展望和潜在的社会影响。 关注TechLe…

Shopee买家通系统自动下单更方便

Shopee购物平台的买家通系统为用户提供了一种便捷的自动下单方式,通过这一系统,用户可以轻松实现在虾皮平台购买商品的自动化操作。下面将介绍具体的操作流程,确保用户可以顺利完成整个购物流程。 首先,用户需要准备一个可用的虾皮…

Leetcode—205.同构字符串【简单】

2023每日刷题&#xff08;五十&#xff09; Leetcode—205.同构字符串 算法思想 参考自k神思路 实现代码 class Solution { public:unordered_map<char, char> s2t, t2s;bool isIsomorphic(string s, string t) {int n s.size();for(int i 0; i < n; i) {char …

TCP/IP五层(或四层)模型,IP和TCP到底在哪层?

文章目录 前言一、应用层二.传输层三.网络层&#xff1a;四.数据链路层五.物理层&#xff1a;六.OSI七层模型&#xff1a;1.物理层&#xff08;Physical Layer&#xff09;&#xff1a;2.数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;3.网络层&#xff08;Ne…

Django宠物之家平台

摘 要 随着互联网的快速发展&#xff0c;利用网络的管理系统也逐渐发展起来。在线管理模式快速融入了众多用户的眼球&#xff0c;从而产生了各种各样的平台管理系统。 关于本django宠物的家庭平台管理系统的设计来说&#xff0c;系统开发主要采纳Python技术、B/S框架&#xff…

四川云汇优想:抖音直播等级怎么升级?

抖音直播&#xff0c;作为当前最热门的社交平台之一&#xff0c;其等级体系一直备受用户关注。如何在抖音直播中迅速提升等级&#xff0c;成为众多用户探讨的话题。在这篇文章中&#xff0c;我们将深入探讨抖音直播等级的升级机制、好处以及一些实用的技巧&#xff0c;助你在抖…