python自动化测试 | pytest自动化测试框架断言assert(详细总结)

我们做自动化的时候经常把代码的重点放在逻辑层,或者数据层。其实我写代码主要精力也放在这边。但是真正看一个测试脚本的水平高低,其实是看断言能力的高低,因为断言才能体现出真正的测试思维和测试经验。可是在实际工作中,相信有些同事可能和我一样对各式各样的断言类也是傻傻分不清楚。我们主要工作目标是验证实际结果与预期结果是一致的,在自动化软件测试中,通过断言来实现这一目的。
摘要由CSDN通过智能技术生成


前言

我们做自动化的时候经常把代码的重点放在逻辑层,或者数据层。其实我写代码主要精力也放在这边。

但是真正看一个测试脚本的水平高低,其实是看断言能力的高低,因为断言才能体现出真正的测试思维和测试经验。可是在实际工作中,相信有些同事可能和我一样对各式各样的断言类也是傻傻分不清楚。

我们主要工作目标是验证实际结果与预期结果是一致的,在自动化软件测试中,通过断言来实现这一目的。

Pytest中断言是通过Python原生的assert语句实现的,对Python原生的assert语句进行了优化,当发生断言失败时,错误信息更加丰富,方便测试时快速定位问题原因。

优秀的测试框架都提供了断言的方法,比如TestNG中的assertTrue、assertEquals、assertSame等等。

接下来我们就来详解一下断言。

一、Python原生的assert

Python中assert语句通常用来对代码进行必要的检查,确定某种情况一定发生,或者一定不会发生。

Python 的 assert 语句的语法是这样的:

assert expression1 ["," expression2]

expression1往往是一个条件表达式,如果条件表达式为True,则什么也不做,相当于执行了 pass 语句;

如果条件表达式为False,便会抛出异常 AssertionError,并返回具体的错误信息expression2。

看一个实际例子:

# content of my_assertion.py
def assertion():
    assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"

if __name__ == '__main__':
    assertion()

执行一下上面的代码看看结果:

$ python my_assertion.py 
Traceback (most recent call last):
  File "my_assertion.py", line 5, in <module>
    assertion()
  File "my_assertion.py", line 2, in assertion
    assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"
AssertionError: left is [1,2,3], right is [1,2,4]

可见,assert后面的条件表达式为False,抛出了AssertionError,并显示了错误信息left is [1, 2, 3], right is [1, 2, 4]。

不过,这里还有一点小小的缺憾。并没有明确告诉开发人员,条件判断失败的具体位置。需要开发人员自己对比才发现,==左边的第三个元素和右边的第三个元素不一样。

二、Pytest的assert优点

软件测试工作,经常会遇到断言失败的情况。如果每次失败,都需要测试工程师人眼去观察失败的具体原因和出错的位置,那将是非常耗时的。

强大的Pytest也考虑到了广大测试工程师面临的问题,因此对Python原生的assert语句进行了优化和改进,主要在是当断言失败时,将错误的具体信息和位置显示出来,让测试工程师对失败原因一目了然。

还是上面的例子,将其放入到测试用例(test_开头的函数)中:

# content of test_assertion.py
def test_assertion():
    assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"

执行测试用例后的信息输出如下:

    def test_assertion():
>       assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"
E       AssertionError: left is [1,2,3], right is [1,2,4]
E       assert [1, 2, 3] == [1, 2, 4]
E         At index 2 diff: 3 != 4
E         Full diff:
E         - [1, 2, 4]
E         ?        ^
E         + [1, 2, 3]
E         ?

是不是有种很爽的感觉?pytest明确显示出了错误的位置是index为2的元素左右不相等。这一点点小小的改进大大提高了测试失败时定位出错原因的效率。

在测试用例中执行assert语句,才有上面的效果,这是因为Pytest对assert语句进行了重写。在非测试用例中的assert语句,比如测试项目中的一些utils函数中,使用assert还是Python原生的效果。

三、Pytest 断言的用法

在自动化测试用例中,最常用的断言是相等断言,就是断言预期结果和实际结果是一致的。通常我们断言的预期结果和实际结果的数据类型是字符串、元组、字典、列表和对象。

Pytest通过assert和==能够完美支持对这些数据类型的相等断言。下面来介绍几种常见的数据类型的断言操作。

1、断言字符串

断言字符串非常简单,只需要将预期和实际的字符串,分别写在==两边,当发生断言失败时,将会列出第一个不相等元素的下标。下面是几个在实际测试工作中经常用到的几种字符串断言方式。

# content of test_assertions.py
class TestAssertions(object):
    def test_string_1(self):
        assert "spam" == "eggs"

    def test_string_2(self):
        assert "foo 1 bar" == "foo 2 bar"

    def test_string_3(self):
        assert "foo\nspam\nbar" == "foo\neggs\nbar"

    def test_string_4(self):
        def f():
            return "streaming"
        assert f().startswith('S')

执行一下这些测试用例,看下输出效果,核心部分如下:

==================================================
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值