Pytest 使用简介

前言

  最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 >robotframework 。

  pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法。

一、安装

首先使用 pip 安装 pytest

pip3 install pytest

查看 pytest 是否安装成功

pip3 show pytest

二、简单使用

1.创建 test_sample.py 文件,代码如下:

#!/usr/bin/env python
# coding=utf-8
import pytest

def inc(x):
    return x + 1

def test_answer():
    assert inc(3) == 5

if __name__ =="__main__":
    pytest.main()

执行结果:

test_sample.py F [100%]

================================== FAILURES ===================================
_________________________________ test_answer _________________________________

def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3)

test_sample.py:19: AssertionError
============================== 1 failed in 0.41s ==============================

从上面的例子可以看出,pytest 中断言的用法直接使用 assert ,和 unittest 中断言 self.assert 用法有所区别。

2.总结一下:使用 pytest 执行测试需要遵行的规则:

  • .py 测试文件必须以test_开头(或者以_test结尾)
  • 测试类必须以Test开头,并且不能有 init 方法
  • 测试方法必须以test_开头
  • 断言必须使用 assert

三、fixture

pytest 提供的 fixture 实现 unittest 中 setup/teardown 功能,可以在每次执行case之前初始化数据。不同点是,fixture 可以只在执行某几个特定 case 前运行,只需要在运行 case 前调用即可。比 setup/teardown 使用起来更灵活。

1.fixture scope 作用范围

先看下 fixture 函数的定义:

def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """
    :arg scope:    可选四组参数:function(默认)、calss、module、package/session
    :arg params:   一个可选的参数列表,它将导致多个参数调用fixture函数和所有测试使用它。
    :arg autouse:  如果为True,则fixture func将为所有测试激活可以看到它。如果为False(默认值),则需要显式激活fixture。
    :arg ids:      每个参数对应的字符串id列表,因此它们是测试id的一部分。如果没有提供id,它们将从参数中自动生成。
    :arg name:     fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')”。
  """

重点说下 scope 四组参数的意义:

  • function:每个方法(函数)都会执行一次。
  • class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
  • module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
  • package/session:多个文件调用一次,可以跨 .py 文件。

在所需要调用的函数前面加个装饰器 @pytest.fixture()。举一个简单的例子:

#!/usr/bin/env python
# coding=utf-8
import pytest

@pytest.fixture(scope='function')
def login():
    print("登录")

def test_1():
    print('测试用例1')

def test_2(login):
    print('测试用例2')

if __name__ =="__main__":
    pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.

============================== 2 passed in 0.07s ==============================

2.yield

我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要 清除数据(或还原)操作,可以使用 yield 来实现。

#!/usr/bin/env python
# coding=utf-8
import pytest

@pytest.fixture(scope='function')
def login():
    print("登录")
    yield
    print("注销登录")

def test_1():
    print('测试用例1')

def test_2(login):
    print('测试用例2')

if __name__ =="__main__":
    pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.注销登录

============================== 2 passed in 0.08s ==============================

3.conftest

上面的案例都是写在同一个.py 文件内的。倘若有多个.py 文件需要调用 login() 方法,就必须把 login() 方法写在外面,这里引用了conftest.py 配置文件。test_xxx.py 测试文件中无需 import conftest,pytest 会自动搜索同级目录中的 conftest.py 文件。

conftest.py 与 测试文件 目录层级关系

# 新建conftest.py,和 test_sample.py 同级目录
import pytest

@pytest.fixture(scope='function')
def login():
    print("登录")

# test_sample.py 代码如下
import pytest

def test_1():
    print('测试用例1')

def test_2(login):
    print('测试用例2')

if __name__ =="__main__":
    pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.

============================== 2 passed in 0.01s ==============================

四、重试机制

有的时候用例执行失败了,然后排查发现不是代码问题,可能和环境或者网络不稳定有关系,这个时候可以引入重试机制,排除一些外在因素。

1、安装pytest-rerunfailures

