Python测试框架Pytest的使用

news2024/11/14 5:23:54

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]').text
    print(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 pytest


def multiply(a, b):
    return a * b


class TestMultiply:
    @classmethod
    def setup_class(cls):
        print("setup_class---------->")

    @classmethod
    def 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) == 2

    def 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.coloradmin.cn/o/2071067.html

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

相关文章

解决 VMware 中 Ubuntu文件系统磁盘空间不足

目录 问题引入 解决方案 第一步、在VMware中扩展容量&#xff1a; 第二步、查看磁盘空间使用情况&#xff1a; 第三步、安装分区工具&#xff1a; 第四步、启动该分区工具&#xff1a; 第五步、操作分区&#xff1a; 第六步、修改挂载文件夹的读写权限&#xff1a; 第七…

全网最全的yolo系列转换工具,从txt转xml,再从xml转txt,亲自测试好用

在训练yolo的过程中&#xff0c;难免涉及标注的数据格式转化&#xff0c;经过了几次修改和迭代&#xff0c;最终把转化代码跟大家一起分享。 先把xml转txt部分的代码分享一下&#xff0c;py_convert_xml2txt.py&#xff1a; # -*- coding:utf-8 -*-import os import shutil im…

GRAPHCARE:双向图神经网络 + 个性化知识图谱 + 大模型,打开医疗保健预测领域之门

GRAPHCARE&#xff1a;双向图神经网络 个性化知识图谱 大模型&#xff0c;医疗保健预测领域 关系图双向图神经网络个性化知识图谱GRAPHCARE框架创意视角 如果取消双向图神经网络&#xff0c;直接用医学大模型分析&#xff0c;还能做医疗保健预测领域吗&#xff1f;使用双向图…

防患未然:构建AIGC时代下开发团队应对突发技术故障与危机的全面策略

文章目录 一、快速响应与精准问题定位1. 实时监控与预警系统2. 高效的日志管理和分析3. 分布式追踪与调用链分析4. 紧急响应机制 二、建立健全的应急预案与备份机制1. 制定详尽的应急预案2. 定期应急演练3. 数据备份与快速恢复4. 冗余部署与负载均衡 三、事后总结与持续改进1. …

MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78)

las格式的文件属于标准的激光点云文件,也是最常见的点云文件,下面是读取并可视化方法 MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78) 一、LAS文件简介二、算法实现1.代码2.下载地址总结之前介绍过MATLAB自带的Las文件读取函数:(稳定,推荐使用该方法) MATLAB 读取…

第135天:内网安全-横向移动非约束委派约束委派数据库攻防

案例一: 横向移动-原理利用-非约束委派 该案例建立了解即可&#xff0c;真实环境应该不可能有人这样配置 非约束委派的原理和利用场景 原理&#xff1a; 机器 A &#xff08;域控&#xff09;访问具有非约束委派权限的机器 B 的服务&#xff0c;会把当前认证用户&#x…

【数据结构6】AVL树、AVL树的旋转-左旋和右旋、二叉搜索树的扩展应用-B树(B-Tree)、B+树

1 AVL树 2 AVL树的旋转-左旋和右旋 2.1 AVL树的旋转实现 3 二叉搜索树的扩展应用-B树 3.2 B树 1 AVL树 AVL树:AVL树是一棵自平衡的二叉搜索树。AVL树具有以下性质&#xff1a;根的左右子树的高度之差的绝对值不能超过1根的左右子树都是平衡二叉树平均情况下&#xff0c;二叉搜…

基于.net的外卖点单系统的设计与实现/基于asp.net的外卖系统

基于.net的外卖点单系统的设计与实现 摘 要 国内餐饮行业的快速发展&#xff0c;人们为了能够更加方便地管理用户点单&#xff0c;外卖点单系统被人们开发出来从而更好地方便管理用户点单&#xff0c;一个完美的外卖点单系统已经成为各个餐饮店的追求目标。 本系统asp.net利用…

ssrf攻击fastcgi复现

