Python测试框架Pytest的使用

pytest基础功能

  • pytset功能及使用示例
    • 1.`assert`断言
    • 2.参数化
    • 3.运行参数
    • 4.生成测试报告
    • 5.获取帮助
    • 6.控制用例的执行
    • 7.多进程运行用例
    • 8.通过标记表达式执行用例
    • 9.重新运行失败的用例
    • 10.setup和teardown函数

pytset功能及使用示例

1.assert断言

借助python的运算符号和关键字实现不同数据类型的断言

例如当前需要测试登录功能,一下是一个登录示例

# 注意运行示例之前请确认已经配置好浏览器的webdriver,使得python代码可以调用
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys"""借助python的运算符号和关键字实现不同数据类型的断言
"""# 某网站登录案例
def test_login_success():# 初始化WebDriver(以Chrome为例)driver = webdriver.Chrome()# 打开测试网页driver.get("https://www.taobao.com/")# 找到登录按钮login_element = driver.find_element(By.XPATH, '//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]')# 点击登录按钮login_element.click()# 跳转到登录页面# 获取用户名、密码输入框username = driver.find_element(By.ID, "fm-login-id")password = driver.find_element(By.ID, "fm-login-password")# 输入用户名、密码username.send_keys("username")password.send_keys("password")# 点击登录按钮login = driver.find_element(By.XPATH, '//*[@id="login-form"]/div[6]/button')# 休眠等待sleep(10)login.click()# 或者使用回车(似乎淘宝不能使用回车登录)# login.send_keys(Keys.RETURN)# == 测试相等# 登录成功检查# 获取淘x中登陆成功后与登陆前不同之处,这里我使用了一个购物车字段text = driver.find_element(By.XPATH,'//*[@id="ice-container"]/div[3]/div[2]/div/div[2]/div/div[1]/div[1]/a[2]/span/strong[2]').textprint(text)# 休眠等待sleep(3)assert text == "tao昵称"# 退出浏览器driver.quit()

以上功能是针对登录案例编写的一段测试用例,因为不断尝试访问触发的淘宝的保护机制,这里便没有登录成功的截图。

# 常用比较方法
# != 测试不等于
# <= 测试小于等于
# >= 测试大于等于
# not in 测试不包含
# in 测试包含

还有一种比较抽象的想法

判断是否为ture

判断是否不为true

用代码解释

# 假设我们有一个简单的函数,它根据输入返回True或False  
def is_even(number):  return number % 2 == 0  # 接下来,我们编写一个pytest测试来验证这个函数  
import pytest  def test_is_even():  # 使用assert来断言is_even(2)返回True  assert is_even(2)  
# test_is_even函数通过assert语句来验证is_even函数的行为是Ture还是False

2.参数化

当一组测试用例有固定的测试数据时,就可以通过参数化的方式简化测试用例的编号。

通过pytest.mark.parmtrize()方法设置参数:

参数名:user,pw,expected用来定义参数的名称

参数值:通过数组定义参数值时,每一个元组都是一条测试用例的测试数据

ids参数:默认none用来重新定义测试用例的名称

import pytest
@pytest.mark.parametrize(# 编写测试参数"user,pw,expected",[("username", "password", "expected"),("username02", "password2", "expected02")],# 测试用例名称ids=["case1", "case2"]
)

接下来就是将原来的数据替换为自己的参数。

在这里插入图片描述

在这里插入图片描述

3.运行参数

-s:打印信息

-v:显示详细信息

-V:显示版本信息

-k:运行名称中包含某个字符串的测试用例

-q:简化输出信息

-x:测试用例失败,退出测试

使用示例(都是在控制台输入命令)

# -s的使用
pytest -s
# -v的使用
pytest -v
# -V的使用
pytest -V
# -k的使用
pytest -k 方法名称  方法文件名
pytest -k 文件方法名
# -q的使用
pytest -q
#-x的使用
pytest -x 文件名

4.生成测试报告

4.1 使用命令生成Junit测试报告

pytest filename.py --junit-xml=./directory/logname.xml

在这里插入图片描述

在这里插入图片描述

4.2 生成在线测试报告

pytest filename.py --pastebin=all

在这里插入图片描述

点击链接访问效果

