Pytest 之assert断言的使用

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

今天笔者想和大家来聊聊,pytest中assert断言的使用,废话就不多说了我们直接进入正题哈。

一、常用断言

​unittest断言方式是自身框架来实现的,即self.assertEqual()等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类,因此pytest使用的断言是使用python内置的断言assert,相对于unittest各种各样的断言方法,但内置的断言会更简洁,它只有一种,如下。

关键代码:assert 表达式, 错误提示信息。

复制代码
def test_login():
    # 使用python内置的断言
    assert 1 == 2, '1是不等于2的'	# 错误信息也可以不写
    
test_login()

​ 运行结果:

复制代码
C:\software\python\python.exe D:/learn/test.py
Traceback (most recent call last):
  File "D:/learn/test.py", line 13, in <module>
    test_login()
  File "D:/learn/test.py", line 11, in test_login
    assert 1 == 2, '1是不等于2的'
AssertionError: 1是不等于2的
 
Process finished with exit code 1

常用的断言表达有以下几种:

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

二、异常断言

可以使用pytest.raises作为上下文管理器,当抛出异常时可以获取到对应的异常实例,然后断言它抛出的异常是不是预期的。

复制代码
# 断言异常
def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

如任意一个自然数除以0时,由于0不能作为被除数,执行时就会抛出ZeroDivisionError异常,提示division by zero。

复制代码
# 详细断言异常
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)

注意:断言type的时候,异常类型是不需要加引号的,断言value值的时候需转str类型。

三、扩展

正则断言

​可以将match关键字参数传递给上下文管理器,以测试正则表达式与异常的字符串表示形式是否匹配

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

复制代码
# 自定义消息
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
        1 / 0

​该match方法的regexp参数 re.search函数匹配,因此在上面的示例中match='zero'也可以使用

复制代码
# 自定义消息
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match="zero") as excinfo:
        1 / 0

​运行结果:

检查断言装饰器

​当代码抛出异常时,如果和raises指定的异常类相匹配,就不会断言失败。

​它相当于一个检查异常装饰器,目的是检查是否有异常(不确定是否有异常),不同使用场景:

  • with pytest.raise(ZeroDivisionError)对于故意测试异常代码的情况,使用可能会更好

  • 而@pytest.mark.xfail(raises=ZeroDivisionError)对于检查未修复的错误(即可能会发生异常),使用检查断言可能会更好

    断言装饰器

    @pytest.mark.xfail(raises=ZeroDivisionError)
    def test_f():
    1 / 0

​ 执行结果:

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

相关推荐
belldeep9 小时前
python:genesis-world, Genesis-Embodied-AI
人工智能·python·ai·genesis
benchmark_cc9 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
维克兜率天10 小时前
【维克】趋势型CTA:期货市场的“追涨杀跌“
人工智能·python
取名真是11 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
梦想不只是梦与想11 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合11 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
别问!问就是全会13 小时前
Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌
ide·python·其他·jupyter
深蓝AI13 小时前
Python 缓存击穿实测:16 个并发请求如何只回源 1 次
python
benchmark_cc13 小时前
用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践
python·数据分析·pandas·量化交易·股票数据·quantdash
zh路西法14 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace