pytest断言方法,pytest断言失败继续

  pytest断言方法,pytest断言失败继续

  Assert断言实现原理分析前言断言声明是程序调试的一种便捷方式。

  断言可以看作是一种调试工具,Python的实现也符合这种设计理念。

  在Python中,assert语句的执行依赖于内置变量__debug__,其默认值为True。当__debug__为真时,将执行assert语句。

  扩展:

  有时候为了调试,我们要添加一些代码,通常是一些打印语句,可以写成:#在代码的调试部分,__debug__内置变量的默认值为True【所以正常运行的代码执行if __debug__代码块下的调试语句】;当程序使用-o参数运行时,__debug__内置变量的值为False,调试语句将不会运行。

  if __debug__:

  调试完成后,通过在命令行上执行-O选项,将忽略这段代码:python -o main.py

  如果使用-O参数执行python脚本文件,则内置变量__debug__为False。Asser语句不被执行。[启动Python解释器时,可以使用-O参数来关闭assert语句]

  示例:创建一个新的脚本文件testAssert.py,其内容如下:

  打印(__调试_ _)

  Assert 1 2使用python testAssert.py运行时,内置属性__debug__将输出True,assert 1 2语句将抛出AssertionError异常。

  用python -O testAssert.py运行时,内置属性__debug__会输出False,assert 1 2语句不会因为没有执行而报告任何异常。

  Assert关键字语法assert关键字语法格式如下:

  断言表达式等效于:

  如果不是表达式:

  RaiseAssertion错误断言后也可以跟参数:即用户可以选择异常的提示值。

  断言表达式[,参数]等效于:

  如果不是表达式:

  引发断言错误(arguments) 例子如下:

  打印(__调试_ _)

  定义食物:

  n=int(s)

  断言n!=0, n是零!

  返回10/n

  def main():

  foo(0 )

  if __name__==__main__ :

  Main()运行结果:

  用assert关键字编写断言pytest允许你用python标准的assert表达式编写断言;

  pytest支持显示常见python子表达式的值,包括:调用、属性、比较、二元和一元运算符等。(参考pytest支持的python失败报告演示)

  示例:

  #测试样本. py

  定义函数(x):

  返回x 1

  def测试样本():

  Assert func(3)==5运行结果:

  让你不用参考模板代码就能使用python数据结构,不用担心丢失内省;

  (4)同时,还可以为断言指定一条说明信息,用于说明用例执行失败时的情况:

  Assert a% 2==0,“值是奇数,应该是偶数”触发预期异常的断言您可以使用with pytest . raises(exception class)作为上下文管理器来编写触发预期异常的断言:

  导入pytest

  def测试匹配():

  with pytest.raises(ValueError):

  RaiseValueError( Exception 123 raised )解释:当用例不返回值Error或者没有异常返回时,断言判断失败。

  触发预期异常,同时访问异常的属性。

  导入pytest

  def测试匹配():

  使用pytest.raises(ValueError)作为exc_info:

  引发值错误(“引发了异常123”)

  str (exc_info.value)中的Assert 123 解释:exc_info是ExceptionInfo类的实例对象,封装了异常信息;常用的属性包括:类型、值和回溯;

  [注意]在上下文管理器的范围内,引发的代码必须是最后一行,否则,后面的代码不会被执行;所以,如果上面的例子改成:

  导入pytest

  def测试匹配():

  使用pytest.raises(ValueError)作为exc_info:

  引发值错误(“引发了异常123”)

  str (exc _ info.value)中的Assert 456 说明抛出异常后的语句不会被执行。

  可以向pytest.raises()传递一个关键字match,测试异常字符串表示str(ex info . value)是否符合给定的正则表达式(类似于unittest中的TestCase.assertRaisesRegexp方法)。

  导入pytest

  def测试匹配():

  with pytest.raises((ValueError,RuntimeError),match=r 。* 123 .*):

  RaiseValue Error( Exception 123 raised )#异常的字符串表示是否符合给定的正则表达式解释:pytest实际调用re.search()方法做上面的检查;而且pytest.raises()还支持检查多个预期异常(以元组的形式传递参数),我们只需要触发其中任何一个。

  断言自省什么是断言自省?当断言失败时,pytest为我们提供了非常人性化的失败解释,其中往往夹杂着相应变量的自省信息,我们称之为断言的自省;

  那么,pytest是如何做到这一点的:

  Pytest找到测试模块并引入它们。同时,pytest将复制断言语句并添加自省信息。但是,不是测试模块的断言语句将不会被复制;消除断言自省的两种方法

  在需要移除自省模块断言的docstring的属性中添加PYTEST_DONT_REWRITE字符串;Py命令行方式执行pytest案例,add - assert=plain选项;[常见]示例:

  代码如下:

  #测试_演示. py

  Foo类:

  def __init__(self,val):

  self.val=val

  def test_foo_compare():

  f1=Foo(1)

  f2=Foo(2)

  断言f1==f2正常操作的结果(断言的自省未被移除):

  删除断言自省:

  复制缓存文件pytest会将复制的模块作为缓存存储在本地。您可以通过向测试用例的根文件夹中的conftest.py添加以下配置来禁止这种行为:

  导入系统

  Sys.dont_write_bytecode=True不过,这不会妨碍你享受断言自省的好处,只是不会存储。pyc文件在本地。

  为失败的断言添加自定义描述代码,如下所示:

  #测试_演示. py

  Foo类:

  def __init__(self,val):

  self.val=val

  def __eq__(自己,其他):

  return self.val==other.val

  def test_foo_compare():

  f1=Foo(1)

  f2=Foo(2)

  断言f1==f2运行结果:

  这种方式无法直观的看到失败的原因;

  在这种情况下,我们有两种方法来解决它:

  复制Foo类的__repr__()方法:

  #测试_演示. py

  Foo类:

  def __init__(self,val):

  self.val=val

  def __eq__(自己,其他):

  return self.val==other.val

  def __repr__(self):

  返回字符串(self.val)

  def test_foo_compare():

  f1=Foo(1)

  f2=Foo(2)

  断言f1==f2运行结果:

  使用pytest_assertrepr_compare hook方法添加自定义故障描述。

  # conftest.py

  从test_demo导入Foo

  def pytest _ assert repr _ compare(op,left,right):

  如果isinstance(left,Foo)和isinstance(right,Foo)和op====:

  返回[

  比较两个Foo实例:,#立即编写摘要。

  值:{}!={}.format (left.val,right.val),#除第一行之外的所有行都可以缩进。

  ]再次执行:

  期待陌生,拥抱惊喜。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: