Python+requests编写的自动化测试项目

news2024/11/25 23:47:30

框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(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的实现思路,大神写的比我强太多了,还是得学啊。

【整整200集】超超超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

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

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

相关文章

Biome-BGC生态系统模型与Python融合技术:揭秘未来生态预测新趋势

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数,模拟日尺度碳、水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天…

手机提词器有哪些?简单介绍这一款

手机提词器有哪些?手机提词器在现代社会中越来越受欢迎,原因是它可以帮助人们提高演讲和朗读的效果。使用手机提词器可以让人们更加自信地面对演讲和朗读,不至于出现口误或读错字的情况。此外,手机提词器还可以帮助人们节省时间和…

了解稀疏数组

稀疏数组(一种数据结构) package com.mypackage.array;public class Demo08 {public static void main(String[] args) {//1.创建一个二维数组 11*11// 0:没有棋子 1:黑棋 2:白棋int[][] array1 new int[11][11];…

OpenCV(四十一):图像分割-分水岭法

1.分水岭方法介绍 OpenCV 提供了分水岭算法(Watershed Algorithm)的实现, 使用分水岭算法对图像进行分割,将图像的不同区域分割成互不干扰的区域。分水岭算法模拟了水在图像中的扩散和聚集过程,将标记的边界被看作是阻…

Android Shadow 插件化原理演示

工程目录图 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 代码:LearnShadow

【Linux指令】Centos7 touch修改Access/Modify/Change 时间与恢复系统时间

文章目录 前言正文1. 查看文件状态2.只更新Access Time2.只更新Modify Time3. 修改Acess Time 与Modify Time为指定时间4. 修改Change时间5. 恢复系统时间 总结 前言 本篇主要讲解touch与时间相关的操作,关于touch创建文件,就不再赘述。 正文 1. 查看…

IP地址定位基础数据采集

在互联网时代,IP地址定位技术已经成为了广泛应用的一项重要技术。无论是用于网络安全、广告投放、市场调研还是用户体验优化,IP地址定位技术都发挥着关键作用。 什么是IP地址定位? IP地址定位是一种技术,它通过IP地址来确定设备…

行云管家全面适配信创国产化平台 助力政企信创环境下数字化转型与安全运维

近日,作为云计算管理及信息安全领域优秀的产品服务提供商,深圳市行云绽放科技有限公司宣布旗下行云管家系列产品已全面适配信创国产化平台,包括CPU、服务器、数据库、浏览器等,为政企客户提供符合信创环境要求的云计算管理与信息安…

排序算法-堆排序

思路 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆 来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。 我们先将要排序的数据建成堆,然后通…

【数据分享】上海市道路中心线数据(无需转发\单线\shp格式)

道路数据是我们在各项研究中经常使用的数据,我们一般获取到的数据都是多线道路(也就是一条道路上有多条线来表示),这种多线道路并不适用于交通网络分析等操作中,很多时候我们需要单线道路数据,也就是道路中…

基于协同过滤算法的旅游推荐系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

接口自动化测试中解决接口间数据依赖

在实际的测试工作中,在做接口自动化测试时往往会遇到接口间数据依赖问题,即API_03的请求参数来源于API_02的响应数据,API_02的请求参数又来源于API_01的响应数据。 因此通过自动化方式测试API_03接口时,需要预先请求API_02接口&a…

马来西亚市场最全开发攻略

东盟有十个国家,人口接近6亿,已连续13年成为我国最大贸易伙伴之一。数据显示,1-7月中国与东盟贸易总值为3.59万亿元,同比增长2.8%。东盟成员国中,与中国前三大贸易伙伴依次为越南、马来西亚和印度尼西亚。 今天来聊一…

2023.8.13百度之星(第二场)第一题官方题解注释说明

第一题&#xff1a;星际航行 #include<bits/stdc.h> using namespace std; int n, a[3][100010]; int tmp[100010]; long long calc(int *a,int opt){//opt等于0表示回合到同一个点花费的最小代价&#xff0c;opt等于1表示将数列排序成连续的整数数列for(int i1;i<n;i…

Spring基础(2w字---学习总结版)

目录 一、Spirng概括 1、什么是Spring 2、什么是容器 3、什么是IoC 4、模拟实现IoC 4.1、传统的对象创建开发 5、理解IoC容器 6、DI概括 二、创建Spring项目 1、创建spring项目 2、Bean对象 2.1、创建Bean对象 2.2、存储Bean对象&#xff08;将Bean对象注册到容器…

DevEco Studio中如何设置HarmonyOS/OpenHarmony应用开发

DevEco Studio内置有帮助中心&#xff0c;初学HarmonyOS 及OpenHarmony应用、元服务的开发者&#xff0c;通过内置的帮助中去系统的学习相关内容&#xff0c;是边练边学&#xff0c;快速上手的最佳方式。 一、帮助 二、快速开始 三、HarmonyOS应用、元服务开发相关 四、OpenHa…

c语言练习57:浮点数在内存中的存储

浮点数在内存中的存储 上⾯的代码中&#xff0c; num 和 *pFloat 在内存中明明是同⼀个数&#xff0c;为什么浮点数和整数的解读结果会差别 这么⼤&#xff1f; 要理解这个结果&#xff0c;⼀定要搞懂浮点数在计算机内部的表⽰⽅法。 根据国际标准IEEE&#xff08;电⽓和电⼦⼯…

自建私人图床方案:使用Cpolar+树洞外链轻松部署超轻量级图床,实现高效图片存储

文章目录 1.前言2. 树洞外链网站搭建2.1. 树洞外链下载和安装2.2 树洞外链网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语…

Linux上防火墙操作

开放关闭防火墙 查看防火墙状态的命令&#xff1a;systemctl status firewalld 或者 firewall-cmd --state 暂时关闭防火墙的命令&#xff1a;systemctl stop firewalld 暂时开启防火墙的命令&#xff1a;systemctl start firewalld 永久关闭防火墙(禁用开机自启)下次启动&a…

[Linux]进程信号

[Linux]进程信号 文章目录 [Linux]进程信号进程信号的定义信号的特点信号的生命过程发送信号的原理进程处理信号的方式分类使用指令查看Linux系统定义的信号信号产生使用终端按键产生信号使用指令向进程发送信号调用系统调用向进程发送信号由软件条件产生信号硬件异常产生信号 …