文章目录 环境搭建使用网页查看开始攻击 环境搭建 在/usr/local/nginx/html下新建一个php文件 phpinfo.php 1.php <?php highlight_file(__FILE__); $url $_GET[url]; $curl curl_init($url); curl_setopt($curl, CURLOPT_HEADER, 0); $responseText curl_exec($curl)…

Transformer模型中的PositionEmbedding实现:让你的NLP项目飞起来!

在自然语言处理的海洋中&#xff0c;Transformer模型如同一艘巨轮&#xff0c;承载着对文本理解和生成的无限可能。 然而&#xff0c;即使是最强大的模型&#xff0c;也需借助一些关键组件来达到其最佳性能。 其中&#xff0c;PositionEmbedding便是这样一把钥匙&#xff0c;…

BUG——GT911上电后中断一直触发

版型&#xff1a;正点原子 I.MX6UL MINI板 屏幕&#xff1a;7寸 1024*600 ATK-MD0700R V1.4 我的建议是买7寸屏幕就不要Mini板&#xff0c;因为Mini板太小装不下7寸屏幕&#xff0c;你需要一个更大的板子 简介&#xff1a; 算是作为一个后来者对这一现象的补充。解决方案就…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…

如何系统化的学习 Redis?

搭建完整的知识框架和架构体系 张无剑&#xff1a;恭喜码哥&#xff0c;恭喜靓仔&#xff0c;网络资料很多&#xff0c;但碎片化严重&#xff0c;我如何才能成为 Redis 高手&#xff0c;建立完整的知识框架&#xff1f; Redis 是广受欢迎的 NoSQL 数据库&#xff0c;唯快不破是…

class_4:条件语句和逻辑运算符

mood_index int(input("对象今天的心情怎么样&#xff01;"))if mood_index > 80:print("今天可以好好happy一下了")print("O(∩_∩)O哈哈~") else:print("今天还是乖乖的吧&#xff01;否则小命不保") #BMI 体重 /&#xff08;身…

热血传奇经典1.85原始珍藏版单机安装教程+GM+假人+无需虚拟机

今天给大家带来一款单机游戏的架设&#xff1a;热血传奇经典1.85原始珍藏版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0…

编程之路:在Bug的迷宫中寻找出口

编程是一种艺术&#xff0c;也是一种科学。它要求我们既要有创造性的思维&#xff0c;又要有严谨的逻辑。在这条充满挑战的道路上&#xff0c;每个人都会遇到挫折&#xff0c;这些挫折可能来自于一个难以解决的Bug&#xff0c;一个复杂的算法&#xff0c;或者是在实现某个功能时…

UDS诊断系列之十九 读取故障码(DTC)

一、读取符合条件的DTC数量 通过调用19服务的01子功能&#xff0c;我们可以轻松地读取符合特定条件的故障码数量。重要的是要意识到&#xff0c;此功能仅提供故障码的数量&#xff0c;而不包含任何额外的信息。这意味着&#xff0c;虽然你可以获得故障码的总数&#xff0c;但不…

【SQL】关注者数量

目录 题目 分析 代码 题目 表&#xff1a; Followers ------------------- | Column Name | Type | ------------------- | user_id | int | | follower_id | int | ------------------- (user_id, follower_id) 是这个表的主键&#xff08;具有唯一值的列的组合&am…

Global Context Vision Transformers

摘要 https://arxiv.org/pdf/2206.09959 我们提出了全局上下文视觉转换器&#xff08;GC ViT&#xff09;&#xff0c;这是一种新颖的架构&#xff0c;旨在提高计算机视觉中的参数和计算利用率。我们的方法利用全局上下文自注意力模块与标准的局部自注意力相结合&#xff0c;以…

通信协议学习:CAN总线协议

以下的学习主要是观看江科大视频后的总结&#xff0c;需要学习建议观看原视频&#xff1a;https://www.bilibili.com/video/BV1vu4m1F7Gt/?p1&spm_id_frompageDriver&vd_source0a52d160c212359f7f490eb9a868d174 CAN总线简介 CAN总线&#xff08;Controller Area Net…