在这里插入图片描述

5.获取帮助

  • 查看pytest版本pytest --versionorpytest -V

1.显示可用的内置函数参数pytest --fixtures

我的电脑没有设置目录访问权限,如果需要使用帮助,建议使用以下两种方法。

2.获取帮助pytest --help

在这里插入图片描述

3.访问pytest官方文档pytest documentation

6.控制用例的执行

在第N个测试用例执行失败后,结束测试用例执行

使用pytest --maxfail=[失败次数] 文件名

# 执行测试用例时,失败两次后停止执行
pytest --maxfail=2  src/tests/test_mark.py
import pytest
# 失败用例1
def test_fails01():assert 1 == 2
# 失败用例2
def test_fails02():assert 1 == 2
# 成功用例
def test_success():assert 1 == 1

在这里插入图片描述

7.多进程运行用例

安装pytest-xdist

使用如下命令:

#安装
pip install pytest-xdist
#运行模式
pytest -n NUMCPUS

代码示例

import pytest
def test_case01():assert 1 == 1
def test_case02():assert 1 == 5  # 失败
def test_case03():assert 1 == 1
def test_case04():assert 1 == 3  # 失败
def test_case05():assert 1 == 1
def test_case06():assert 1 == 4  # 失败

在这里插入图片描述

还可以直接使用与九十九内核一样多的CPU将NUMCPUS修改为auto,python会自动识别并执行。

8.通过标记表达式执行用例

# 执行被装饰器修饰`@pytest.mark.slow`装饰的所有测试用例
python -m slow

在这里插入图片描述

不仅可以只选中他,也可以不选择。

使用not除它,or两者其一,and两者

# 除了把slow标记的都执行
python -m not slow
# 只要被slow或者webtest标记就执行
python -m "slow or webtest"
# 只有方法被两个都标记才执行
python -m "slow and webtest"

可以选择添加pytest.ini配置文件用于介绍标记的含义。

[pytest]
markers =slow: mark tests as slow (deselect with '-m"not slow"')webtest : mark tests as webtest

9.重新运行失败的用例

首先需要安装一个插件pytest-rerunfailures

pip install pytest-rerunfailures

接着使用运行失败测试用例命令:

#普通执行所有失败测试用例
pytest --reruns [执行次数] [文件目录]
#在两次重新执行前加延迟时间
pytest --reruns [执行次数] --reruns-deley [等待秒数] [文件目录]

在这里插入图片描述

10.setup和teardown函数

pytest 默认查找以 test_ 开头的函数作为测试用例,并且使用 setup_functionteardown_function(针对每个测试函数),或者 setup_moduleteardown_module(针对整个模块)作为测试的前置和后置操作。

import pytest
def multiply(a, b):return a * b
"""
优先级第一:setup_module/teardown_module 在当前文件在所有用例前执行与之后执行第二:setup_function/teardown_function 在每个函数之前执行与之后执行
"""
def setup_module(module):print("setup_module=================>")
def teardown_module(module):print("teardown_module==============>")
def setup_function(module):print("setup_function=================>")
def teardown_function(module):print("teardown_function==============>")
def test_case01():print("test_case01")assert multiply(1, 2) == 2
def test_case02():print("test_case02")assert multiply(4, 6) == 24

在这里插入图片描述

在类中,你可以使用 pytest 的类级别的 setup 和 teardown 方法,即 setup_classteardown_class注意,从 pytest 3.0 开始,推荐使用 setup_classteardown_class 的新名称 setup_methodteardown_method 加上 @classmethod 装饰器来定义类级别的 setup 和 teardown,但更常见的是使用 @pytest.fixture(scope="class") 来定义类级别的 fixture,或者继续使用 setup_classteardown_class 作为特殊方法名,但它们需要 @classmethod 装饰器)。

import pytestdef multiply(a, b):return a * bclass TestMultiply:@classmethoddef setup_class(cls):print("setup_class---------->")@classmethoddef teardown_class(cls):print("teardown_class--------->")def setup_method(self):print("setup_method=======")def teardown_method(self):print("teardown_method=======")def test_case01(self):print("test_case01")assert multiply(1, 2) == 2def test_case02(self):print("test_case02")assert multiply(4, 6) == 24

