51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4086|回复: 1
打印 上一主题 下一主题

[原创] Pytest中断言的重要性,就不需要我重复了吧

[复制链接]
  • TA的每日心情
    擦汗
    3 小时前
  • 签到天数: 1046 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-12-23 14:11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      我们在写自动化的过程中,用例的断言也是至关重要的,断言可以帮助我们判断用例测试点是否成功和失败。当然在我们这么强大的pytest框架中,断言也是比较强大的。为什么?继续往下看。
      pytest断言
      前面说到pytest的断言比较强大,它直接可以使用python自带的断言内容,当然不止而已,pytest还有一个重要的功能是可以重写assert关键字,pytest会截断对python中自带的assert的调用然后替换成自己定位的assert,从而可以获取更多的错误信息,让我们知道具体哪里出现了问题。
      编写一个加法进行通过断言验证。
    1. import pytest
    2.   class Test_01:
    3.       def add(self,x,y):
    4.               c = x + y
    5.               return c
    6.       def test_001(self):
    7.           c = self.add(1,2)
    8.           assert c == 4
    9.   if __name__ == '__main__':
    10.       pytest.main(['-s'
    复制代码
    看到上面的代码大家都知道是会失败的, 那么我们一起看下pytest断言会给我们增加哪些新的报错信息。


     从上图的结果中可以看出带“>”的是python自带的错误解释,而带E的则是pytest进行添加的,这样就能很清楚的看到错误信息,比如这个3==4结果是错误的。
      增加断言详细信息
      在编写用例的时候,断言的时候想要获取一些更加有用的信息,比如参数化的时候,需要知道哪个参数进行传入的,如果出错了可以帮助我们进行调试,那么这一点pytest中的assert也可以帮助我们进行增加。
    1.  import pytest
    2.   class Test_01:
    3.       def add(self,x,y):
    4.               c = x + y
    5.               return c
    6.       def test_001(self):
    7.           a = 1
    8.           b = 2
    9.           assert self.add(a,b) == 4 , '当前传入的a值:%s,传入的b值:%s' %(a,b)
    10.   if __name__ == '__main__':
    11.       pytest.main(['-s
    复制代码


    很清楚的看到了python自带的assert和pytest增加的对比,python自带的没有把值传入,pytest帮助我们把值传入进去,更加清楚的帮助查看错误信息。
      异常断言
      pytest断言方法内容应该没有unittests多,但是比unittest更加方便,更加灵活。这里安静在举一个栗子。比如我们在执行一条错误的用例的时候,已经知道错误类型,这个时候我们也可以通过判断这个错误类型,如果错误类型和预期一致,那么就直接通过用例,反之失败。
      安静先写一个错误的函数,然后找到他的错误类型,下面的函数错误类型为"AssertionError"。
    1. def cake():
    2.           a = 'anjing'
    3.           b = 'test_anjing'
    4.           assert  a == b
    5.   cake()
    6.   ------------执行结果--------------
    7.    File "E:/auto_test/test_01.py", line 5, in <module>
    8.       cake()
    9.     File "E:/auto_test/test_01.py", line 4, in cake
    10.       assert  a == b
    11.   AssertionError
    复制代码
    这里可以使用?pytest.raises(错误类型)? 进行对比断言。


    1. import pytest
    2.   class Test_01:
    3.       def cake(self):
    4.           a = 'anjing'
    5.           b = 'test_anjing'
    6.           assert  a == b
    7.       def test_001(self):
    8.           print('Test_01下的用例001')
    9.           with pytest.raises(AssertionError):
    10.               self.cake()
    11.   if __name__ == '__main__':
    12.       pytest.main(['-v
    复制代码


    这个从表面上运行结果肯定是失败的,因为a不等于b,但是加入pytest的断言运行后就成功了。


    上文中的异常断言,可以进行实例化,实例化过后存在三个可以用的方法,分别是.type,.value,.traceback安静简单的进行举例说明。
      .type
      我们这里也可以通过pytest.raises进行断言,我们可以根据返回的tpye进行对比,查看我们预期的与实际的是否一致。
    1. import pytest
    2.   class Test_01:
    3.       def cake(self):
    4.           a = 'anjing'
    5.           b = 'test_anjing'
    6.           assert  a == b
    7.       def test_001(self):
    8.           print('Test_01下的用例001')
    9.           with pytest.raises(AssertionError) as excinfo:
    10.               self.cake()
    11.           print('错误的类型是:%s' %excinfo.type)
    12.           assert excinfo.type == AssertionError
    13.   if __name__ == '__main__':
    14.       pytest.main(['-s
    复制代码

     .value
      如果还不知道具体的错误出现在哪里,我们也可以通过value进行查看具体的错误类型。
    1.  import pytest
    2.   class Test_01:
    3.       def cake(self):
    4.           a = 'anjing'
    5.           b = 'test_anjing'
    6.           assert  a == b
    7.       def test_001(self):
    8.           print('Test_01下的用例001')
    9.           with pytest.raises(ZeroDivisionError) as excinfo:
    10.               self.cake()
    11.           print('错误的类型是:%s' %excinfo.type)
    12.           print('错误的值:%s'%excinfo.value)
    13.           assert excinfo.type == ZeroDivisionError
    14.   if __name__ == '__main__':
    15.       pytest.main(['-s
    复制代码



    可以看出具体错误的值是assert中的两个字符串不相等导致的。
      .traceback
      这里这个方法表示可以把代码中哪行出现了错误进行打印出来,此方法必须在str下进行打印。

     pytest常用断言
      前面也介绍了pytest的断言可以复用python的断言,安静简单的列举几个python的断言:
      1、判断是否为真:??assert xx ?
      2、判断不为真:??assert not xx ?
      3、判断a是否包含b:??assert a in b ?
      4、判断a不包含b:?assert a not in b?
      5、判断两值相等:??assert b == a ?
      6、判断两值不相等:??assert a != b ?
      ?安静对常用断言简单的举几个例子。
    1. import pytest
    2.   class Test:
    3.       def is_true(self):
    4.           '''返回True'''
    5.           return True
    6.       def test_01(self):
    7.           '''判断是否为真'''
    8.           assert self.is_true()
    9.       def is_false(self):
    10.           '''返回False'''
    11.           return False
    12.       def test_02(self):
    13.           '''判断不为真'''
    14.           assert not self.is_false()
    15.       def test_03(self):
    16.           '''判断是否相等'''
    17.           a = 'test_anjing'
    18.           b = 'test_anjing'
    19.           assert a == b
    20.       def test_04(self):
    21.           '''判断两值不相等'''
    22.           a = 'test_anjing'
    23.           b = 'anjing'
    24.           assert a != b
    25.       def test_05(self):
    26.           '''判断a包含b'''
    27.           a = 'test_anjing'
    28.           b = 'anjing'
    29.           assert b in a
    30.       def test_06(self):
    31.           '''判断a不包含b'''
    32.           a = 'anjing'
    33.           b = 'test'
    34.           assert b not in a
    35.   if __name__ == '__main__':
    36.       pytest.mai
    复制代码



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-14 12:11 , Processed in 0.063220 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表