基于Python+requests编写的自动化测试项目-实现流程化的接口串联

框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu)时间。

鄙人一介小测试,一手承接产品,一手面对开发(4个后端,3个web前端,外加不知道几个的乙方),项目经手了5批人,鄙人是第5批的测试,规范没有,前人积累没有,天崩开局/(ㄒoㄒ)/~~。

老规矩,上图:

这个不直观,下面我来展示这个抽象的图片(美术功底差,见谅):

怎么,是不是有一种UI自动化里面的POM思想?没错,这正是这个思路在API自动化里里面的一个体现。

毕竟服务间的调用是复杂的,将各个接口封装起来,对应的py文件里面创一个main方法,用于单个接口入参以及返回值之间的验证,至于接口之间的串联,那就放到下面(regression_test里面,每一个case相当于一个过程,如:上传习题、选题、组卷分发、上传试卷、批阅等流程),辅以逻辑处理,大部分的流程还是可以自动化实现的(ps:对于前后端联调加改bug用了两个月时间才圆满搞定的过程,我没敢尝试将这个给自动化实现了,还是留待后人吧)。

getpathInfo.py:获取autoapi文件夹所在的目录,便于项目换家,有没有其实无所谓的;

import os


def get_path():
    path = os.path.split(os.path.realpath(__file__))[0]
    return path


if __name__ == '__main__':
    print('测试路径是否OK,路径为:', get_path())

readConfig.py

import os
import configparser
import getpathInfo

path = getpathInfo.get_path()  
config_path = os.path.join(path, 'config')  
config = configparser.ConfigParser()  # 调用外部的读取配置文件的方法
config.read(config_path, encoding='utf-8')


class ReadConfig():

    def get_http(self, name):
        value = config.get('HTTP', name)
        return value

    def get_email(self, name):
        value = config.get('EMAIL', name)
        return value

    def get_account(self, name):
        value = config.get('ACCOUNT', name)
        return value


environment = ReadConfig().get_http('environment')  # 切换环境
mobile_phone = ReadConfig().get_account('mobile_phone')
password = ReadConfig().get_account('password')
parent_username = ReadConfig().get_account('parent_phone')
parent_pwd = ReadConfig().get_account('parent_pwd')

common:公共方法文件夹,最省事配置:日志封装(中文日志在这里要留意,有坑),请求封装(如果有token之类的限制的话)

logs.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

44

45

46

47

48

import logging

import time

from getpathInfo import get_path

class Log(object):

    def __init__(self, logger=None):

        """

        指定保存日志的文件路径,日志级别,以及调用文件

        将日志存入到指定的文件中

        """

        # 创建一个logger

        self.logger = logging.getLogger(logger)

        self.logger.setLevel(logging.DEBUG)

        # 创建一个handler,用于写入日志文件

        self.log_time = time.strftime('%Y-%m_%d_')

        self.log_path = get_path()+'\\log\\'

        self.log_name = self.log_path + self.log_time + 'test.log'

        fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')  # 追加模式,防止中文乱码

        fh.setLevel(logging.INFO)

        # 再创建一个handler,用于输出到控制台

        ch = logging.StreamHandler()

        ch.setLevel(logging.INFO)

        # 定义一个handler的输出样式

        formatter = logging.Formatter(

            '[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s')

        fh.setFormatter(formatter)

        ch.setFormatter(formatter)

        # 给logger添加handler

        self.logger.addHandler(fh)

        self.logger.addHandler(ch)

        #  添加下面一句,在记录日志之后移除句柄

        fh.close()

        ch.close()

    def getLog(self):

        return self.logger

log = Log().getLog()

if __name__ == '__main__':

    log.info('日志')  # 抄过来的代码一定要进行测试

configHttp.py

这里是默认加上token的,但是并不是所有接口都是需要token,解决思路:再加个configHttpNormal.py。

对于同一个系统中需要多个用户参与的过程,这时候就需要配置文件里面再多一位用户的账号密码了,再加一个login()方法并赋值,下面的对应的基础请求封装里面要再多一个参数:is_other_one,默认为false,一但给true,下面headers就要换参数中的值;

import json
import requests

from common.logs import log
from readConfig import environment,mobile_phone,password
from case.api.User import login
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)  # 如果有抓包需求,需要把verify设置成False,这行代码忽略系统之后的警告
"""
这个文件主要来通过get、post等方法来进行http请求,并拿到请求响应
"""

