pytest+allure

news2024/11/24 11:46:37

知识点1:

1、测试结果信息阅读

  • passed表示通过,有个简写.

  • failed表示失败,有个简写F

2、命令行参数

  • -h:帮助

  • -version:版本信息

3、测试用例命名规则:

  • 测试函数必须以test开头

  • 测试类必须以Test开头,但测试类不能有init方法

  • 测试文件必须以test/Test开头,或者test/Test结尾

4、运行指定的测试用例:指定文件[::类名][::函数名]

  • 用例搜索的规则默认是pytest执行当前目录及子目录(遍历)

  • 指定类名运行:pytest 文件名::类名

  • 指定函数名运行:pytest 文件名::类名::函数名

  • 指定函数名运行:pytest 文件名::函数名

  • 指定目录下的文件运行:pytest 目录名\文件名::函数名

  • pytest .\test_a02\test_a02_a.py::test_001 (test_a02_a.py文件下的test_001 类;终端)

5、pytest.main()执行用例

  • 命令行参数args,列表类型,一个或多个str组成,逗号分隔
import pytest


def test_a01():
    assert 1 == 1


if __name__ == '__main__':  # 运行测试的话,需要在pycharm中设置python集成工具=>unittest
    # pytest.main()  # 等价于pytest命令
    # pytest.main([__file__])  # 测试当前文件
    # pytest.main(['--version'])
    pytest.main['-sv', __file__]  # 多参数调用

6、运行指定测试用例——k参数

  • 匹配测试类或测试方法的名字部分

  • 大小写敏感

  • 逻辑运算

表达式说明
-k login测试类名或函数名中包含login的用例
-k not login不包含login的
-k login and success包含login且包含success的
-k login or success包含login或success的
-k login and not success包含login且不包含success的
import pytest


def test_login_success():
    pass


def test_login_failed():
    pass


def test_logout_success():
    pass


def test_logout_failed():
    pass


if __name__ == '__main__':
    pytest.main(['-k success and not failed', '--collect-only', __file__])  # –collect-only 含义:展示给定配置下哪些测试用例会被运行

在这里插入图片描述

7、pytest.mark.skip/skipif

  • 有条件的忽略skipif
import pytest, sys


@pytest.mark.skipif(1 == 1, reason='if 1==1 skip this')  # 条件满足就忽略测试  reason:标注原因
def test_a01_1(reason='i wanna skip this case'):
    pass


@pytest.mark.skipif(1 == 2, reason='if 1==2 skip this')  # 条件不满足不会跳过
def test_a01_2():
    pass


@pytest.mark.skipif(sys.platform == 'linux', reason='if linux skip this')  # sys.platform 操作系统平台标识
def test_a01_3():
    pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

  • 输出结果s
import pytest


@pytest.mark.skip
def test_a01_1(reason='i wanna skip this case'):
    pass


def test_a01_2():
    pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])
    # pytest.main(['--collect-only', __file__])  # 能被采集
    # pytest.main([__file__])  # 输出s

在这里插入图片描述

import pytest

pytestmark = pytest.mark.skip('skip all cases')  # pytestmark 这个名字不可更改


def test_a01_1():
    pass


def test_a01_2():
    pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

import pytest


def test_a01_1():
    arrow = pytest.importorskip('arrow')  # 这个库在当前环境下没有的话会报错,有会自动导入
    nowtime = arrow.now().format('YYYY-MM-DD')  # 获取当前时间
    print(nowtime)


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

8、pytest.mark.parameterize参数化

  • 当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登录,我们需要模拟各种千奇百怪的账号密码。当然,我们可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败,测试也就终止了。通过异常捕获,我们可以保证所有参数完整执行,但要分析测试结果就需要做不少额外的工作

  • 在pytest中,我们有更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。使用的工具就是 pytest.mark.parametrize(argnames, argvalues)

  • 分析parameterize的源码,能看到调用时要用到的参数

