前言session
前面一篇讲到用例加setup和teardown能够实如今测试用例以前或以后加入一些操做,但这种是整个脚本全局生效的,若是我想实现如下场景:
用例1须要先登陆,用例2不须要登陆,用例3须要先登陆。很显然这就没法用setup和teardown来实现了。这就是本篇学习的目的,自定义测试用例的预置条件函数
1.firture相对于setup和teardown来讲应该有如下几点优点学习
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功能必须只产生一次测试
1.实现场景:用例1须要先登陆,用例2不须要登陆,用例3须要先登陆设计
# 新建一个文件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"])
运行结果:code
============================= 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,针对函数有效orm
1.上面一个案例是在同一个.py文件中,多个用例调用一个登录功能,若是有多个.py的文件都须要调用这个登录功能的话,那就不能把登录写到用例里面去了。
此时应该要有一个配置文件,单独管理一些预置的操做场景,pytest里面默认读取conftest.py里面的配置utf-8
conftest.py配置须要注意如下点:字符串
2.参考脚本代码设计以下get
** 做者:上海-悠悠 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