token = login(mobile_phone,password) # 登录方法
headers = {'Authorization': token,
           "Content-Type": 'application/json;charset=UTF-8',
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'}


class RunMain():
    def send_post(self, path, data):
        response = requests.post(url=environment+path,data=json.dumps(data,ensure_ascii=False,separators=(',',':')).encode('utf-8'), headers=headers,verify=False)
        log.info(path)  # path
        log.info(data)  # 请求,便于复现
        log.info(response.status_code)  # 请求状态码
        return response

    def send_get(self, path, data):
        response = requests.get(url=environment+path, data=data, headers=headers,verify=False)
        log.info(path)
        log.info(data)
        log.info(response.status_code)
        return response

    def run_main(self, method, path=None, data=None):
        result = None
        if method.lower() == 'post':
            result = self.send_post(path, data)
        elif method.lower() == 'get':
            result = self.send_get(path, data)
        else:
            print("method值错误!!!")
        return result


if __name__ == '__main__':
    result1 = RunMain().run_main('get', '/v1/wrong-work/info?type=1').json()
    result2 = RunMain().run_main('Get', '/v1/wrong-work/info?type=2').json()
    print(result1)
    print(result2)

case:用例文件夹,敏捷模式中开发提测基本上都是单接口提测,而且同一个模块下的接口分给了不同的开发,为了方便定位到开发,所以我将平台所有的接口都写了过来╮(╯▽╰)╭,

老规矩,下方直接执行,可以进行单接口的相关验证。

相信各位也看了很多的接口自动化测试框架,我上面的应该没有多少新意,下面就是不同点;

regression_testing 顾名思义,回归测试ing,只有进行时,没有完成时……

鄙人将前端的业务逻辑通过接口层模拟了过来,做了许久之后,不禁产生了怀疑:这都是哪位鬼才设计的?没有被开发XX了吗?

上图是使用unittest框架进行的,用例之间传参用法其实就是我上面展示的一部分;

其实这个文件夹下不适合使用unittest框架,因为通过用例之间的巧妙设计,虽然可以将业务之间的调用状态都模拟出来,但是由于脏数据的存在,某些bug没有在这些测试过程中表示出来。

哎,苦命啊,前端赶紧进行插桩操作,报错日志上传起来;鄙人只能放大招了,拾起了爬虫思路,自动遍历吧(穷举);

放代码片段,哎,遍历一时爽,重构火葬场(json目录深了之后,是真的不想看)。

之后优化思路:将regression_testing里面的方法改成test_*,写一个run方法,加上测试报告,邮件通知(ps:但鄙人不用啊,就十个人,遇到bug,tapd复制上参数,“老哥,出bug了”)

是不是也发现了,少了很多东西?写个装饰器(用于统计时间),接口请求超时也要打印出来;

 其实还有一个文件夹,用来写压测脚本(基于locust的FasthttpUser),log文件夹中的path以及data都是直接可以在locust中使用的,省了构造数据的时间;

locust脚本如下(部分),更详细的可以看看httprunner的实现思路,大神写的比我强太多了,还是得学啊。

  

Python接口自动化测试零基础入门到精通(2023最新版)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器兼容性问题及其解决方案

一、认识浏览器 四大内核: Blink、Gecko、WebKit、Trident (不再活跃) 主流浏览器: IE(Trident内核)、Firefox(火狐:Gecko内核)、Safari(苹果:webkit内核)、Google Chrome(谷歌:Blink内核)、Opera(欧朋:B…

如何通过低代码工具,提升运输行业的运营效率和服务质量

《中国数字货运发展报告》显示,2022年我国公路货运市场规模在5万亿元左右。其中,数字货运整体市场规模约为7000亿元,市场渗透率约为15%。而以小微企业为主的货运行业,却以小、散、乱的行业特征,承载着5万亿元左右的市场…

SEAM-STRESS

模型 PCM means ‘Pixel Correlation Module’ 辅助信息 作者未提供代码

【matlab程序】matlab使用箭头在图像上标注

【matlab程序】matlab使用箭头在图像上标注 clear;clc;close all;x0:1/10000:2*pi; ysin(x); figure plot(x,y,LineWidth,2) x_begin 1; x_end 2; y_begin 0; y_end 0.2;annotation(arrow,XY2Norm(X,[x_begin,x_end]),XY2Norm(Y,[y_begin,y_end]),LineWidth,2,Color,r); …

静态住宅IP代理实际应用:它的强大用途你知道吗?

静态住宅IP代理与动态IP代理相比,提供了更稳定的网络身份,使得企业在进行数据采集、区域定位营销和市场研究时更为高效。同时,它也是提高在线隐私保护和避免封禁的有效工具。 通过详细分析,你将能全面了解静态住宅IP代理的应用&a…

【Python+Appium】自动化测试框架

appium简介 Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。Appium、Appium-desktop、Appium Client 的区别是 Appium …

同旺科技 USB 转 RS-485 适配器 -- 隔离型(定制款)

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有: ● 支持USB 2.0/3.0接口,并兼容USB 1.1接口; ● 支持USB总线供电; ● 支持Windows系统驱动,包含WIN10 / WIN11 系统32 / 64位; ● 支持Windows …

JSON详细教程

😊JSON详细教程 🚩JSON简介☃️JSON语法规则🔊JSON和JavaScript对象的区别 ☃️JSON数据类型字符串🔊数字🔊布尔值🔊数组🔊对象🔊Null ☃️JSON对象🔊访问JSON对象的值&a…

k8s部署jenkins

1.先决条件 1.因为国内的容器镜像加速器无法实时更新docker hub上的镜像资源.所以可以自己进行jenkins的容器镜像创建,. 2.这里用到了storageClass k8s的动态制备.详情参考: k8s-StoargClass的使用-基于nfs-CSDN博客 3.安装docker服务.(用于构建docker image) 2.构建jenki…

案例-某乎参数x-zse-96逆向补环境

文章目录 前言一、流程分析二、导出代码三、补环境总结 前言 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则…

Django回顾【二】

一、Web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,…

C语言——有一个3*4的矩阵,要求求出其中值最大的那个元素的值,以及其所在的行号和列号

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j,row0,colum0,a[3][4]{{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};int maxa[0][0];for ( i 0; i < 3; i)//行&#xff08;row&#xff09;{for ( j 0; j < 4; j)//列&#xff08;colum&#xf…

API接口测试工具的主要作用及选择指南

API接口测试是现代软件开发中至关重要的一环。为了确保不同组件之间的无缝集成和功能正常运作&#xff0c;API接口测试工具应运而生。本文将介绍API接口测试工具的主要作用&#xff0c;以及在选择适合项目的工具时需要考虑的因素。 1、功能测试&#xff1a;API接口测试工具的首…

深入理解 SQL UNION 运算符及其应用场景

SQL UNION运算符 SQL UNION运算符用于组合两个或多个SELECT语句的结果集。 每个UNION中的SELECT语句必须具有相同数量的列。列的数据类型也必须相似。每个SELECT语句中的列也必须按照相同的顺序排列。 UNION语法 SELECT column_name(s) FROM table1 UNION SELECT column_na…

你真的懂人工智能吗?AI真的只是能陪你聊天而已吗?

提到AI这个词语&#xff0c;相信大家并不陌生&#xff0c;尤其是前段时间爆火的chatgpt&#xff0c;让我们发现似乎AI已经渗透到我们生活的方方面面了&#xff0c;但是你确定你真的了解AI这个事物吗&#xff1f;它真的只是一个简简单单的人工智能吗&#xff1f;恐怕不止如此。那…

Python解释器下载和安装

什么是python解释器 一款用于执行python代码的应用程序 如何下载python解释器 下载网址&#xff1a;Download Python | Python.org 安装步骤&#xff1a; 双击下载下来的安装包测试

【2023传智杯】第六届传智杯程序设计挑战赛AB组-DEF题解题分析详解【JavaPythonC++解题笔记】

本文仅为【2023传智杯】第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言更新进度记录二.比赛题目(AB俩组)D题题目-abbE题题目 -kotori和…

Postgresql数据库运维统计信息

如果需要使用以下运维信息&#xff0c;需要如下几步 修改postgresql.conf文件 #shared_preload_libraries # (change requires restart)shared_preload_libraries pg_stat_statements重启数据库创建扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;1. 统计信息…

记录:Unity脚本的编写7.0

目录 连接数据库编写脚本查看效果查增删 有段时间没有更新了&#xff0c;现在有点空&#xff0c;就继续写一下unity的脚本&#xff0c;这次就来写一下关于unity连接数据库的内容 连接数据库 无论是什么语言与应用场景&#xff0c;总有一项东西是绕不开的&#xff0c;那就是数据…

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB &#xff08;1&#xff09;概念 …