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

测试开发必知必会:Pytest框架实战

off999 2025-05-21 15:46 26 浏览 0 评论

每天进步一点点,关注我们哦,每天分享测试技术文章

本文章出自【码同学软件测试】

码同学公众号:自动化软件测试

码同学抖音号:小码哥聊软件测试
应用场景:

pytest 框架可以解决我们多个测试脚本一起执行的问题。


它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittestdoctest nose,开箱即用。接下来我们详细了解下pytest框架。



01

安装和介绍



概念:

pytest 是 python 的一种单元测试框架,同自带的 Unittest 测试框架类似,相比于 Unittest 框架使用起来更简洁,效率更高


官网:https://docs.pytest.org/en/latest/

中文文档地址:https://www.osgeo.cn/pytest/

01

特点和书写规则



特点:

  • 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
  • 支持简单的单元测试和复杂的功能测试
  • 支持参数化
  • 执行测试过程中可以将某些测试跳过,或者对某些预期失败的 Case 标记成失败 支持重复执行失败的 Case
  • 支持运行由 Nose, Unittest 编写的测试 Case
  • 具有很多第三方插件,并且可以自定义扩展
  • 方便的和持续集成工具集成


安装:

通过pip命令安装指定版本

pip3 install pytest==5.4.3

pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。


使用 pytest编写用例,必须遵守以下规则:

测试文件名必须以“test”开头或者"test"结尾(如:test_ab.py)

测试方法必须以“test”开头。test*.py 或 *test.py

测试类命名以“Test”开头。用例识别:包含所有test_*的方法(测试类不能带有— init—方法)

断言使用基本的assert即可

使用 pytest 需要更改 pycharm 集成设置
Pytest 可以执行 uinttest 写的用例和方法

02

运行方式




运行方式分为两种

  • 命令行模式【建议】
  • 主函数模式

命令行模式【建议】

命令行中执行 pytest -s test_demo01.py

主函数模式

import pytest
class Test:def test_case01(self):print(1)
def test_case02(self):print(2)# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

test_demo01.py文件中增加主函数

-s 表示支持控制台打印,如果不加,print 不会出现任何内容


运行结果

  • . 表示成功
  • F 表示失败

小结:建议使用命令行的形式运行,对比主函数模式更加方便


03

setup 和 teardown




pytest 在运行自动化脚本的前后会执行两个特殊的方法,分别是 setup teardown 在执行脚本之前会执行 setup方法,在执行脚本之后会执行 teardown 方法,我们可以在 setup 中进行获取驱动对象的操作,在teardown 中进行关闭驱动对象的操作

应用场景:

函数级别方法

运行于测试方法的始末,运行一次测试函数会运行一次 setup 和teardown


示例代码

import pytestclass Test:
def setup(self):print('test--->setup')def teardown(self):print('test--->teardown')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

执行结果

示例代码

import pytestclass Test:
def setup_class(cls):print('test--->setupcls')def teardown_class(cls):print('test--->teardowncls')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

执行结果



02

Pytest-常用插件



插件列表网址: https://plugincompat.herokuapp.com包含很多插件包,大家可依据工作的需求选择 使用。



01

Pytest-html测试报告




应用场景

自动化测试脚本最终执行是通过还是不通过,需要通过测试报告进行体现


使用命令进行安装 指定版本

pip install pytest-html=2.1.1

执行命令

pytest test_login.py --html=report.html

查看报告

报告展示:


02

控制函数执行顺序




应用场景:

现实生活中,如果想下订单,必须先登录,我们可以通过插件的形式来控制函数执行的顺序 安装

使用命令 pip3 install pytest-ordering
  • 标记于被测试函数,@pytest.mark.run(order=x)
  • 根据order传入的参数来解决运行顺序
  • order值全为正数或全为负数时,运行顺序:值越小,优先级越高
  • 正数和负数同时存在:正数优先级高


示例代码

import pytest

class Test:
def test_case01(self):print('test--->001')
@pytest.mark.run(order=2)def test_case02(self):print('test--->002')
@pytest.mark.run(order=1)def test_case03(self):print('test--->003')

执行结果


03

失败重试



免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦

应用场景:

