Pytest断言的具体使用

目录
  • assert断言方法
  • 异常断言Excepiton
  • 检查断言装饰器

Pytest使用的断言是使用python内置的断言assert。Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。即pytest测试结果为False的断言为断言失败即测试用例执行失败,反之为断言成功即测试用例执行成功。

断言使用场景:

  • 为测试结果作断言
  • 为断言不通过的结果添加说明信息
  • 为预期异常作断言
  • 为失败断言作自定义说明信息

assert断言方法

assert关键字后面接表达式,常用的assert断言方法如下:

  • 判断xx为真:assert xx
  • 判断xx不为真:assert not xx
  • 判断b包含a:assert a in b
  • 判断b不包含a:assert a not in b
  • 判断a等于b:assert a == b
  • 判断a不等于b:assert a != b

示例:

# 为测试结果作断言
 
import pytest
from func import *
 
class TestFunc:
 def test_add_by_class(self):
  assert add(2,3) == 5
# 为断言不通过的结果添加说明信息
 
def test_login():
    # 使用python内置的断言
    # "1是不等于2的"是断言失败后,抛出异常输出的自定义提示信息
    assert 1 == 2, "1是不等于2的"
    
test_login()
 
# 运行结果:
AssertionError: 1是不等于2的

异常断言Excepiton

异常断言即为断言抛出的异常是预期的异常,执行的测试用例是成功的。

使用pytest.raises()作为上下文管理器。当抛出异常时,可获取到对应的异常实例,然后断言它抛出的异常是不是预期的异常。当代码抛出异常时,如果和raises指定的异常类相匹配,则断言不会失败。

官方文档:How to write and report assertions in tests — pytest documentation

with pytest.raises()执行结束后会生成一个ExceptionInfo的实例对象,该对象包含type , value, traceback属性。

# 变量存储该异常的所有信息
with pytest.raises(TypeError) as 变量:
    # 获取变量的所有属性,即type、value、traceback
    print(变量.__dict__)

注意:断言type的时候,异常类型是不需要加引号的。断言value值的时候需转换str类型,value属性可作异常的说明信息。

示例如下:

import pytest

def test_zero_division_long():
    with pytest.raises(ZeroDivisionError) as excinfo:
        1 / 0

    # 断言异常类型 type
    assert excinfo.type == ZeroDivisionError
    # 断言异常 value 值
    assert "division by zero" in str(excinfo.value)

with pytest.raise(ZeroDivisionError)用于对于故意测试异常代码的情况(已知异常),断言通过用例执行成功显示passed,不通过会显示failed。

示例如下:

# 为预期异常作断言完整示例,执行用例为True

# ./func.py
def add(a,b):
    if isinstance(a,int) and isinstance(b,int):
        return a+b
    else:
        raise TypeError('数据类型错误')

# ./test_case/test_func.py
import pytest
from func import *

class TestFunc:

 # 正常测试用例
 def test_add_by_class(self):
    assert add(2,3) == 5

 # 异常测试用例,期望结果为抛出TypeError异常
 def test_add_by_func_aaa(self,*args, **kwargs):
    with pytest.raises(TypeError) as E:
        add('3',4)
    print(E.type)
    print(E.value)
    print(E.traceback)  

# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v'])
# 木有抛出预期异常的示例,执行用例为False

# ./func.py
def add(a,b):
 # 指定异常,从此处直接抛出异常
    raise NameError("名称错误")
    if isinstance(a,int) and isinstance(b,int):
        return a+b
    else:
        raise TypeError('数据类型错误')

# ./test_case/test_func.py
import pytest
from func import *

class TestFunc:
    # 异常测试用例,期望结果为爆出TypeError异常
    def test_add_by_func_aaa(self,*args, **kwargs):
        with pytest.raises(TypeError):
            add('3',4)

# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v'])

可将match关键字参数传递给上下文管理器pytest.raises(),来测试正则表达式与异常的信息表达形式是否匹配。match方法相当于re.search功能。

注意:这种方法只能断言value,不能断言type。

示例如下:

import pytest

def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
        1 / 0

# match方法相当于re.search功能,即match="zero"也是允许的
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match="zero") as excinfo:
        1 / 0

pytest. raised()函数还有另一种形式,在这里传递一个函数,该函数将使用给定的*args和**kwargs执行,并断言引发了给定的异常。在没有异常或错误异常的情况下,报告器将为您提供有用的输出。

pytest.raises(ExpectedException, func, *args, **kwargs)

断言某个测试用例中可能出现多个不同的预期异常的解决办法:

在with pytest.raises()中传入异常类型的参数,从传入一个异常类型,改变为传入一个异常类型组成的元组。同样只是传入一个参数。

示例如下:

# ./func.py
def add(a,b):
    raise NameError('名字错了')
    if isinstance(a,int) and isinstance(b,int):
        return a+b
    else:
        raise TypeError('数据类型错误')

# ./test_case/test_func.py
import pytest
from func import *

class TestFunc:
    # 异常测试用例,期望结果为爆出TypeError异常
    def test_add_by_func_aaa(self,*args, **kwargs):
    # 将预期中多个错误信息组成一个元组
        with pytest.raises((TypeError,NameError),match=r'.*错.*$') as E:
            add('3',4)

# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v'])

检查断言装饰器

检查异常装饰器@pytest.mark.xfail():用于对于检查未修复的错误,即可能发生的异常。断言通过用例执行成功会显示xfailed,不通过显示failed。

作用:检查是否有异常,不确定是否有异常。

示例如下:

# 单个异常时断言装饰器使用

@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
    1 / 0
# 多个异常时断言装饰器使用
@pytest.mark.xfail(raises=(TypeError, NameError))
def test_add_by_func_aaa2():
    add("3", 4)

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

(0)

相关推荐

  • pytest中文文档之编写断言

    编写断言 使用assert编写断言 pytest允许你使用python标准的assert表达式写断言: 例如,你可以这样做: # test_sample.py def func(x): return x + 1 def test_sample(): assert func(3) == 5 如果这个断言失败,你会看到func(3)实际的返回值: /d/Personal Files/Python/pytest-chinese-doc/src (5.1.2) λ pytest test_sample.

  • pytest多重断言的实现

    当我们写用例断言时,往往一个断言结果是不够的,所以需要加入多重断言,而多重断言,当断言中间出现断言结果False时,会中断后续的断言执行,会导致测试用例执行结果的准确性不高使用pytest框架的插件pytest-assume, 实现用例执行时,其中一个断言失败后,执行后续的断言 安装:pip install pytest-assume 以下为使用示例: import pytest from pytest_assume.plugin import assume class TestTwo: def

  • pytest之assert断言的具体使用

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

  • Pytest断言的具体使用

    目录 assert断言方法 异常断言Excepiton 检查断言装饰器 Pytest使用的断言是使用python内置的断言assert.Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常.即pytest测试结果为False的断言为断言失败即测试用例执行失败,反之为断言成功即测试用例执行成功. 断言使用场景: 为测试结果作断言 为断言不通过的结果添加说明信息 为预期异常作断言 为失败断言作自定义说明信息 assert断言方法 assert关键字后面接表

  • 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

  • Python中requests做接口测试的方法

    一.介绍 Requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求 二.前提 pip install requests 三.get的请求 3.1 GET无参请求 r = requests.get('http://www.baidu.com') 3.2 GET传参 payload = {'key1': 'value1', 'key2': 'value2', 'key3': Non

  • allure结合python生成测试报告教程

    百度搜索实例 一.代码结构 本案例来自于霍格沃兹测试学院<高薪测试成长图谱>.data.yml为数据管理文件,test_baidudemo.py为测试用例文件,文件结构如下: 创建data/data.yml文件,代码如下 - allure - pytest - unittest 创建test_baidudemo.py,代码如下 #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literal

  • 关于python实现requests接口测试的问题

    requests接口测试的介绍 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求 requests接口测试的使用前提 pip install requests 1.requests中的get请求 1 GET无参请求 r = requests.get('http://www.baidu.com') 案例: import requests class Classrequse

  • Python中断言Assertion的一些改进方案

    Python Assert 为何不尽如人意? Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. >>> assert 1 + 1 == 2 >>> assert isinstance('Hello', str) >>> assert isinstance('Hello', int) Traceback (most recent call last): File "<input>

  • python的pytest框架之命令行参数详解(上)

    前言 pytest是一款强大的python自动化测试工具,可以胜任各种类型或者级别的软件测试工作.pytest提供了丰富的功能,包括assert重写,第三方插件,以及其他测试工具无法比拟的fixture模型.pytest是一个软件测试框架,是一款命令行工具,可以自动找到测试用例执行,并且回报测试结果.有丰富的基础库,可以大幅度提高用户编写测试用例的效率.具备扩展性,用户可以自己编写插件,或者安装第三方提供的插件.可以很容易地与其他工具集成到一起使用.比如持续集成,web自动化测试等. 下面列举了

随机推荐