python中pytest库用法详解

news2024/10/6 8:33:26

Pytest 是用于测试 Python 应用的 Python 库。

官方文档:Full pytest documentation — pytest documentation

安装:

pip install pytest

pytest 测试发现约定规范

        如果未指定任何参数,则在testpaths(如果已配置)或当前目录中的位置搜索测试文件。 另外,命令行参数可以在目录,文件名或节点 ID 的任何组合中使用。

        pytest 在所选目录中查找test_*.py或*_test.py文件。所有的单测文件名都需要满足test_*.py格式或*_test.py格式。

        在选定的文件中,pytest 在类之外查找带前缀的测试函数,并在带前缀的测试类中查找带前缀的测试方法(无__init__()方法)。

        在单测文件中,测试类以Test开头,并且不能带有 __init__ 方法。注意:定义class时,需要以大写T开头。

        在单测类中,可以包含一个或多个test_开头的函数。

        注意:测试函数名必须要以test开头。

命令中参数:

指令含义指令
用于详细显示日志信息-v
测试结果的简单统计-rA
只显示整体测试结果-q
帮助-h
显示print打印信息-s
输出html格式报告–html=path输出路径
生成log报告–resultlog=./log.txt (6.1 版本之后被删除)
生成xml报告–junitxml=./log.xml
当错误达到num时,停止测试–maxfail=num
只运行有MARKEXPR(自定义)标记的测试-m MARKEXPR
生成简略的指定需求的报告-r option

运行 pytest

 max_min_func.py

def max_value(values):
    _max = values[0]

    for val in values:
        if val > _max:
            _max = val
    return _max


def min_value(values):
    _min = values[0]

    for val in values:
        if val < _min:
            _min = val
    return _min

max_min_test.py

import max_min_func


def test_min():
    values = [3, 5, 8, 1, 9, 2]
    val = max_min_func.min_value(values)
    assert val == 1


def test_max():
    values = [3, 5, 8, 1, 9, 2]
    val = max_min_func.max_value(values)
    assert val == 9


test_min()

        pytest 不带任何参数,将查看当前工作目录(或其他一些预配置的目录)以及测试文件的所有子目录,并运行找到的测试代码。

运行当前目录中的所有测试文件。

pytest

通过指定名称作为参数来运行特定的测试文件。 

pytest max_min_test.py

通过在::字符后提供其名称来运行特定功能。

pytest max_min_test.py::test_max

将上述max_min_test.py中test_max()函数的asset val == 9 改为val == 8,再执行测试代码:

Pytest 跳过

        使用跳过装饰器,可以跳过指定的测试。 跳过测试有多种原因。 例如,数据库/在线服务目前不可用,或者跳过了 Windows 上针对 Linux 的特定测试。

将上面max_min_test.py代码改写如下:

import max_min_func
import pytest


@pytest.mark.skip
def test_min():
    values = [3, 5, 8, 1, 9, 2]
    val = max_min_func.min_value(values)
    assert val == 1


def test_max():
    values = [3, 5, 8, 1, 9, 2]
    val = max_min_func.max_value(values)
    assert val == 9


test_min()

pytest 标记

        使用标记将测试组织为单元。标记可用于对测试进行分组。 然后使用pytest -m运行一组标记的测试。

marking.py

import pytest


@pytest.mark.a
def test_a1():
    assert (1) == (1)


@pytest.mark.a
def test_a2():
    assert (1, 2) == (2, 1)


@pytest.mark.a
def test_a3():
    assert (1, 2, 3) == (1, 2, 3)


@pytest.mark.b
def test_b1():
    assert "falcon" == "fal" + "con"


@pytest.mark.b
def test_b2():
    assert "falcon" == f"fal{'con'}"

Pytest 参数化测试

        通过参数化测试,可以向断言中添加多个值。 使用@pytest.mark.parametrize标记。

param_test.py

import max_min_func
import pytest


@pytest.mark.parametrize("data, expected", [((2, 3, 1, 4, 6), 1),
                                            ((5, -2, 0, 9, 12), -2), ((200, 100, 0, 300, 400), 0)])
def test_min(data, expected):
    val = max_min_func.min_value(data)
    assert val == expected


@pytest.mark.parametrize("data, expected", [((2, 3, 1, 4, 6), 6),
                                            ((5, -2, 0, 9, 12), 12), ((200, 100, 0, 300, 400), 400)])
def test_max(data, expected):
    val = max_min_func.max_value(data)
    assert val == expected

pytest 夹具

        测试需要在一组已知对象的背景下进行。 这组对象称为测试夹具。

func_test.py

def max_value(values):
    _max = values[0]

    for val in values:
        if val > _max:
            _max = val
    return _max


def min_value(values):
    _min = values[0]

    for val in values:
        if val < _min:
            _min = val
    return _min


def list_sort(data):
    if not isinstance(data, list):
        vals = list(data)
    else:
        vals = data

    size = len(vals)
    for i in range(0, size):
        for j in range(i + 1, size):
            if vals[j] < vals[i]:
                _min = vals[j]
                vals[j] = vals[i]
                vals[i] = _min
    return vals


