pytest文档5-fixture之conftest.py

前言session

前面一篇讲到用例加setup和teardown能够实如今测试用例以前或以后加入一些操做,但这种是整个脚本全局生效的,若是我想实现如下场景:
用例1须要先登陆,用例2不须要登陆,用例3须要先登陆。很显然这就没法用setup和teardown来实现了。这就是本篇学习的目的,自定义测试用例的预置条件
函数

fixture优点

1.firture相对于setup和teardown来讲应该有如下几点优点学习

  • 命名方式灵活,不局限于setup和teardown这几个命名
  • conftest.py 配置里能够实现数据共享,不须要import就能自动找到一些配置
  • scope="module" 能够实现多个.py跨文件共享前置, 每个.py文件调用一次
  • scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """使用装饰器标记fixture的功能
     ** 做者:上海-悠悠 QQ交流群:588402570**
     可使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称能够在之后使用
     引用它会在运行测试以前调用它:test模块或类可使用pytest.mark.usefixtures(fixturename标记。 
     测试功能能够直接使用fixture名称做为输入参数,在这种状况下,夹具实例从fixture返回功能将被注入。

    :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".

    :arg params: 一个可选的参数列表,它将致使多个参数调用fixture功能和全部测试使用它

    :arg autouse:  若是为True,则为全部测试激活fixture func 能够看到它。 若是为False(默认值)则显式须要参考来激活fixture

    :arg ids: 每一个字符串id的列表,每一个字符串对应于params 这样他们就是测试ID的一部分。 若是没有提供ID它们将从params自动生成

    :arg name:   fixture的名称。 这默认为装饰函数的名称。 若是fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名
                       “fixture_ <fixturename>”而后使用”@ pytest.fixture(name ='<fixturename>')“”。

Fixtures能够选择使用yield语句为测试函数提供它们的值,而不是return。 在这种状况下,yield语句以后的代码块做为拆卸代码执行,而无论测试结果如何。fixture功能必须只产生一次测试

fixture参数传入(scope="function")

1.实现场景:用例1须要先登陆,用例2不须要登陆,用例3须要先登陆url

# 新建一个文件test_fixt.py
# coding:utf-8
** 做者:上海-悠悠 QQ交流群:588402570**
import pytest

# 不带参数时默认scope="function"
@pytest.fixture()
def login():
    print("输入帐号,密码先登陆")

def test_s1(login):
    print("用例1:登陆以后其它动做111")

def test_s2():  # 不传login
    print("用例2:不须要登陆,操做222")

def test_s3(login):
    print("用例3:登陆以后其它动做333")

if __name__ == "__main__":
    pytest.main(["-s", "test_fix.py"])

运行结果:spa

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\YOYO, inifile:
collected 3 items

test_fix.py 输入帐号,密码先登陆
用例1:登陆以后其它动做111
.用例2:不须要登陆,操做222
.输入帐号,密码先登陆
用例3:登陆以后其它动做333
.

========================== 3 passed in 0.06 seconds ===========================

2.若是@pytest.fixture()里面没有参数,那么默认scope="function",也就是此时的级别的function,针对函数有效.net

conftest.py配置

1.上面一个案例是在同一个.py文件中,多个用例调用一个登录功能,若是有多个.py的文件都须要调用这个登录功能的话,那就不能把登录写到用例里面去了。
此时应该要有一个配置文件,单独管理一些预置的操做场景,pytest里面默认读取conftest.py里面的配置
设计

conftest.py配置须要注意如下点:code

  • conftest.py配置脚本名称是固定的,不能更名称
  • conftest.py与运行的用例要在同一个pakage下,而且有__init__.py文件
  • 不须要import导入 conftest.py,pytest用例会自动查找

2.参考脚本代码设计以下orm

** 做者:上海-悠悠 QQ交流群:588402570**
__init__.py

conftest.py
    # coding:utf-8
    import pytest

    @pytest.fixture()
    def login():
        print("输入帐号,密码先登陆")

test_fix1.py
    # coding:utf-8
    import pytest
    
    def test_s1(login):
        print("用例1:登陆以后其它动做111")
    
    def test_s2():  # 不传login
        print("用例2:不须要登陆,操做222")
    
    def test_s3(login):
        print("用例3:登陆以后其它动做333")
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_fix1.py"])

test_fix2.py
    # coding:utf-8
    import pytest
    
    def test_s4(login):
        print("用例4:登陆以后其它动做111")
    
    def test_s5():  # 不传login
        print("用例5:不须要登陆,操做222")
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_fix2.py"])

3.单独运行test_fix1.py和test_fix2.py都能调用到login()方法,这样就能实现一些公共的操做能够单独拿出来了
---------------------------------pytest结合selenium自动化完整版-------------------------

全书购买地址 https://yuedu.baidu.com/ebook/902224ab27fff705cc1755270722192e4536582b

做者:上海-悠悠 QQ交流群:874033608

也能够关注下个人我的公众号:yoyoketang

相关文章
相关标签/搜索