python assert 不退出_Pytest中断言的重要性,就不需要我重复了吧
出品 | 51Testing软件测试网
前言
我们在写自动化的过程中,用例的断言也是至关重要的,断言可以帮助我们判断用例测试点是否成功和失败。当然在我们这么强大的Pytest框架中,断言也是比较强大的。为什么?继续往下看 。
Pytest断言
前面说到Pytest的断言比较强大,它直接可以使用Python自带的断言内容,当然不止而已,Pytest还有一个重要的功能是可以重写Assert关键字,Pytest会截断对Python中自带的Assert的调用然后替换成自己定位的Assert,从而可以获取更多的错误信息,让我们知道具体哪里出现了问题。
编写一个加法进行通过断言验证:
import pytestclass Test_01: def add(self,x,y): c = x + y return c def test_001(self): c = self.add(1,2) assert c == 4if __name__ == '__main__': pytest.main(['-s'
看到上面的代码大家都知道是会失败的, 那么我们一起看下Pytest断言会给我们增加哪些新的报错信息。
从上图的结果中可以看出带“>”的是Python自带的错误解释,而带E的则是Pytest进行添加的,这样就能很清楚的看到错误信息,比如这个3==4结果是错误的。
增加断言详细信息
在编写用例的时候,断言的时候想要获取一些更加有用的信息,比如参数化的时候,需要知道哪个参数进行传入的,如果出错了可以帮助我们进行调试,那么这一点Pytest中的Assert也可以帮助我们进行增加。
import pytestclass 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 == bcake()------------执行结果-------------- File "E:/auto_test/test_01.py", line 5, in cake() File "E:/auto_test/test_01.py", line 4, in cake assert a == bAssertionError
这里可以使用pytest.raises(错误类型)进行对比断言。
import pytestclass 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 pytestclass 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 == AssertionErrorif __name__ == '__main__': pytest.main(['-s
.value
如果还不知道具体的错误出现在哪里,我们也可以通过value进行查看具体的错误类型。
import pytestclass 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 == ZeroDivisionErrorif __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 pytestclass 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 aif __name__ == '__main__': pytest.mai
END
推荐阅读
点击阅读☞什么是断言?教你通过Postman增加断言!
点击阅读☞JMeter排忧解难——数据库断言
点击阅读☞UFT之使用断言来控制脚本流
点击阅读☞常用插件Pytest的测试用例相关问题总结
点击阅读☞Python测试框架Pytest的常用插件测试报告
戳