参数含义
argnames必选,参数名,逗号分隔的字符串,表示一个或多个参数名字,也可以是字符串组成的列表或元组
argvalues必选,参数值列表
indirect为True时,argnames一定是一个fixture的函数名称,argvalues的值传入对应的fixture内,相当于@pytest.fixture(params=)的做法,默认为False
ids用例id,标记子用例执行名称,与argvalues数量一致,未指定则自动生成,默认为None
scope作用范围,类似于fixture中的scope参数,表示参数的范围,范围用于按参数实例对测试进行分组。它将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围

参数匹配,argnames跟测试函数的参数必须一致否则会报错

import pytest


@pytest.mark.parametrize('arg0', [0, 1])  # (0, 1)   '01' 不推荐用
def test_a01_1(arg0):
    print(arg0)


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

多个参数

import pytest


@pytest.mark.parametrize('arg0, arg1', [(0, 1), (2, 2), (3, 4)])  # argvalues 往往是通过其他程序读取到
def test_a01_1(arg0, arg1):
    print(f'arg0 is {arg0},arg1 is {arg1}')
    assert arg0 == arg1


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

多个装饰器

import pytest


@pytest.mark.parametrize('arg0', [1, 2, 3])  # 多装饰器 笛卡尔积的效果 两两相乘
@pytest.mark.parametrize('arg1', [4, 5, 6])
def test_a01_1(arg0, arg1):
    print(f'arg0 is {arg0},arg1 is {arg1}')


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

ids参数的作用

import pytest


def login(username, password):
    data = {'allen': '12', 'smith': '34', 'ford': '56'}
    if data.get(username) == password:
        return 'success'
    else:
        return 'failed'


@pytest.mark.parametrize('username, password, expect', [('allen', '12', 'success'), ('smith', '344', 'failed')],
                         ids=['login success', 'login failed'])
def test_a01_1(username, password, expect):
    assert login(username, password) == expect


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

9、setup和teardown(不常用,有更好的)

  • setup往往指测试用例中的配置部分(预置条件),teardown则对应销毁部分(环境拆除)

  • PyTest支持xUnit style结构,setup()和teardown()方法用于初始化和清理测试环境,可以保证测试用例的独立性

方法作用域说明
setup_function/teardown_function函数function每个函数都使用一次(类中的函数叫方法不记在内)
setup_class/teardown_class类class需要在类中定义,一个类运行一次
setup_module/teardown_function模块(一个py文件)一个模块运行一次
setup_method/teardown_method方法(类中函数)一个方法运行一次
setup/teardown方法(类中函数)一个方法运行一次
import pytest


def setup_function():
    print('\n函数前执行 setup')

    
def teardown_function():
    print('\n函数后执行 teardown')


def test_a01_1():
    pass


def test_a01_2():
    pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

import pytest


class Test_all():
    def setup_class(self):
        print('\n方法前执行 setup')

    def teardown_class(self):
        print('\n方法后执行 teardown')

    def test_a01_1(self):  # method 方法不叫函数
        pass

    def test_a01_2(self):
        pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

import pytest


def test_a01_3():
    pass


def setup_module():
    print('\n模块前执行 setup')


def teardown_module():
    print('\n模块后执行 teardown')


class Test_all():
    def test_a01_1(self):  # method 方法不叫函数
        pass

    def test_a01_2(self):
        pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

在这里插入图片描述

import pytest


class Test_all():
    def setup_method(self):
        print('\n方法前执行 setup01')

    def teardown_method(self):
        print('\n方法后执行 teardown01')

    def setup(self):
        print('\n方法前执行 setup02')

    def teardown(self):
        print('\n方法后执行 teardown02')

    def test_a01_1(self):  # method 方法不叫函数
        pass

    def test_a01_2(self):
        pass


if __name__ == '__main__':
    pytest.main(['-sv', __file__])

10、pytest-base-url插件

