暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「Pytest」工具美眉之初学Pytest测试框架

将咖啡转化为程序的工具人 2021-09-09
764

自动化测试是包括工具美眉在内的所有测试开发们日常的一项重要工作。通过编写接口或UI自动化测试脚本,把我们从繁琐的重复手工测试中解脱出来,帮助我们去完成大量的回归任务,保证质量。


自动化测试框架的作用是什么?

能够帮助我们管理测试用例、进行测试环境准备、执行测试用例、参数化、断言、生成测试报告等等。让我们把更多的精力放在测试用例的编写上。


好的自动化测试框架具有以下这些特点:

  • 清晰明了,学习成本低

  • 代码规范

  • 模块化、可重用,便于替换修改

  • 通用性强、可维护、可扩展

  • 对错误的处理能力强

  • 日志清晰,方便调用

  • 运行效率高且功能强大 、支持测试环境切换、支持外部数据驱动、支持顺序、并发、远程运行

  • 报告完备详尽

  • 支持版本控制

  • 支持持续集成 


市面上有众多的基于python的开源的自动化测试框架,如robotframework,unittest,pytest等等,它们到底有什么区别?该如何选择一款自动化测试框架?

为什么pytest会脱颖而出呢?因为它是一个简单来说,大家用了就会喜欢上的测试框架。先来说说它的优点和特性:


1.写法上更加灵活,pytest框架自动发现testcase机制


在使用unittest编写测试用例的时候,需要遵循先创建testclass,测试类继承unittest.TestCase的固定样例的代码。

    class TestLogin(unittest.TestCase):
        def test_login_success(self):
            ...
            self.assert_true(...)

    而pytest不需要如此不灵活的方式去定义一个测试方法,可以直接通过python原生的定义一个方法的形式:

      def test_login_success():
          x = 1
          assert x == 1

      pytest兼容了unittest,也就是可以在pytest可以运行unittest形式编写的测试脚本。

      pytest能够智能扫描所有的文件:

      • 以test_*.py 命名的文件,pytest 认为都是测试脚本

      • 以test_* 命名的方法,pytest认为都是测试方法

      • 以Test*命名的类,pytest认为都是测试类


      2.灵活的fixture,可以向test方法以参数的形式,注入对数据,环境,或其他资源的依赖。

        @pytest.fixture
        def person():
           return User('工具美眉')
         
        def test_login(person):
            assert person.name == '工具美眉'

        通过加上@pytest.fixture注解定义一个fixture的对象,可以通过名字向任意test_function以入参的方式注入此依赖。无需import, pytest框架也可以自动扫描得到所有的fixture。它们会在执行test_function之前被初始化完成,并缓存起来,在不同的scope作用域进行缓存。

          @pytest.fixture(scope="function")
          def person():
              sleep(1)
          return User('工具美眉')


          def test_function1(person):
              assert ...
              
          def test_function2(person):
              assert ...

          定义fixture为scope = function时,则每次执行一个test_function前,都会先初始化一次fixture,则执行完上面两个test方法,一共需要花费的时间是2秒。有时fixture不需要重复初始化,例如数据库的连接操作,或者登陆操作,只需要在所有test_function前初始化一次即可,则可以把scope定义到module、session级别。

            @pytest.fixture(scope="module")
            def person():
            sleep(1)
            return User('工具美眉')


            def test_function1(person):
            assert ...


            def test_function2(person):
            assert ...

            执行完上面两个test方法,一共需要花费的时间只需要1秒,因为定义fixture(scope="module"),则fixture初始化后的对象会被缓存在整个module作用域。

            当然你也可以在fixture里不仅可以去做数据准备工作,也可以去完成一些善后的工作,例如:

              @pytest.fixture(scope='module')
              def user():
                  personA = personA()
                  yield personA
                  personA.logout()


              def test_login(user):
                  assert ...

              yield将user这个fixture拆分成了两部分,yield之前在test_function之前运行,yield之后将在test_function之后运行。


              3.丰富的插件

              • 定制化的结果报告pytest-html,pytest-emoji,pytest-instafail

              • 失败重跑 pytest-rerunfailures,pytest-repeat

              • 多重校验 pytest-assume

              • 设定执行顺序 pytest-ordering

              • 多个测试case并行执行的分布式测试(pytest-xdist)

              • 覆盖率及mock pytest-cov , pytest-mock    

              • 集成其他框架pytest-selenium,pytest-django,pytest-twisted


              总结一下pytest这个自动化测试框架的优点吧:

              • python非常容易上手,入门简单,官方文档丰富,文档中有很多实例可以参考

              • 能够支持简单的单元测试以及复杂的功能测试

              • 支持参数化

              • 丰富的report

              • 支持重复执行失败的 case

              • 支持兼容运行由 nose , unittest 编写的测试 case

              • 具有很多第三方插件,并且可以自定义扩展

              • 方便的和持续集成的工具集成


              pytest由于纯Python编写,需要测试人员具有一定的python代码编写与阅读能力,pytest本身没有直观的用例显示与浏览页面,可以借助第三方模块展示用例分布情况(比如Allure)。今天对pytest的简单介绍就到这吧,之后我们会以具体的实战+理论的方式,一起学习pytest框架吧。


              如果文章对你有所帮助,请记得点赞和转发哦👍

              文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论