if __name__ == '__main__':
    aa = list_sort([5, 6, 1, 8])
    print(aa)

fix_test.py

import func_test
import pytest


@pytest.fixture
def data():
    return [4, 6, 5, 7, 2, 3, 9, 11, -3]


def test_sort(data):
    sort_val = func_test.list_sort(data)
    assert sort_val == sorted(data)

Pytest 布局

        Python 测试可以多种方式组织。 测试可以集成在 Python 包中,也可以放在包外。

外部测试

内部测试

函数数据参数化

方便测试函数对参数的调用:

@pytest.mark.parametrize(argnames,argvalues, indirect=False, ids=None, scope=None)
argnames:参数名
argvalues:参数对应值,可传多个值,类型必须为list [(values1,values2,…),(value1,value2,…)]

pytest 会将定义好的参数列表逐个填入到参数位置中执行代码,有多少个执行多少遍

import pytest

'''
parametrize
'''


class TestFunc(object):
    def setup_class(self):
        print("---------setup_class----------")

    def teardown_class(self):
        print("------------teardown_class-------------")

    # 传递单参数
    @pytest.mark.parametrize("a", [3, 6])
    def test_1(self, a):
        print("a = %d" % a)
        assert a % 3 == 0

    # 传递多参数
    @pytest.mark.parametrize('a,b', [(0, 3), [1, 2]])
    def test_2(self, a, b):
        print("%d + %d = %d" % (a, b, a + b))
        assert a + b == 3


if __name__ == "__main__":
    pytest.main(['-s', '-v', 'parametrize_test.py::TestFunc::test_1'])
    pytest.main(['-s', '-v', 'parametrize_test.py::TestFunc::test_2'])

多进程运行CASE

        当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。

安装pytest-xdist:

pip install -U pytest-xdist

运行方法:

pytest test_se.py -n NUM

其中NUM填写并发的进程数。

生成HTML报告

安装pytest-html:

pip install pytest-html

使用时直接在命令行pytest命令后面加--html=<文件名字或者路径>.html参数就可以了。

pytest max_min_test.py --html=report.html

        上面生成的报告包括html和一个assets文件(里面是报告CSS样式),如果要合成一个文件可以添加下面的参数。

pytest max_min_test.py --html=report.html --self-contained-html

生成XML报告

pytest --junitxml=report.xml

参考博文:

Python Pytest 教程|极客教程

Python 测试框架 pytest —— 使用教程 - 又见苍岚

pytest使用总结笔记 - fengf233 - 博客园

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

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

相关文章

智慧水利数字孪生案例分享:数字孪生水利,助力三峡科学防洪防汛

长江是我国第一大河流&#xff0c;长江流域在我国经济发展中&#xff0c;占据举足轻重的地位。与此同时&#xff0c;长江流域频繁的洪涝、气象灾害&#xff0c;严重影响危害着流域内经济社会发展和生态环境&#xff0c;因此长江流域防汛管理被作为我国防洪体系中的关键工程。水…

阿里大咖纯手写的微服务入门笔记,从基础到进阶直接封神

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的…

通讯/服务器公司 测试|测试开发 面试真题|面经 汇总

浪潮 测试开发 一面 8.24 三个面试官。一个HR&#xff0c;两个技术官。 1 为什么选择测开&#xff1f;意向工作地点。 2 软件质量模型 3 测试要做哪些测试 4 集成测试和验收测试的区别&#xff1f; 5 黑盒测试和白盒测试的理解 6 知道哪些黑盒测试和白盒测试的方法 7 手工测试…

【观察】“中国算力网”向全社会开放,意味着什么?

今天&#xff0c;算力的重要性已被提升到全新的高度&#xff0c;这是因为算力作为数字经济时代新的生产力&#xff0c;对推动科技进步、行业数字化转型以及经济社会发展都发挥着至关重要的作用。根据中国信通院发布《中国算力发展指数白皮书&#xff08;2022年&#xff09;》显…

AE插件:流体渐变着色特效动画生成 Potok mac

Potok是After Effects的流体渐变插件。它会产生噪波并使用渐变对其进行着色。可以从UI Gradient Control或任何图层设置渐变。噪波可以用任何层掩盖。 Noise噪波&#xff1a;Potok 插件有一个内置的噪音发生器&#xff0c;有四种噪音类型。噪声动画可以无缝循环。此外&#xf…

ASM3142 USB 3.1控制芯片_ ASM3242 USB 3.2 2x2 控制器

一、ASM3142 USB 3.1控制芯片 ASM3142 USB 3.1控制芯片将成为通过USB进行快速数据传输的新标准。是全球最快的USB解决方案&#xff0c; 可提高性能并实现更高的功效&#xff0c;节省高达50&#xff05;的功耗。 与ASM 2142 USB控制芯片相比&#xff0c;新的ASM 3142超高速USB控…

pandas数据分析:pandas基础函数入门教程【w3school学习笔记】