在这里插入图片描述

上述代码中的 setup_classteardown_class 方法并不是 pytest 的内置方法,它们只是遵循了一种常见的命名约定。pytest 实际上并不直接识别这些方法作为类级别的 setup 和 teardown。相反,你应该使用 pytest 的 fixture 功能,特别是设置 scope="class" 的 fixture,来实现类级别的 setup 和 teardown。

使用 fixture 的例子:

import pytest  @pytest.fixture(scope="class")  
def class_setup(request):  print("setup class---------->")  # setup code here  request.cls.setup_attribute = "some value"  yield  # yield 语句之后的代码会在 teardown 时执行  print("teardown class-------->")  class TestClass:  @pytest.mark.usefixtures("class_setup")  class TestMethods:  def test_method1(self):  print("running test_method1")  assert True  def test_method2(self):  print("running test_method2")  assert True  

打印效果:

在这里插入图片描述

或者还可以使用更常见的做法是将 usefixtures 应用于类本身,或者将 fixture 应用于具体的测试方法。

下面的示例展示了更常见的用法:

@pytest.mark.usefixtures("class_setup")  
class TestClass:  def test_method1(self):  print("running test_method1")  assert True  
def test_method2(self):  print("running test_method2")  assert True
# 或者,直接在类定义中使用 autouse=True 的 fixture 
@pytest.fixture(scope="class", autouse=True)  
def class_setup_autouse(request):  print("setup class---------->")  # setup code here  yieldprint("teardown class-------->")  class TestClass:  def test_method1(self):  print("running test_method1")  assert True  def test_method2(self):  print("running test_method2")  assert True

在这个修正后的示例中,class_setup_autouse fixture 会自动应用于 TestClass 中的所有测试方法,因为它被设置为 autouse=Truescope="class"。这意味着它会在类中的所有测试方法之前执行一次 setup,在所有测试方法之后执行一次 teardown。

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

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

相关文章

Azure OpenAI citations with message correlation

题意&#xff1a;“Azure OpenAI 引用与消息关联” 问题背景&#xff1a; I am trying out Azure OpenAI with my own data. The data is uploaded to Azure Blob Storage and indexed for use with Azure AI search “我正在尝试使用自己的数据进行 Azure OpenAI。数据已上传…

ubuntu系统在线安装下载firefox-esr流览器

1、在线firefox流览器 Firefox ESR(Extended Support Release)是火狐浏览器的长期支持版本&#xff0c;针对同一个主版本提供一年左右的安全性与稳定性支持。如果您因为火狐浏览器改版而导致有原本能用的功能变得不能使用的话(例如Firefox 64.0把RSS订阅的功能拿掉了)&#xf…

VBA之正则表达式(46)-- 解析业务逻辑公式

实例需求&#xff1a;某业务系统的逻辑公式如下所示&#xff08;单行文本&#xff09;&#xff0c;保存在活动工作表的A1单元格中。 "DSO_90Day"->"FA_NoFunc"->"FCCS_No Intercompany"->"FCCS_Data Input"->"FCCS_…

SparkSQL数值模式详解

简介 函数如 to_number 和 to_char 确实支持在字符串类型和十进制&#xff08;数值&#xff09;类型之间进行转换。这些函数接受格式字符串作为参数&#xff0c;这些格式字符串指示了如何在这两种类型之间映射。 to_number&#xff1a;这个函数通常用于将字符串转换成数值类型…

在IDEA中使用Git

在IntelliJ IDEA&#xff08;通常简称为IDEA&#xff09;中使用Git进行版本控制是一种高效且集成度高的做法。以下是在IDEA中使用 Git的详细步骤和说明&#xff1a;一、安装与配置Git 安装Git&#xff1a; 前往Git的官方网站下载并安装Git。 安装过程中&#xff0c;建议勾选“…

泛微E9如何更新缓存

泛微E9如何更新缓存 在E9中&#xff0c;是默认开启了数据缓存的&#xff0c;如果直接操作数据库是会存在缓存不更新的问题&#xff0c;E9系统提供以下几种方式进行缓存清空的方式。 注&#xff1a;原则上禁止通过非程序渠道直接修改OA数据库数据&#xff0c;可以直接在页面进行…

