全网最强,连夜爆G肝整理接口自动化测试笔记,轻松应对工作场景,看完不想走了

本文主要是介绍全网最强,连夜爆G肝整理接口自动化测试笔记,轻松应对工作场景,看完不想走了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录:导读

    • 一、前言
    • 二、前期的准备工作
      • 1、接口路径表
      • 2、测试用例表
    • 三、目录结构及运行流程
      • 1、文件目录结构
      • 2、测试的运行流程
    • 四、测试用例的实现过程
      • 1、读取excel表
      • 2、将数据格式化成测试套件
      • 3、生成可执行的测试套件
      • 4、pytest执行测试套件
      • 5、运行测试用例
      • 6、结果展示
        • pytest-html生成的测试报告:
        • allure生成的测试报告:

一、前言

使用pytest测试框架并以数据驱动的方式执行测试用例,可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。

当然,pytest还有以下其他优点:

  • 可以让用户写出更为紧凑的测试套件;
  • 涉及到的样板代码并不多,因此用户能够容易地编写和理解各种测试;
  • 测试夹具(fixture)函数常被用来向测试函数添加某个参数,并返回不同的值。在pytest中,可以通过使用一个fixture来模块化另外一个。同时也可以使用多个fixture,在无需重写测试用例的情况下,将测试覆盖到所有参数的组合;
  • 可扩展性强,pytest有许多实用的插件。例如:pytest-xdist可以在不使用其他测试器的情况下,被用于执行并行测试;pytest-rerunfailures可以在测试失败后重新运行,而且运行次数和运行之间的延迟时间都是可以设置的;allure/pytest-html生成测试报告;

相比较其它的测试框架,比如Robot Framework(在创建自定义的HTML报告方面比较繁琐,顶多能用来生成xUnit格式的简短报告)、UniteTest/PyUnit(需要大量的样板代码),pytest更适合作为本次自动化测试的框架。

下面为大家详细的介绍这种自动化测试的实现过程。

二、前期的准备工作

1、接口路径表

根据接口文档,将接口的地址和路径以及请求方式记录在excel表中,key:接口名称,type:请求方式,value:接口路径,第一行baseurl为基本路径,type不填。接口名称建议与接口文档中的接口名称一致,这样方便检查。如果同一个接口有多种请求方式,需要重新填写一行,type为相对应的请求方式。这样记录接口路径和请求方式是为了方便后面的数据提取和处理。
请添加图片描述

2、测试用例表

测试用例表中主要记录9列类型的数据,测试模块:将接口按照模块进行划分有利于问题的定位和数据的分类。

  • 测试模块:将被测接口按照功能进行模块划分;

  • 用例编号:主要用于记录用例的条数,建议按照模块名称进行命名,如:登录模块,用例编号为login_001,login_002;

  • 用例标题:记录测试的内容;

  • 前置条件:当被测接口需要其他接口的数据支撑时,在前置条件栏中填入需要的接口数据,如:login_001:token(login_001指用例编号,token指该用例执行后返回的响应参数中token字段的值),前提条件是该接口用例在本条用例之前;

  • 测试步骤:方便于模块用例的执行;

  • 请求接口:按照接口路径表中key的命名填写,需要请求登录接口时,就填写上图中表中key命名的登录接口。请求头部:当请求头部中有特殊的参数时,比如该接口需要身份验证authorization字段,而该字段的数据来源于登录接口返回的token,这种用例的请求头部应该这样填写: Content-Type=application/json,Authorization=;

  • 请求数据:填写测试用例的请求数据,按照key=value的格式记录,如果需要其他接口的返回数据,在前置条件中加入之后,再填写请求数据中需要的返回数据即可,如:username =admin,password=zxcvbnm,token=;

  • 断言:根据接口返回的数据进行断言,主要是验证返回数据中的某个字段是否正确,也是按照key=value的格式进行填写;
    请添加图片描述

三、目录结构及运行流程

1、文件目录结构

请添加图片描述

  • testcase文件夹:存放测试用例表;

  • api文件夹:存放接口路径表;

  • common文件夹:common文件中存放通用的数据处理的脚本,如data.py和utlis.py(主要作用是将表中的数据进行处理,后面会进行详细的说明)、config.py(测试套件的基本配置);

  • report文件夹:用于存放测试完成后生成的测试报告;

  • conftest.py:属于pytest的一种全局公用的文件,一些通用的方法可以放在conftest.py中;

  • pytest.ini:pytest的配置文件;

2、测试的运行流程

触发自动化测试之后,测试数据的提取与处理并不会使用到pytest框架,当把数据处理为测试套件后,按模块分配给pytest进行执行,包括测试模块、http请求、断言。所有模块执行完之后将测试结果体现在生成的测试报告report.html中。测试结束之后可以通过邮件或者钉钉机器人的方式通知测试或开发本次自动化测试的测试结果。
请添加图片描述

四、测试用例的实现过程

下面简单介绍一下测试用例实现过程中部分脚本的作用。

1、读取excel表

使用xlrd库读取excel表中的内容,python中还有很多可以对excel的数据进行操作的库,如:openpyxl、xlsxwriter;循环遍历每一行的数据,保存为列表并赋值给self.list_data。

# -*- coding: utf-8 -*-
import xlrd
class Excel(object):def __init__(self, file_name):# 读取excelself.wb = xlrd.open_workbook(file_name)self.sh = self.wb.sheet_names()self.list_data = []def read(self):for sheet_name in self.sh:sheet = self.wb.sheet_by_name(sheet_name)rows = sheet.nrowsfor i in range(0, rows):rowvalues = sheet.row_values(i)self.list_data.append(rowvalues)

2、将数据格式化成测试套件

第一步将表格数据保存为列表后,还不是我们需要的数据格式,这样的数据列表不能直接使用,这里进行了一次数据的格式化。这里需要用到config.py中的case_header的配置,将中文的标题换成英文,并作为字典的key值。之后从第1个元素开始循环遍历data,将data中每个元素都以 [{‘key1’: ‘value1’, ‘key2’: ‘value2’}, {}, {}, …]的形式保存为list_dict_data并返回。

def data_to_dict(data):""":param data: data_list:return:"""head = []list_dict_data = []for d in data[0]:d = case_header.get(d, d)head.append(d)for b in data[1:]:dict_data = {}for i in range(len(head)):if isinstance(b[i], str):dict_data[head[i]] = b[i].strip()else:dict_data[head[i]] = b[i]list_dict_data.append(dict_data)return list_dict_data
case_header = { '测试模块': 'module', '用例编号': 'id', '用例标题': 'title', '前置条件': 'condition', '测试步骤': 'step', '请求接口': 'api', '请求方式': 'method', '请求头部': 'headers', '请求数据': 'data', '断言': 'assert', '步骤结果': 'score' }

3、生成可执行的测试套件

上一步已经将数据处理成了[{‘key1’: ‘value1’, ‘key2’: ‘value2’}, {}, {}, …]这样的格式,但是发现这样的格式没有将模块中的用例整合到一起,列表中每一个元素都是单独的一条用例,这样的话不利于用例的执行,所以,对上一步返回的数据再进行一次处理。因为测试用例和接口路径是保存在两个excel表中的,所以需要将两个表的数据进行合并。首先将接口路径表中的数据读取出来并处理成需要的格式 {‘key’: {‘type’: ‘value’, ‘url’: ‘value’}},之后按照测试步骤中的顺序把测试用例保存在steps字典中。由于代码过长,下面只展示核心部分。

for d in data:# 将请求数据和断言数据格式化for key in ('data', 'assert', 'headers'):if d[key].strip():test_data = dict()for i in d[key].split(','):i = i.split('=')test_data[i[0]] = i[1]d[key] = test_dataif d['module'].strip():if testcase:testsuite.append(testcase)testcase = {}testcase['module'] = d['module']testcase['steps'] = []no = str(d['step']).strip()if no:step = {'no': str(int(d['step']))}for key in ('id', 'title', 'condition', 'api', 'headers', 'data', 'assert'):if key == 'api':step[key] = {'type': apis[d.get(key, '')]['type'],'url': apis['baseurl']['url'] + apis[d.get(key, '')]['url']}else:step[key] = d.get(key, '')testcase['steps'].append(step)
if testcase:testsuite.append(testcase)

4、pytest执行测试套件

将http请求封装在了conftest.py中,使用pytest数据驱动的特点,在执行测试文件test_login。py中不需要import就可以直接调用。这里只展示了发起post请求的代码,其它类型的请求类似,pytest.fixture通过固定参数request传递数据。然后使用’标记’中的pytest.mark.parametrize进行参数化和数据驱动更灵活。在fixture中的方法里面准备测试数据和前置依赖方法,在测试方法中参数化,测试方法调用准备数据和前置方法。

pytest.mark.parametrize(‘post_request’, data, indirect=True),indirect=True是把post_request当作函数去执行,data则是前面生成的模块的测试用例,其中包括了发起\http请求所需要的所有参数。

@pytest.fixture()
def post_request(request):data = request.param['data']header = request.param['headers']url = request.param['api']['url']no = request.param['no']logger.info(f'request: {data}')response = requests.request('POST', url=url, headers=header, data=json.dumps(data))logger.info(f'response: {response.json()}')return response, no
# -*- coding: UTF-8 -*-
import pytest
import allure
from common.data import module_dataclass TestCase(object):@allure.feature('登录')@pytest.mark.parametrize('post_request', module_data(module='登录'), indirect=True)def test_login(self, post_request):response = post_request[0].json()no = int(post_request[1])assert response['msg'] == module_data(module='登录')[no - 1]['assert']['msg']
def module_data(module):excel = Excel(file_path.parent / 'testcase/testcase.xlsx')excel.read()cases = excel.list_datatest_suit = suite_cases(data_to_dict(cases))for _ in test_suit:if _['module'] == module:data = _['steps']return data

5、运行测试用例

可以在pytest.ini中配置执行测试时的一些文件、类、方法的匹配规则和常用的命令参数,执行时只需要命令行输入D:\py_test>pytest就可以开始执行自动化测试。也可以不用pytest.ini配置,命令行执行D:\py_test>pytest -s test_login.py --html=report/report.html,-s参数:输出所有测试用例的print信息,安装了pytest-html插件后,在执行命令中加入–html=测试报告保存路径。

pytest.ini文件配置如下:

[pytest] 
# 打印print,生成保存报告 
addopts = -s --html=report/report.html 
# 匹配执行文件 
python_files = test_*.py 
# 匹配执行类 
python_classes = Test* 
# 匹配执行方法 
python_functions = test_*

6、结果展示

可以在ide中执行测试用例,也可以使用命令行执行,执行完测试用例后,会生成一个html格式的测试报告,在浏览器中打开就可以查看本次自动化测试的测试结果。pytest不仅支持pytest-html插件,还可以使用allure生成更加美观的测试报告。下面分别展示使用pytest-html和allure生成的html测试报告,pytest-html报告中记录的内容比较详尽,包括了用例运行日志、通过\失败\跳过用例条数、用例运行时间等等。allure生成的报告可读性比较强,可以很直观的看到测试结果。

pytest-html生成的测试报告:

请添加图片描述

allure生成的测试报告:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述


这篇关于全网最强,连夜爆G肝整理接口自动化测试笔记,轻松应对工作场景,看完不想走了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/476753

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识