系列文章目录 pandas数据分析&#xff1a;十分钟快速入门重点函数速查 文章目录系列文章目录前言一、Pandas作用二、数据结构2.1 Series2.2 DataFrame三、读取数据3.1 读取CSV文件数据3.2 读取JSON文件数据四、分析数据五、清洗数据5.1 空值5.1.1 删除包含空值的行5.1.2 填充空…

微信群发工具,纯Python编写~

前言 接到了一个需求&#xff1a;现微信有8000好友&#xff0c;需要给所有好友发送一则一样的消息。网上搜索一番后&#xff0c;发现uiautomation 可以解决该需求&#xff0c;遂有此文。这是第五篇&#xff0c;也是最后一篇。 正如上面所见&#xff0c;这是uiautomition 微信群…

web前端期末大作业——网页制作基础大二dw作业——动画漫展学习资料电影模板(6页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

「MySQL高级篇」MySQL存储引擎

本篇速览 早在MySQL基础篇的学习中&#xff0c;我们就一直看到innodb这个存储引擎&#xff0c;但是好像对于其他的存储引擎也没有去学习和了解&#xff0c;而innodb有何种特点也不得而知&#xff0c;而本篇将从一下四点&#xff0c;带你逐一攻破Ta&#xff1a; 1️⃣首先系统地…

golang 使用 make 创建 map 是否需要指定长度

大家都知道可以使用make方法来创建map类型&#xff0c;对比创建 slice 类型&#xff0c;创建map是否也需要指定len和cap两个参数呢&#xff1f; 如果map要容纳的数据比较多&#xff0c;其实是需要指定len属性的&#xff0c;我们可以从创建map的源码中了解到&#xff08;本文都…

kubernetes(K8S)学习笔记P5:K8s核心概念2

kubernetes&#xff08;K8S&#xff09;学习笔记P4&#xff1a;K8s核心概念2-Helm、持久化存储技术5.Helm5.1Helm 引入5.2Helm 介绍5.3Helm v3 变化5.4安装与仓库配置5.4.1部署 helm 客户端5.4.2配置国内 chart 仓库&#xff08;helm换源&#xff09;5.5Helm快速部署5.5.1基本命…

前端面试题记录——vue

目录 前言 一、说一下虚拟DOM&#xff1f; 1.虚拟dom是什么&#xff1f; 2.虚拟dom是怎么产生的&#xff1f; 3.虚拟dom的优点 二、说一下vue-router?有几种模式&#xff1f; 1.vue-router是什么&#xff1f; 2.vue-router有几种模式&#xff1f;区别是什么&#xff1…

Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解

在电脑Bios设置中&#xff0c;有一项“Secure Boot”相关设置&#xff0c;很多小伙伴们不知道Secure Boot什么意思&#xff0c;也不知道如何设置。另外&#xff0c;有时候这个Secure Boot是灰色的无法更改&#xff0c;这又要如何解决呢&#xff1f;下面本文就来谈谈Secure Boot…

mybatis-plus使用generator快速生成代码,并手动添加数据库命令

mybatis-plus是mybatis的增强版&#xff0c;可以根据数据库自动生成代码&#xff0c;实现常用的增删改查功能&#xff0c;也可以按照mybatis的配置方式添加数据库命令。 参考地址&#xff1a; generator: 文档 http://baomidou.com/ 代码生成器配置新 | MyBatis-Plus 1、在p…

通过SASRec算法进行基于Transformer的商品推荐

案例简介 (1)方法概述: 本教程包含如下内容: 从原始的数据文件中加载数据,进行训练集和测试集的切分,并对测试集进行负采样。 对数据分batch, 利用用户历史点击记录进行模型训练 结果展示 (2)宏观流程图 2.准备工作 (1) 对应库的安装(以下是运行环境) tqdm==4.51.0 nump…

Java#25(常见算法: 查找算法)

目录 一.基本查找/顺序查找 从0索引开始挨个往后找 二.折半查找/二分查找 条件: 数组中的数据必须是有序的 核心逻辑: 每次排查一半的查找范围 优势: 提高查找效率 三.分块查找 分块查找的原则1: 前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序) 分块查…

1000套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作【建议收藏】

一、1000套HTML期末学生结课大作业作品(HTMLCSSJS) 这8年来做了1000多套(HTMLCSSJS)网页设计的学生期末大作业&#xff0c;都是给学生定制的都符合学校或者学生考试期末作业的水平&#xff0c;都是divcss框架原创代码写的&#xff0c;有的有js&#xff0c;有的视频音乐flash的…

谷粒学苑_第十天

第十天 视频删除 后端 相关sdk在阿里云视频点播文档的服务端SDK–>Java SDK–>媒资管理–>删除视频 复制前面的InitObject到utils里 删除的方法 DeleteMapping("{id}")public R removeAliyunVideo(PathVariable String id){try{DefaultAcsClient defau…

parallelStream/ForkJoinPool 详解

parallelStream parallelStream是一种并行流, 意为处理任务时并行处理。 parallelStream底层使用的是ForkJoinPool。ForkJoinPool是一种工作窃取算法线程池&#xff0c;和分治法的概念一致&#xff0c;可以充分利用多 CPU 的优势&#xff0c;把一个任务拆分成多个"小任务…