zoukankan      html  css  js  c++  java
  • 【pytest学习14】assert断言

    pytest断言

    前面说到pytest的断言比较强大,它直接可以使用python自带的断言内容,当然不止而已,pytest还有一个重要的功能是可以重写assert关键字,pytest会截断对python中自带的assert的调用然后替换成自己定位的assert,从而可以获取更多的错误信息,让我们知道具体哪里出现了问题。

    编写一个加法进行通过断言验证

    复制代码
    import pytest
    
    class Test_01:
    
        def add(self,x,y):
                c = x + y
                return c
    
        def test_001(self):
            c = self.add(1,2)
            assert c == 4
    if __name__ == '__main__':
        pytest.main(['-s'])
    复制代码

    看到上面的代码大家都知道是会失败的, 那么我们一起看下pytest断言会给我们增加哪些新的报错信息。

    从上图的结果中可以看出带“>”的是python自带的错误解释,而带E的则是pytest进行添加的,这样就能很清楚的看到错误信息,比如这个3==4结果是错误的。

    增加断言详细信息

    在编写用例的时候,断言的时候想要获取一些更加有用的信息,比如参数化的时候,需要知道哪个参数进行传入的,如果出错了可以帮助我们进行调试,那么这一点pytest中的assert也可以帮助我们进行增加

    复制代码
    import pytest
    
    class Test_01:
    
        def add(self,x,y):
                c = x + y
                return c
    def test_001(self): a = 1 b = 2 assert self.add(a,b) == 4 , '当前传入的a值:%s,传入的b值:%s' %(a,b)
    if __name__ == '__main__': pytest.main(['-s'])
    复制代码

    很清楚的看到了python自带的assert和pytest增加的对比,python自带的没有把值传入,pytest帮助我们把值传入进去,更加清楚的帮助查看错误信息

    异常断言

    pytest断言方法内容应该没有unittests多,但是比unittest更加方便,更加灵活。比如我们在执行一条错误的用例的时候,已经知道错误类型,这个时候我们也可以通过判断这个错误类型,如果错误类型和预期一致,那么就直接通过用例,反之失败。

    安静先写一个错误的函数,然后找到他的错误类型,下面的函数错误类型为"AssertionError"

    复制代码
    def cake():
            a = 'anjing'
            b = 'test_anjing'
            assert  a == b
    cake()
    ------------执行结果--------------
    
     File "E:/auto_test/test_01.py", line 5, in <module>
        cake()
      File "E:/auto_test/test_01.py", line 4, in cake
        assert  a == b
    AssertionError
    复制代码

    这里可以使用 pytest.raises(错误类型)  进行对比断言

    复制代码
    import pytest
    
    class Test_01:
    
        def cake(self):
            a = 'anjing'
            b = 'test_anjing'
            assert  a == b
    
        def test_001(self):
            print('Test_01下的用例001')
            with pytest.raises(AssertionError):
                self.cake()
    
    if __name__ == '__main__':
        pytest.main(['-v'])
    复制代码

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

    上文中的异常断言,可以进行实例化,实例化过后存在三个可以用的方法,分别是.type,.value,.traceback举例说明

    .type

    我们这里也可以通过pytest.raises进行断言,我们可以根据返回的tpye进行对比,查看我们预期的与实际的是否一致

    复制代码
    import pytest
    
    class Test_01:
    
        def cake(self):
            a = 'anjing'
            b = 'test_anjing'
            assert  a == b
    
        def test_001(self):
            print('Test_01下的用例001')
            with pytest.raises(AssertionError) as excinfo:
                self.cake()
            print('错误的类型是:%s' %excinfo.type)
            assert excinfo.type == AssertionError
    
    if __name__ == '__main__':
        pytest.main(['-s'])
    复制代码

     

    .value

    如果还不知道具体的错误出现在哪里,我们也可以通过value进行查看具体的错误类型,

    复制代码
    import pytest
    
    class Test_01:
    
        def cake(self):
            a = 'anjing'
            b = 'test_anjing'
            assert  a == b
    
        def test_001(self):
            print('Test_01下的用例001')
            with pytest.raises(ZeroDivisionError) as excinfo:
                self.cake()
            print('错误的类型是:%s' %excinfo.type)
            print('错误的值:%s'%excinfo.value)
            assert excinfo.type == ZeroDivisionError
    
    if __name__ == '__main__':
        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  

     安静对常用断言简单的举几个例子。

    复制代码
    import pytest
    
    class Test:
    
        def is_true(self):
            '''返回True'''
            return True
    
        def test_01(self):
            '''判断是否为真'''
            assert self.is_true()
    
        def is_false(self):
            '''返回False'''
            return False
    
        def test_02(self):
            '''判断不为真'''
            assert not self.is_false()
    
        def test_03(self):
            '''判断是否相等'''
            a = 'test_anjing'
            b = 'test_anjing'
            assert a == b
    
        def test_04(self):
            '''判断两值不相等'''
            a = 'test_anjing'
            b = 'anjing'
            assert a != b
    
        def test_05(self):
            '''判断a包含b'''
            a = 'test_anjing'
            b = 'anjing'
            assert b in a
    
        def test_06(self):
            '''判断a不包含b'''
            a = 'anjing'
            b = 'test'
            assert b not in a
    
    if __name__ == '__main__':
        pytest.main(['-v'])
    复制代码

    声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/ 如出现转载未声明 将追究法律责任~谢谢合作
  • 相关阅读:
    IDEA系列(七)--给自己的IDEA一个酷炫的主题吧
    Swagger入参为List
    Mac系统 JDK版本切换
    equals方法被调用时字符串和对象的顺序
    MongoDB简介
    2018-5-18 东方微银Java笔试题
    Java基本数据类型之char
    Java实例——简单的汽车销售4S店
    Java实例——格式化当前日期
    Java实例——为新员工分配部门
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/14832087.html
Copyright © 2011-2022 走看看