import pytest, requests


def test_a01_1(base_url):  # 当作为fixture使用的时候是base_url,安装的是pytest-base-url
    resp = requests.get(base_url)
    assert resp.status_code == 200


if __name__ == '__main__':
    pytest.main(['-sv', '--base-url', 'https://www.baidu.com', __file__])
    # pytest.main(['-sv', __file__])  # 使用配置文件执行,本级目录下新建pytest.init文件,新增一行 base_url = https://www.baidu.com

在这里插入图片描述

11、pytest-repeat插件

import pytest


@pytest.mark.repeat(3)
def test_a01_1():
    print('01 testing')
    assert 1 == 1


if __name__ == '__main__':
    pytest.main(['-sv', __file__])
import pytest


def test_a01_1():
    print('01 testing')
    assert 1 == 1


if __name__ == '__main__':
    pytest.main(['-sv','--count=3', __file__])

在这里插入图片描述

import pytest


def test_a01_A1():
    print('A1 testing')
    assert True


def test_a01_A2():
    print('A2 testing')
    assert True


def test_a01_B1():
    print('B1 testing')
    assert True


def test_a01_B2():
    print('B2 testing')
    assert True


if __name__ == '__main__':
    pytest.main(['-sv', '--count=2', '--repeat-scope=session', __file__])  # session/module/class都是1212的顺序

在这里插入图片描述

12、allure生成报告

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

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

相关文章

我为开放原子全球开源峰会助力:共建开源之梦

我为开放原子全球开源峰会助力:共建开源之梦 6月11日,以“开源赋能,普惠未来”为主题的2023开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。 开源的力量与魅力 开源是当今软件行业中不可忽视的力量,它为技术的快速发展和…

入职滴滴和字节的2 年里,我感觉忒真实了……

引言 先简单交代一下背景吧,某不知名985的本硕,17年毕业加入滴滴,之后跳槽到了头条,一直从事软件测试相关的工作。之前没有实习经历,算是两年半的工作经验吧。 这两年半之间完成了一次晋升,换了一家公司&…

Ubuntu如何安装vmtools?

虚拟机-安装VMware Tools 然后在Ubuntu中找到设备中的VMware Tools,将这个文件来复制到桌面上去。 选择提取到此处 可以看到桌面上多了一个VMware Tools的文件夹 使用cd命令进入桌面上的这个VMware tools的文件夹 使用sudo ./安装命令 对vmware-tools-distrib文件夹…

政企市场,「观望」AI大模型

数据安全等“刚需”下,私有化成为政企市场的准入门槛,然而私有化下,行业模型局限性尚未可知,加之信创化等因素,厂商仍需取长补短,为政企客户提供全方位的解决方案。 作者|斗斗 编辑|皮爷 出品|产业家 政…

采用UWB定位技术开发的室内定位系统源码

UWB精准定位系统源码 UWB是什么? UWB(Ultra Wideband)超宽带技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,实现精准定位。 技术…

一名高水平的程序员,为什么面试总是失败?

目录 场景1 场景2 场景3 1 从发现和分析问题方面准备。 2 从linux命令和日志层面分析问题的步骤。 1 事先准备很重要 2 面试开始是自我介绍,这时要表露出,自己解决过redis,dubbo等组件的线上问题 3 一旦开始说第一个组件层面解决过的问题时&…

Django高级扩展之文件上传

文件上传是一个比较常用的网站功能,在服务器端,Django会使用一个叫作request.FILES的对象来处理上传的文件。 目录 存储路径 创建存储目录 配置settings.py 上传单文件 配置url 上传文件模板 视图方法 显示上传页面 上传文件处理 上传效果 1.…

盘点五种最常见加密算法!

大家好,我是Martin。 今天,就给大家来盘点一下最常见的5种加密算法。 大家平时的工作中,可能也在很多地方用到了加密、解密,比如: 用户的密码不能明文存储,要存储加密后的密文 用户的银行卡号、身份证号…