由于网络的原因造成自动化脚本报错,我们可以使用失败重试的插件,当失败后尝试再次运行,一般情况最终成功可以视为成功,但最好进行进行排查时候是脚本问题

使用命令pip3install pytest-rerunfailures 进行安装使用

在配置文件中的命令行参数中增加 -- reruns n

pytest  -s test_demo2.py --reruns 3

示例代码

class Test:
def test_a(self):assert 1,1 # 断言成功
def test_b(self):print('失败')assert 0,1 # 断言失败

运行结果


R 表示重试

注意重试时,如果脚本通过,那么后续不再重试



03

pytest高级用法



01

跳过测试函数



应用场景:

同一个软件在不同的设备上可能会有不同的效果,比如,iOS 的 3d touch 操作是需要 6s 以上设备支持 的,6 和 6s 都可以安装同一款应用,如果设备不支持,那么根本没有必要去测试这个功能。此时,我们可以 让这种函数进行跳过


使用方式:

在需要跳过的测试脚本之上加上装饰器 @pytest.mark.skipif(condition, reason="xxx")

condition

reason

跳过的条件,必传参数

标注原因,必传参数

示例代码:

class Test:
def test_a(self):assert 1,1 # 断言成功@pytest.mark.skipif(condition=True,reason='x')def test_b(self):print('失败')assert 0,1 # 断言失败

执行结果


02

预期失败




应用场景:

举例,测试手机号码输入框长度为11位数字,如果我们传入一个 12 位数字,此时可以使用预期失败


@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
  • condition 跳过条件,必填参数
  • reason 标注原因,必填参数


使用方式:

在需要标记预期失败的测试脚本之上加上装饰器示例

示例代码:

class Test:
def test_a(self):print('-----testa')assert 1,1 # 断言成功
@pytest.mark.xfail(condition=True,reason='x')def test_b(self):print('-----testb')assert 0,1 # 断言失败
@pytest.mark.xfail(condition=True, reason='x')def test_c(self):print('-----testc')assert 0, 2  # 断言失败

执行结果:

x 表示预期失败结果失败 不算是bug,X 表示预期失败结果成功 算是bug


03

数据参数化




应用场景:

登录功能都是输入用户名,输入密码,点击登录。但登录的用户名和密码如果想测试多个值是没有办法 用普通的操作 实现的。数据参数化可以帮我实现这样的效果。


方法名:

@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
  • argnames 参数名
  • argvalues 参数对应值,类型必须为可迭代类型,一般使用list


一个参数使用方式

  • argnames 为字符串类型,根据需求决定何时的参数名
  • argvalues 为列表类型,根据需求决定列表元素中的内容
  • 在测试脚本中,参数,名字与 argnames 保持一致
  • 在测试脚本中正常使用

argvalues 列表有多少个内容,这个脚本就会运行几次


示例代码:

class Test:
@pytest.mark.parametrize('age',[18,19,23,21])def test_01(self,age):print(age)

执行结果:

多个参数:

class Test:
@pytest.mark.parametrize(('name','age'),[('zhangsan',18),('lisi',19)]) def test_01(self,name,age):print(name,age)

执行结果:


04

Pytest-fixture




应用场景:

fixture 修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作


使用方式:

  • 通过函数引用

示例代码:

class Testlogin:
@pytest.fixture()def test_login(self):print('登录操作')uname = 'lily'return uname
def test_a(self,test_login):print(f'test_a {test_login}')
def test_b(self):print('不需要登录操作')

运行结果:

免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关推荐

阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?

TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...

高流量大并发Linux TCP性能调优_linux 高并发网络编程

其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...

性能测试100集(12)性能指标资源使用率

在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...

Linux 服务器常见的性能调优_linux高性能服务端编程

一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...

Nginx性能优化实战:手把手教你提升10倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...

高并发场景下,Spring Cloud Gateway如何抗住百万QPS?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...

Kubernetes 高并发处理实战(可落地案例 + 源码)

目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...

高并发场景下,Nginx如何扛住千万级请求?

Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

Docker-基础操作_docker基础实战教程二

一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...

你有空吗?跟我一起搭个服务器好不好?

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...

部署你自己的 SaaS_saas如何部署

部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...

Docker Compose_dockercompose安装

DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...

Kubernetes (k8s) 入门学习指南_k8s kubeproxy

Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: