Unittest+Pytest自动化冒烟测试哪家强?

发表于:2022-4-25 09:48

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

 作者:码上开始    来源:51CTO博客

  前言
  之前有一段时间一直用 Python Uittest做自动化测试,觉得Uittest组织冒烟用例比较繁琐,后来我一测试开发大佬 :【知一】提示我使用pytest.mark来组织冒烟用例
  本文讲述以下几个内容:
  1、Unittest 如何组织冒烟用例
  2、Pytest 组织冒烟测试
  3、Pytest 执行unittest冒烟用例

  环境准备:
  Python 3.64
  Pytest 5.01

  项目目录:
  smoke_testing_demo
          test_case
              __init__.py
              test_case_with_unittest.py
              test_case_with_pytest.py
          run_unittest_smoke_testing.py

  一、Unittest如何组织冒烟用例
  ·当 import unittest 时 ,会自动导入TestLoader类
  · TestLoader这个类下,封装了 5 种组织用例的方法
  · 本文主要讲解 loadTestsFromNames
  · 更多Uittest组织用例方法可参考《Unittest组织用例的姿势》这篇博文,链接在文末
  loadTestsFromNames 方法简介
  $ loader.py 该文件在python3.7已不存在,建议使用python3.64 查看使用方法
  class TestLoader(object):
      """
      该类负责根据各种标准加载测试并将它们包装在TestSuite中
      """
      
      def loadTestsFromNames(self, names, module=None):
      """
      返回给定的一组用例名的测试用例的套件
      """

  loadTestsFromNames 组织冒烟用例
  测试用例
  $ test_case_with_unittest.py
  #!/usr/bin/env python3
  # encoding:utf-8
  import unittest
  class TestUittestCase(unittest.TestCase):
      def test_case_with_unittest_1(self):
          '''冒烟测试用例'''
          print('I am Smoke Testing ')
      def test_case_with_unittest_2(self):
          pass
  if __name__ == '__main__':
      unittest.main(verbosity=2)

  $ test_case_with_unittest2.py
  #!/usr/bin/env python3
  # encoding:utf-8
  import unittest
  class TestUittestCase2(unittest.TestCase):
      def test_case_with_unittest_3(self):
          '''冒烟测试用例'''
          print('I am Smoke Testing ')
      def test_case_with_unittest_4(self):
          pass
  if __name__ == '__main__':
      unittest.main(verbosity=2)

  冒烟测试用例集
  $ run_unittest_smoke_testing.py
  #!/usr/bin/env python3
  # encoding:utf-8
  import unittest
  cases = [
      'test_case.test_case_with_unittest2.TestUittestCase2.test_case_with_unittest_3',
      'test_case.test_case_with_unittest.TestUittestCase.test_case_with_unittest_1'
  ]
  test_suit = unittest.TestLoader().loadTestsFromNames(cases)
  runner = unittest.TextTestRunner(verbosity=2)
  runner.run(test_suit)

  运行结果
  test_case_with_unittest_3 (test_case.test_case_with_unittest2.TestUittestCase2)
  冒烟测试 ... ok
  test_case_with_unittest_1 (test_case.test_case_with_unittest.TestUittestCase)
  冒烟测试 ... ok
  ----------------------------------------------------------------------
  Ran 2 tests in 0.000s

  小结:
  ·通过loadTestsFromNames 可以从不同的模块组织特定的用例集
  · 使用loadTestsFromNames这个方法,需要传入一个数组
  · 数组里面里面的元素必须是字符串
  · 数组元素传入格式:‘moudleName.testCaseClassName.testCaseName’
  · 执行用例是根据数组元素的的顺序执行
  二、Pytest 组织冒烟测试
  · pytest 提供了测试用例标记机制
  · 一个测试用例允许被多个@pytest.mark进行标记
  · 同一个@pytest.mark可以标记多个测试用例
  · pytest.mark常用于冒烟测试用例组织
  pytest.mark 组织冒烟用例
  测试用例
  $ run_unittest_smoke_testing.py
  #!/usr/bin/env python3
  # encoding:utf-8
  import pytest
  @pytest.mark.test_env
  def test_case_1():
      pass
  @pytest.mark.test_env
  @pytest.mark.smoke
  def test_case_2():
      ''' 冒烟用例'''
      pass

  cd 进入 /test_case目录,使用命令行运行 test_case_with_pytest.py
  pytest test_case_with_pytest.py -v -m smoke
 
  运行结果
  collected 2 items
  test_case_with_pytest.py::test_case_2 PASSED
  ============================== 1 tests deselected ==============================
  ==================== 1 passed, 1 deselected in 0.01 seconds ====================

  运行被标记test_env的用例:
  pytest test_case_with_pytest.py -v -m test_env
  
  运行结果
  collected 2 items
  test_case_with_pytest.py::test_case_1 PASSED
  test_case_with_pytest.py::test_case_2 PASSED
  =========================== 2 passed in 0.01 seconds ===========================

  三、Pytest 执行 Unittest冒烟用例
  Pytest测试框架是兼容Python自带的Unittest
  修改test_case_with_unittest2.py
  $ test_case_with_unittest2.py
  #!/usr/bin/env python3
  # encoding:utf-8
  import unittest
  import pytest
  class TestUittestCase2(unittest.TestCase):
      @pytest.mark.smoke                 
      def test_case_with_unittest_3(self):
          '''冒烟测试用例'''
          print('I am Smoke Testing ')
      def test_case_with_unittest_4(self):
          pass
  if __name__ == '__main__':
      unittest.main(verbosity=2)

  命令行运行 test_case_with_unittest2.py
  pytest test_case_with_unittest2.py -v -m smoke
  
  运行结果
  collected 2 items / 1 deselected / 1 selected
  test_case_with_unittest2.py::TestUittestCase2::test_case_with_unittest_3 PASSED [100%]
  ============== 1 passed, 1 deselected, 1 warnings in 0.01 seconds ==============

  总结:
  1、Uittest组织冒烟用例,需通过loadTestsFromNames在不同的测试模块里指定测试用例,组装成test suit(测试套件)后,给TextTestRunner运行
  2、Pytest组织冒烟用例,只需给测试用例加上@pytest.mark.key ,使用命令行pytest -m key test_case.py 即可
  自动化冒烟测试 Unittest , Pytest 哪家强?
  个人见解:
  ·使用Uittest组织冒烟测试,关注点有至少有两个
  1、当编写新功能的冒烟测试,需要去维护冒烟测试用例集
  2、合并代码时,如果有两个人同时修改了这个冒烟用例集,还要解决冲突,防止遗漏冒烟用例
  · 使用Pytest组织冒烟测试,关注点在于用例的本身
  当编写新功能的冒烟测试,我只需在给用例加一个编写用例人员约定好的@pytest.mark,例如@pytest.mark.smoke。

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号