15:pytest的断言

04-13pytest的基本使用方法

引言

有了unittest这个经典的测试框架做基础,那么学习其他任何的测试框架都变得有章法可循了。

pytest测试框架也是由unittest改编而来,所以许多地方都是一脉相承。

pytest的断言也变得更加易懂,简单来说是白话文中白话文。

正文:

1 断言

pytest直接使用 assert 关键字 进行断言

断言又有一般断言和异常断言等等,这里我们先来了解一般常用的断言

常用断言

  • 常用断言举例

# 功能  用于计算 a 与 b 相加的和
def addnumber(a,b):
    return a+b

# 功能 : 用户判断是否是素数
# 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
def is_primenumber(n):
    if n<=1:
        return False
    for i in range(2,n):
        if n %  i ==0:
            return False
        return True

# 测试相等
def test_add_equal():
    assert addnumber(3,4) == 7

# 测试不相等
def test_add_notequal():
    assert addnumber(3,4) != 8

# 测试大于等于
def test_greadequal():
    assert addnumber(3,4) >=7

# 测试 小于等于
def test_lessequal():
    assert addnumber(3, 4) <= 7

# 测试包含
def test_in():
    a = 'helloword'
    b ='word'
    assert b in a

# 测试不包含
def test_notin():
    a ='helloword'
    b ='bug'
    assert b not in a

# 判断是否为True
def test_true():
    a ='a'
    b ='a'
    assert  a == b 

def test_listtrue():
    a =[1,2]
    b =[1,2]
    assert a==b 

# 判断是True
def test_isprimenumber():
    assert is_primenumber(3) is True
    assert is_primenumber(5) is True
    assert is_primenumber(13) is True

# 判断是否不为True
def test_isnottrue():
    assert is_primenumber(2) is not True

# 判断是否为False
def test_false_a():
    assert is_primenumber(8) is False
  1. 我们把脚本运行一下:
...> pytest Stage5\07pytest\test_operator.py -v
####   -v 参数能把结果打印的更详细 
####   -v, --verbose         increase verbosity.

结果如下:
======================================================== test session starts ========================================================
platform win32 -- Python 3.7.1, pytest-5.2.2, py-1.8.0, pluggy-0.13.0 -- d:\python\virtualenvs\testops\scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Coding\Project\testops
collected 10 items                                                                                                                   

Stage5/07pytest/test_operator.py::test_add_equal PASSED                                                                        [ 10%]
Stage5/07pytest/test_operator.py::test_add_notequal PASSED                                                                     [ 20%]
Stage5/07pytest/test_operator.py::test_greadequal PASSED                                                                       [ 30%]
Stage5/07pytest/test_operator.py::test_lessequal PASSED                                                                        [ 40%]
Stage5/07pytest/test_operator.py::test_in PASSED                                                                               [ 50%]
Stage5/07pytest/test_operator.py::test_notin PASSED                                                                            [ 60%]
Stage5/07pytest/test_operator.py::test_true PASSED                                                                             [ 70%]
Stage5/07pytest/test_operator.py::test_isprimenumber PASSED                                                                    [ 80%]
Stage5/07pytest/test_operator.py::test_isnottrue PASSED                                                                        [ 90%]
Stage5/07pytest/test_operator.py::test_false_a PASSED                                                                          [100%]

======================================================== 10 passed in 0.04s =========================================================

如果你的运行结果看不到详细的信息,那你需要加上 -v 参数。

断言异常

import pytest
def test_zero_division():
    with pytest.raises(ZeroDivisionError) as exzerodivisionerror:
        1/0

    ## 断言 捕获的异常类型是否是 ZeroDivisionError
    assert exzerodivisionerror.type == ZeroDivisionError ,"异常类型不是 ZeroDivisionError"
    #
    print("<type>",exzerodivisionerror.type,"<value>",exzerodivisionerror.value)
    ## 断言 division by zero 字符包含在 捕获的错误信息中
    assert "division by zero" in str(exzerodivisionerror.value),"异常值不包含 division by zero"

断言异常的关键字也是assert ,一般是断言异常的type和具体异常信息是否包含某个值value

总结:

1 一般断言通常是运算符的扩展,例如 算术运算符 +,-身份运算符 is ,is not等等

2 断言异常的关键字也是assert ,一般是断言异常的type和具体异常信息是否包含某个值value

思考与延伸

1 pytest的assert 和 unittest的 self.assert 有什么区别?

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术