2024年天津农学院专升本专业课参考书目

天津农学院2024年高职升本科拟招生专业参考书目 天津农学院专升本专业课参考教材(我校不提供专业课参考教材) 人力资源管理专业参考教材: 1、《人力资源管理实用教程》 (第2版),吴宝华,北京大学出版社 2、《人力资源…

运维(SRE)成长之路-第3天 文本处理三剑客之 grep

1.命令作用以及参数详解 grep: 全局搜索正则表达式并打印行(Global search REgular expression and Print out the line)作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行模式:由正则表达式字…

GitHub Copilot 最全安装、使用

GitHub Copilot 最全安装、使用教程 一、温馨提示 GitHub Copilot 目前为止可以免费试用一个月,但是试用的前提是必须要绑定银行卡,因为后续会自动扣费,所以请注意试用结束日期,自己定好闹钟关闭订阅。 订阅价格为每月10美刀&a…

【Pinia 状态管理篇】Vite + Vue3 组合式 API 模式下的 Store 数据处理

文章目录 Pinia 状态管理一、 Pinia 安装与使用1.1 安装1.2 注册 pinia 实例到全局1.3 创建一个 Store1.4 组件内使用 Store 二、Pinia 核心概念展开学习Store 的定义和使用2.1 State2.2 Getter2.3 Action 附:1. 什么是魔法字符串? Pinia 状态管理 一、 …

Nacos配置中心使用(Spring Cloud版)

目标 向项目中集成Nacos配置。原项目是一个SpringBoot项目。这里假设我们无法修改原有项目的SpringBoot版本。 注意 在不动SpringBoot版本的前提下,根据SpringBoot的版本,确定Spring Cloud和Nacos版本。Nacos版本其实就是Spring Cloud Alibaba版本。在…

【Linux】网络结构模式

目录 网络结构模式C/S结构B/S结构 MAC地址IP地址端口网络模型OSI七层模型TCP/IP四层模型 通信过程数据包封装协议以太网协议ARP协议IP数据报格式UDP协议格式TCP协议格式封装分用TCP详解TCP和UDPTCP通信流程TCP三次握手 网络结构模式 C/S结构 客户机-服务器(client-server)结构…

uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理

uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理 uboot开发,要想读取adc在哪个时间点读取以及如何传给cmdline,需要清楚2点, uboot启动得大致流程及相关启动功能,uboot各个硬件模块得接…

主机安全各个方面应该怎么做?

主机安全是指保护主机系统不受恶意攻击和未经授权访问的威胁,以保证系统的稳定性、可用性和数据的安全性。 以下是主机安全涉及的几个方面做法: 1. 操作系统安全:安装操作系统时需要选择合适的版本,及时打补丁更新,配置…

入职Linux驱动工程师后,我才知道的真相…

大家好,我是ST。 做Linux驱动工程师也有一段时间了,今天分享一下我曾经入职才知道的一些事情,算是一个菜鸟的经历吧! 设备树 起初学习Linux驱动,是从最简单的一个.c文件开始。 在.c中实现module_init和module_exit这…

大模型入门(三)—— 大模型的训练方法

参考hugging face的文档介绍:https://huggingface.co/docs/transformers/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism,以下介绍聚焦在pytorch的实现上。 随着现在的模型越来越大,训练数据越来越多时&…

基于Ubuntu22.10系统安装部署webmin软件

Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具。有了这个工具的帮助,我们可以管理内部的系统配置,诸如设置用户账户,磁盘配额,像Apache, DNS, PHP, MySQL,文件共享的服务等。 本文描述在ubuntu22.…

VS+C#+WPF多线程视频摄像头播放器监控

程序示例精选 C#WPF多线程视频摄像头播放器监控 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C#WPF多线程视频摄像头播放器监控>>编写代码&#xff0c;代码整洁&#xff0c;规…