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

发表于:2020-12-23 10:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:测试安静    来源:51Testing软件测试网原创

  前言 
  我们在写自动化的过程中,用例的断言也是至关重要的,断言可以帮助我们判断用例测试点是否成功和失败。当然在我们这么强大的pytest框架中,断言也是比较强大的。为什么?继续往下看。 
  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.mai

      版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号