flutter开发小技巧

Uri对象的使用 直接使用字符串来拼接 URI 地址需要关注地址中拼接的每个部分的合法性&#xff0c;并且在处理复杂逻辑时需要更冗长的处理&#xff0c;如果变量包含非法字符(如中文)&#xff0c;整个地址非法。 如&#xff1a;在路由跳转中使用 方式一&#xff1a;使用Uri对象…

clickhouse-neighbor 坑爹的排序

对于排序规则明显的数据集&#xff0c;使用neighbor来做分析&#xff0c;是一个非常强大的函数&#xff0c;能完成很多复杂的计算&#xff0c;例如高速公路分析车辆流量。 高速公路截面流量一般是通过路面上的门架采集设备采集通行卡的信息和识别牌照组成&#xff0c;在路面行驶…

Linux云计算 |【第二阶段】SECURITY-DAY3

主要内容&#xff1a; Prometheus监控服务器、Prometheus被监控端、Grafana监控可视化 补充&#xff1a;Zabbix监控软件不自带LNMP和DB数据库&#xff0c;需要自行手动安装配置&#xff1b;Prometheus监控软件自带WEB页面和DB数据库&#xff1b;Prometheus数据库为时序数据库&…

05:极限-无穷小

1.无穷小的概念及比较 定义&#xff1a; lim ⁡ x → x 0 f ( x ) 0 , 则称 f ( x ) 是 x x 0 时的无穷小 定义&#xff1a; \lim_{x \to x_0} f(x) 0,则称f(x)是xx_0时的无穷小 定义&#xff1a;x→x0​lim​f(x)0,则称f(x)是xx0​时的无穷小 性质Value①有限个无穷小相加还…

java 使用 aws s3 sdk 实现视频文件的分段下载来实现html 页面 video 的断点播放、拖动进度播放

参考博客&#xff1a; 1. Java 视频流分段返回 1. java 拉取 aws s3 视频流返回给浏览器&#xff1a; Overridepublic void playVideo(Long fileLength,String key,HttpServletRequest request,HttpServletResponse response) {OutputStream outputStream null;S3ObjectInputS…

JVM 运行时内存结构简介

JVM 运行时内存结构简介 一、前言二、JVM 运行时内存结构2.1 线程隔离数据区&#xff1a;2.2 线程共享数据区&#xff1a; 三、JVM 内存区域划分1. 程序计数器&#xff08;PC&#xff09;2. 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池 附录 一、前言 JVM&#…

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

手撕C++类和对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我 们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最 后两个取地址重载不…

Linux 内核源码分析---IPv6 数据包

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址。 由于IPv4最大的…

ES6 -- 总结 03

Es6的模块化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

鸿蒙Harmony开发——设备发烫问题分析

&#xff1b; 本文字数&#xff1a;4207字 预计阅读时间&#xff1a;25分钟 设备过热问题是影响用户体验和设备性能的重要因素。过热不仅会导致性能下降&#xff0c;还可能损坏硬件。因此&#xff0c;开发者需要及时发现、分析并解决这一问题。本文将首先介绍评估设备过热的关键…

文心快码(Baidu Comate)初体验

文心快码&#xff08;Baidu Comate&#xff09;初体验 1文心快码简介和安装&#xff1a;简要介绍文心快码&#xff08;Baidu Comate&#xff09;、安装方法、使用方法等&#xff1b; Baidu Comate 是由百度自主研发&#xff0c;基于文心大模型&#xff0c;结合百度丰富的编程现…

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中&#xff0c;寻找main函数在逆向分析中是非常重要的&#xff0c;它是程序的核心执行点&#xff0c;从这里开始&#xff0c;程序的主要逻辑开始展开&#xff1b;在这边我们需要明确两个概念&#xff1a;用户入口&#xff08;User Entry Point&#xff09; 和 …

(十二)Flink Table API

目录 Table API 案例 Table API 连接操作 Table API 是批处理和流处理的统一的关系型 API。Table API 的查询不需要修改代码就可以采用批输入或流输入来运行。Table API 是 SQL 语言的超集,并且是针对 Apache Flink 专门设计的。Table API 集成了 Scala,Java 和 Python 语言…