Python 自动化测试框架unittest与pytest的区别(2)

发表于:2022-2-21 09:44

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

 作者:佚名    来源:CSDN

分享:
  接下来看pytest的前后置:
  1、我们都知道在自动化测试中都会用到前后置,pytest 相比 unittest 无论是前后置还是插件等都灵活了许多,还能自己用 fixture 来定义。
  首先了解一下,用例运行前后置级别如下:
  1)模块级:全局的,整个模块开只运行一次,优先于测试用例
  2)类级别:定义在类里面,只针对此类生效。类似unittest的cls装饰器
  3)函数级:只对函数生效,类下面的函数不生效。
  4)方法级:定义在类里面,每个用例都执行一次。
  def setup_module():
      print('\n整个模块 前 只运行一次')
  def teardown_module():
      print('\n整个模块 后 只运行一次')
  def setup_function():
      print('\n不在类中的函数,每个用例 前 只运行一次')
  def teardown_function():
      print('\n不在类中的函数,每个用例 后 只运行一次')
  def test_ab():
      b = 2
      assert b < 3
  def test_aba():
      b = 2
      assert b < 3
  class Test_api():
      def setup_class(self):
          print('\n此类用例 前 只执行一次')
      def teardown_class(self):
          print('\n此类用例 后 只执行一次')
      def setup_method(self):
          print('\n此类每个用例 前 只执行一次')
      def teardown_method(self):
          print('\n此类每个用例 后 执行一次')
      def test_aa(self):
          a = 1
          print('\n我是用例:a')       # pytest -s 显示打印内容
          assert a > 0
      def test_b(self):
          b = 2
          assert b < 3
   
  运行结果:
  2、这是原始用法,下面看使用Fixture,Fixture 其实就是自定义 pytest 执行用例前置和后置操作,首先创建 conftest.py 文件 (规定此命名),导入 pytest 模块,运用 pytest.fixture 装饰器,默认级别为:函数级:
   其它用例文件调用即可,如下定义一个函数,继承 conftest.py 文件里的 login 函数即可调用:
  # conftest.py配置需要注意以下点:
  # conftest.py配置脚本名称是固定的,不能改名称
  # conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
  # 不需要import导入 conftest.py,pytest用例会自动查找
  import pytest
  def test_one(login):
  print("登陆后,操作111")
  # def test_two():
  # print("操作222")
  #
  # def test_three(login):
  # print("登陆后,操作333")
   
  运行结果:
  3、扩展用法,多个自定义函数和全局级别展示:(全局的比如用于登录获取到token其他用例模块就不需要再登录了)
  import pytest
  def test_one(login):
  print("登陆后,操作111")
  def test_two(login,open_page):
  print("测试用例2")
  def test_three(open_page):
  print("测试用例3")
    
  运行结果:
  细心的人应该可以知道,测试用例2并没有调用login函数,因为前置设置的是共享模式,类似全局函数。
  参数化区别
  参数化应用场景,一个场景的用例会用到多条数据来进行验证,比如登录功能会用到正确的用户名、密码登录,错误的用户名、正确的密码,正确的用户名、错误的密码等等来进行测试,这时就可以用到框架中的参数化,来便捷的完成测试。
  参数化 就是数据驱动思想,即可以在一个测试用例中进行多组的数据测试,而且每一组数据都是分开的、独立的。
  unittest参数化其实是:ddt,叫数据驱动。
  pytest数据驱动,就是参数化,使用@pytest.mark.parametrize
  1.先看unittest如何进行参数化:
  test_data = [1,2,3]
  @ddt.ddt
  class Testddt(unittest.TestCase):
      @ddt.data(*test_data)
      def test_001(self,get_data):
          print(get_data)
  if __name__ == '__main__':
      unittest.main()
    
  运行结果:
  2.pytest中参数化的用法
  在测试用例的前面加上:
  @pytest.mark.parametrize("参数名",列表数据)
  参数名:用来接收每一项数据,并作为测试用例的参数。
  列表数据:一组测试数据。
  @pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
  示例:
  @pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
  def test_add(a,b,c):
  res = a + b
  assert res == c
  实例:
  @pytest.mark.parametrize('data',[1,2,3])
  class Testddt(object):
      def test_001(self,data):
          print(data)
  if __name__ == '__main__':
      pytest.main(['-sv'])
   
  运行结果:

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号