百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

pytest测试框架之http协议接口测试

ccwgpt 2024-11-02 11:03 25 浏览 0 评论

1 接口测试

日常测试中接口测试是一项重要的工作,尤其是http协议的接口测试更加普遍,比如一些常用的测试框架或者工具(robotframework框架,testng框架,postman等)都支持http接口的测试,而这节内容主要介绍下http接口在pytest框架下的应用。

2 复习下Http协议规范

Http协议是基于TCP协议(三次握手)的7层协议(不了解的可以搜索下网络协议模型),所以在开始使用工具之前我们通过浏览器的开发者工具看下http请求的基本消息格式。

我们以输入百度网站为例,通过打开开发者工具,看下访问百度的http请求。

通过上面几张图可以看到 http请求的URL为https://www.baidu.com, 请求的method为Get,请求响应的status为200,还包括发送请求的消息头headers信息和响应返回的消息头Headers信息。

做接口测试我们关注的肯定也是上述http请求的内容,通过传入的参数,断言返回的消息响应码/消息体是否满足我们的预期。

3 安装所需的python包

在pytest框架下我们主要介绍两个包requests(作为http客户端)和pytest插件pytest-httpserver(作为http的服务端)。

pytest安装

使用pip命令安装: pip install pytest -i https://mirrors.aliyun.com/pypi/simple/

pytest-httpserver安装

使用pip命令安装: pip install pytest-httpserver -i https://mirrors.aliyun.com/pypi/simple/

requests安装

使用pip命令安装: pip3.10 install requests -i https://mirrors.aliyun.com/pypi/simple/

PS:安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)

4 pytest-httpserver插件介绍

pytest-httpserver插件安装后,默认会有一些fixture函数直接使用。

在pytest_plugin.py中有fixture函数httpserver,该函数会初始化一个HTTPserver,当然我们也可以直接使用HTTPServer。

启动httpserver需要监听的ip和port ,首先会取os模块配置的环境变量,如下:

listen_host = os.environ.get("PYTEST_HTTPSERVER_HOST")
listen_port = os.environ.get("PYTEST_HTTPSERVER_PORT")

如果环境变量获取为None,则取HTTPserver类的类属性作为默认值:

DEFAULT_LISTEN_HOST = "localhost"
DEFAULT_LISTEN_PORT = 0 # Use ephemeral port

以下是源代码:

如果不想使用默认的ip和端口,我们可以重新设置环境变量的ip地址和端口

import os
import pytest
os.environ['PYTEST_HTTPSERVER_HOST'] = '127.0.0.1'
os.environ['PYTEST_HTTPSERVER_PORT'] = '8080'
listen_host = os.environ.get("PYTEST_HTTPSERVER_HOST")
listen_port = os.environ.get("PYTEST_HTTPSERVER_PORT")
print(listen_host,listen_port)

打印结果:

127.0.0.1 8080

用上面的ip和端口,我们启动一个httpserver:

from pytest_httpserver import *
http_server = HTTPServer(listen_host,listen_port)
http_server.expect_request(
"/index.html", method="get").respond_with_json({"code": "200"})
http_server.start()

httpserver启动后,我们可以登陆浏览器,访问如下:

以上函数解释:

  • expect_request 方法:用于创建HTTP请求地址,设置http的uri地址,或者http的method(GET,POST等),或者http的请求参数(?问号后面的参数),或者http请求响应中返回的json体等
  • respond_with_json方法:设置http请求响应的json体,可定义响应码(200等)。
  • start方法:启动httpserver。对应的stop方法是关闭httpserver

5 requests库介绍

requests库是一个简单易用的HTTP库,使用前先导入requests包。

import requests

以下是一些常用函数介绍:

  • get方法

requests.get('http://127.0.0.1:8080/index.html',headers={'user-agent': 'my-app/0.0.1'})

其中headers为添加的请求头信息。

  • post方法

requests.post('http://127.0.0.1:8080/index.html'', data = {'key':'value'})

其中data为请求body体。

  • 处理响应

不管是get还是post方法,我们都可以访问响应对象的属性来获取所需的响应信息,比如:

response.text:获取响应内容的字符串形式。

response.content:获取响应内容的二进制形式。

response.status_code:获取HTTP响应状态码。

response.headers:获取响应头。

response.json():如果响应内容是JSON格式,可以直接调用这个方法来获取JSON数据。

6 http接口用例

在pytest框架下我们创建测试用例,并校验响应的statuscode和内容。

创建两条用例分别请求httpserver的get和post。

import requests
#使用fixture函数httpserver
def test_1(httpserver):
	httpserver.expect_request(
		"/service", method="post", json={ "title": "hello pytest"}
			).respond_with_json({"code": "200"})
	rsp = requests.post("http://127.0.0.1:8080/service", json={ "title": "hello pytest"})
	assert rsp.status_code == 200
	assert rsp.json() == {"code": "200"}

def test_2(httpserver):
	httpserver.expect_request(
		"/index.html", method="get").respond_with_json({"code": "200"})
	rsp = requests.get(httpserver.url_for("/index.html"))
	assert rsp.status_code == 200
	assert rsp.json() == {"code": "200"}

以上我们简要介绍了使用python库requests和pytest插件pytest-httpserver在pytest框架下的http接口用例,大家可以在线下多多实践,当然对于大型的项目,我们还要规划好整个测试用例目录结构。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习和关注,谢谢大家。

相关推荐

MFC、Qt、WPF?该用哪个?(mfc和wpf区别)

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...

一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...

关于面试资深C#、WPF开发工程师的面试流程和问题

一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...

C# WPF MVVM模式Prism框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...

WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)

WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...

C#上位机WinForm和WPF选哪个?工控老油条的"血泪史"

作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...

【一文扫盲】WPF、Winform、Electron有什么区别?

近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...

一个开源、免费、强大且美观的WPF控件库

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...

WPF 根据系统主题自动切换浅色与深色模式

WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...

WPF与WinForm的本质区别(wpf与maui)

在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...

Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本

IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...

一款非常漂亮的WPF管理系统(wpf架构及特性)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...

WPF 实现描点导航(wpf按钮的点击事件)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

微软更新基于Win11的Validation OS 2504:增强 .NET与WPF

IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...

WPF的技术架构与优势(wpf的前景)

WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...

取消回复欢迎 发表评论: