zoukankan      html  css  js  c++  java
  • python pytest测试框架介绍三

    之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例

    1、pytest fixture实例1

    代码如下

    from __future__ import print_function
    import pytest
     
    @pytest.fixture(scope='module')
    def resource_a_setup(request):
        print('
    resources_a_setup()')
        def resource_a_teardown():
            print('
    resources_a_teardown()')
        request.addfinalizer(resource_a_teardown)
     
    def test_1_that_needs_resource_a(resource_a_setup):
        print('test_1_that_needs_resource_a()')
     
    def test_2_that_does_not():
        print('
    test_2_that_does_not()')
     
    def test_3_that_does(resource_a_setup):
        print('
    test_3_that_does()')

    使用-s -v运行查看详情如下

    这里使用的了pytest的特有的模式来写用例,使用的方式是scope方式,scope支持多种,后面会介绍

    这里还使用了pytest的addfinalizer内置功能,具体可参见官网,用处是:在最后一个测试项目中调用teardown

    2、pytest fixture实例2

    代码如下

    from __future__ import print_function
    import pytest
     
    @pytest.fixture()
    def resource_a():
        print('
    resources_a() "setup"')
     
    def test_1_that_needs_resource_a(resource_a):
        print('test_1_that_needs_resource_a()')
     
    def test_2_that_does_not():
        print('
    test_2_that_does_not()')
     
    def test_3_that_does(resource_a):
        print('test_3_that_does()')

    这是最简单的一个例子,结果如下

    可以看出测试用例继承了用pytest.fixture的函数后,都执行了setup的功能,默认的pytest.fixture是function

    3、使用pytest.fixture的几种方法

    在写用例时,有几种方法使用pytest.fixture来形成框架,

    方法一:


    就是上面提到的这种方法,如下

    pytest.fixture()
    def before():
        print('
    before each test')
     
    def test_1(before):
        print('test_1()')
     
    def test_2(before):
        print('test_2()')

    方法二:使用fixture修饰

    @pytest.fixture()
    def before():
        print('
    before each test')
    
    
    @pytest.mark.usefixtures("before") 
    def test_1():
        print('test_1()')
     
    @pytest.mark.usefixtures("before") 
    def test_2():
        print('test_2()')

    标红的就是修饰器

    4、fixture scope的范围参数

    之前使用@pytest.fixture(scope='module')来定义框架,scope的参数有以下几种

    •  function   每一个用例都执行
    • class        每个类执行
    • module     每个模块执行(函数形式的用例)
    • session     每个session只运行一次,在自动化测试时,登录步骤可以使用该session

     如下一个用module例子

    @pytest.fixture(scope='module')
    def resource_a():
        print('
    resources_a() "setup"')
     
    def test_1_that_needs_resource_a(resource_a):
        print('test_1_that_needs_resource_a()')
     
    def test_2_that_does_not():
        print('
    test_2_that_does_not()')
     
    def test_3_that_does(resource_a):
        print('test_3_that_does()')

    即使我们在每个用例都继承了resource_a,但在实际测试中,所有用例只执行了一次resource_a

    这时,你可能会问,为什么只这setup功能,没有teardown功能,要teardown怎么写,方法如下:

    def cheese_db(request):
        .....
       
        def teardown():
            print('
    [teardown] cheese_db finalizer, disconnect from db')
        request.addfinalizer(teardown)

    这里使用的还是之前介绍的request.addfinalizer功能,函数名字可以任意取,不一定要teardown

    5、带参数的fixture

    这里就不介绍了,看官方文档

    6、多种fixture scope结合使用

    看代码,如下

    @pytest.fixture(scope="module")
    def foo(request):
        print('
    foo setup - module fixture')
        def fin():
            print('foo teardown - module fixture')
        request.addfinalizer(fin)
     
    @pytest.fixture()
    def bar(request):
        print('bar setup - function fixture')
        def fin():
            print('bar teardown - function fixture')
        request.addfinalizer(fin)
     
    @pytest.fixture()
    def baz(request):
        print('baz setup - function fixture')
        def fin():
            print('baz teardown - function fixture')
        request.addfinalizer(fin)
     
    def test_one(foo, bar, baz):
        print('in test_one()')
     
    def test_two(foo, bar, baz):
        print('in test_two()')

    测试结果如下

    pytest还有很有用的yield功能,后续再介绍

  • 相关阅读:
    免费录屏工具
    树莓派4安装mysql
    python中,print、变量、赋值详细理解篇01
    mysql db [Warning] IP address 'xxxx' could not be resolved: Name or service not known
    添加脚本命令
    LRUCache实现方案
    HTTP/2做错了什么?刚刚辉煌2年就要被弃用了!?
    TS 中的 export declare interface 和 export interface 到底有什么不同?
    使用nexus搭建npm私服
    nodejs 安装
  • 原文地址:https://www.cnblogs.com/landhu/p/7462999.html
Copyright © 2011-2022 走看看