🔥 交流讨论:欢迎加入我们一起学习!
🔥 资源分享:耗时200+小时精选的「软件测试」资料包
🔥 教程推荐:火遍全网的《软件测试》教程
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
常用断言
unittest断言方式是自身框架来实现的,即self.assertEqual()
等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类,因此pytest使用的断言是使用python内置的断言assert,相对于unittest各种各样的断言方法,但内置的断言会更简洁,它只有一种,如下。
关键代码:assert 表达式, 错误提示信息
。
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_login</span>():</span>
<span style="color:#b18eb1"><em># 使用python内置的断言</em></span>
<span style="color:#f92672">assert</span> <span style="color:#d19a66">1</span> == <span style="color:#d19a66">2</span>, <span style="color:#98c379">'1是不等于2的'</span> <span style="color:#b18eb1"><em># 错误信息也可以不写</em></span>
test_login()</span></span>
运行结果:
<span style="background-color:#282c34"><span style="color:#abb2bf">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</span></span>
常用的断言表达有以下几种🔻:
assert xx
:判断xx为真assert not xx
:判断xx不为真assert a in b
:判断b包含aassert a not in b
:判断b不包含aassert a == b
:判断a等于bassert a != b
:判断a不等于b
异常断言
可以使用pytest.raises
作为上下文管理器,当抛出异常时可以获取到对应的异常实例,然后断言它抛出的异常是不是预期的。
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 断言异常</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_zero_division</span>():</span>
<span style="color:#f92672">with</span> pytest.raises(ZeroDivisionError):
<span style="color:#d19a66">1</span> / <span style="color:#d19a66">0</span></span></span>
如任意一个自然数除以0时,由于0不能作为被除数,执行时就会抛出ZeroDivisionError异常,提示division by zero。
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 详细断言异常</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_zero_division_long</span>():</span>
<span style="color:#f92672">with</span> pytest.raises(ZeroDivisionError) <span style="color:#f92672">as</span> excinfo:
<span style="color:#d19a66">1</span> / <span style="color:#d19a66">0</span>
<span style="color:#b18eb1"><em># 断言异常类型 type</em></span>
<span style="color:#f92672">assert</span> excinfo.<span style="color:#e6c07b">type</span> == ZeroDivisionError
<span style="color:#b18eb1"><em># 断言异常 value 值</em></span>
<span style="color:#f92672">assert</span> <span style="color:#98c379">"division by zero"</span> <span style="color:#f92672">in</span> <span style="color:#e6c07b">str</span>(excinfo.value)</span></span>
注意:断言type的时候,异常类型是不需要加引号的,断言value值的时候需转str类型。
扩展
正则断言
可以将match
关键字参数传递给上下文管理器,以测试正则表达式与异常的字符串表示形式是否匹配
注意:这种方法只能断言value,不能断言type
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 自定义消息</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_zero_division_long</span>():</span>
<span style="color:#f92672">with</span> pytest.raises(ZeroDivisionError, match=<span style="color:#98c379">".*zero.*"</span>) <span style="color:#f92672">as</span> excinfo:
<span style="color:#d19a66">1</span> / <span style="color:#d19a66">0</span></span></span>
该match
方法的regexp
参数 re.search
函数匹配,因此在上面的示例中match='zero'
也可以使用
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 自定义消息</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_zero_division_long</span>():</span>
<span style="color:#f92672">with</span> pytest.raises(ZeroDivisionError, match=<span style="color:#98c379">"zero"</span>) <span style="color:#f92672">as</span> excinfo:
<span style="color:#d19a66">1</span> / <span style="color:#d19a66">0</span></span></span>
运行结果:
检查断言装饰器
当代码抛出异常时,如果和raises指定的异常类相匹配,就不会断言失败。
它相当于一个检查异常装饰器,目的是检查是否有异常(不确定是否有异常),不同使用场景:
with pytest.raise(ZeroDivisionError)
对于故意测试异常代码的情况,使用可能会更好- 而
@pytest.mark.xfail(raises=ZeroDivisionError)
对于检查未修复的错误(即可能会发生异常),使用检查断言可能会更好
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 断言装饰器</em></span>
<span style="color:#61aeee">@pytest.mark.xfail(raises=ZeroDivisionError)</span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_f</span>():</span>
<span style="color:#d19a66">1</span> / <span style="color:#d19a66">0</span></span></span>
执行结果:
最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路
作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!