pip3showpytest-rerunfailures

2、重试的两种方法

1)使用装饰器@pytest.mark.flaky(reruns=5,reruns_delay=2)

reruns :最大重试次数

reruns_delay :重试间隔时间,单位是秒

#!/usr/bin/env python
# coding=utf-8
import pytest

@pytest.mark.flaky(reruns=5, reruns_delay=2)
def test():
    assert 0==1

if __name__ =="__main__":
    pytest.main(['test_sample.py','-s'])

R表示用例失败后正在重试,尝试5次。

2)也可以使用命令行pytest--reruns5--reruns-delay 2 -s ,参数与装饰器 @pytest.mark.flaky 一致,这个就不多说了。

到此这篇关于Pytest 使用简介的文章就介绍到这了,更多相关Pytest 使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Pytest测试框架基本使用方法详解

    pytest介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试.接口自动化测试(pytest+requests); 4.pytest具有很多第三方插件,并且可以自定义扩展 如pytest-selenium(集成selenium). pytest-html(完美html测试报告

  • Pytest mark使用实例及原理解析

    这篇文章主要介绍了Pytest mark使用实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用方法: 1.注册标签名 2.在测试用例/测试类前面加上:@pytest.mark.标签名 打标记范围:测试用例.测试类.模块文件 注册方式: 1.单个标签: 在conftest.py添加如下代码: def pytest_configure(config): # demo是标签名 config.addinivalue_line("mark

  • pytest之assert断言的具体使用

    背景 本文总结使用pytest编写自动化测试时常用的assert断言. 说明 本文将从以下几点做总结: 为测试结果作断言 为断言不通过的结果添加说明信息 为预期异常作断言 为失败断言自定义说明信息 为测试结果作断言 在断言方面,pytest框架比其他类似的框架(比如unittest)更加简洁,易用,我想这是我选择pytest作为自动化测试框架之一的原因之一. pytest的assert断言关键字支持使用python内置的assert表达式.可以理解为pytest的断言就是直接使用python自带

  • Pytest如何使用skip跳过执行测试

    1.@pytest.mark.skip(reason=" ") -- 跳过执行测试函数 可传入一个非必须参数reason表示原因 import pytest @pytest.mark.skip(reason="no reason") def test_01(): print("---用例a执行---") class TestCase(): @pytest.mark.skip(reason="no reason") def te

  • python单元测试框架pytest的使用示例

    首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结. 这篇博客准备讲解一下pytest测试框架,这个框架是当前最流行的python语言最流行的单测框架,不掌握可不行,首先这个框架属于第三方模块,需要通过pip安装即可 pip install pytest 下面我们进入正题 一.介绍pytest的运行规则 1.测试文件的名称必须要以test_*.py的格式,或者*_test.py的格式 2.测试类的名称必须要以Test开头,且这

  • Pytest框架之fixture的详细使用教程

    前言 前面一篇讲了setup.teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的 如果有以下场景:用例 1 需要先登录,用例 2 不需要登录,用例 3 需要先登录.很显然无法用 setup 和 teardown 来实现了fixture可以让我们自定义测试用例的前置条件 fixture优势 命名方式灵活,不局限于 setup 和teardown 这几个命名 conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture sc

  • 详解如何使用Pytest进行自动化测试

    为什么需要自动化测试 自动化测试有很多优点,但这里有3个主要的点 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本. 可靠性:人容易出错,机器不太可能.当运行不能跳过的重复步骤/测试时,速度会更快. 全天运行:您可以在任何时间或远程启动测试.夜间运行正在测试你的软件,即使是在你睡着的时候. 成熟的.功能齐全的Python测试工具--pytest 目前有多种可用的测试框架和工具.这些框架的风格也各不相同,比如数据驱动.关键字驱动.混合.BDD等等.您可以选择最适合

  • Pytest参数化parametrize使用代码实例

    这篇文章主要介绍了Pytest参数化parametrize使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在测试用例的前面加上: @pytest.mark.parametrize("参数名",列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数. 列表数据:一组测试数据. 示例代码: import pytest test_datas = [ (11, 22, 33), (22, 33, 55) ] datas_di

  • Pytest 使用简介

    前言 最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 >robotframework . pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架.这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码.接下来我们在文中来对

  • python+pytest自动化测试函数测试类测试方法的封装

    目录 前言 一.测试用例封装的一般规则 三.测试类/方法的封装 四.示例代码 总结 前言 今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码如下: import requests headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like

  • pytest基本用法简介

    1.安装pytest,打开dos窗口输入: pip install pytest 2.通过pycharm工具下载 3.创建pytest测试用例步骤 # 定义测试类 class TestDivide: # 定义测试方法 def test_divide_01(self): result = divide(1,1) print(result) 问题:右键运行没有pytest运行的方式的处理步骤 第一步:检查文件名和文件所在目录是否合法,对应第一点 第二步:修改默认运行方式为pytest 第三步:删除历

  • python+pytest接口自动化之日志管理模块loguru简介

    目录 安装 简单示例 add()常用参数说明 使用 python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理,则容易出现日志丢失或记录错乱的情况. python中有一个用起来非常简便的第三方日志管理模块--loguru,不仅可以避免logging的繁琐配置,而且可以很简单地避免在logging中多进程多线程记录日志时出现的问题,甚至还可以自定义控制台输出的

  • pytest框架之fixture详细使用详解

    本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话不多说,那就先从pytest框架的精髓fixture说起吧! 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixture都可以互相调用. 3.fixt

  • python单测框架之pytest常见用法

    目录 单测框架的作用 pytest简介 pytest默认规则 pytest的运行方式 主函数模式 命令行模式 参数详解 读取pytest.ini配置文件运行 分组执行 忽略执行 单测框架的作用 测试发现:从多个文件中寻找测试用例. 测试执行:按照一定顺序去执行并且生成结果. 测试断言:判断最终结果与实际结果的差异. 测试报告:统计测试进度.耗时.通过率,生成测试报告. pytest简介 pytest是python的单测框架,使用灵活,插件丰富,以下是pytest常用的插件 pytest pyte

  • Httprunner简介、安装及基本使用教程

    目录 前言 简介 主要特点 Httprunner2.x和3.x区别 安装 相关命令 基本使用 创建项目 make转pytest用例 run 运行用例 前言 本系列文章开始介绍接口开源测试工具 --httprunner3的使用,基当前最新版本的3.1.6 简介 主要特点 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 继承所有强大的特性requests,享受人性化处理

  • Python测试框架pytest介绍

    目录 一.Pytest简介 二.Pytest安装 三.Pytest测试执行 四.测试类主函数 五.断言方法 六.常用命令详解 七.接口调用 一.Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support

  • pytest生成简单自定义测试结果的html报告

    目录 简介 生成报告 生成报告效果如下 修改报告 修改 Environment 修改 Results 生成效果报告 后记 简介 pytest-HTML 是一个插件,pytest 用于生成测试结果的 HTML 报告. 生成报告 先简单写个例子生成报告看看. 生成报告效果如下 此次主要是针对 Environment 和 Results 两部分进行修改配置,让列表部分展示的数据更清晰,增加和删减列数据. 修改报告 这里先介绍下 conftest.py 文件,主要作用如下: 1 .存放你的 fixtur

  • Pytest测试报告工具Allure用法介绍

    简介 Allure Framework是一种灵活的.轻量级.多语言测试报告工具. 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试. 从开发/测试的角度来看: Allure报告可以快速查看到缺陷点,可以将测试未通过划分为Bug和中断的测试. 还可以配置日志,步骤,固件,附件,时间,历史记录,以及与TMS的集成和Bug跟踪系统,以便掌握所有信息. 从管理者的角度来看: Allure提供了一个清晰的全局,涵盖了所涵盖的功

随机推荐