在上一篇fixture的案例实在同一个.py文件中,多个用例调用一个登陆功能,如果有多个.py的文件都需要调用这个登陆功能的haul,那就不能把登陆写到用例py文件中了。
此时需要一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置
一、特点
conftest.py配置需要注意以下几点:
-conftest.py配置脚本的名称是固定的,不能改名
-conftest.py 域运行的用例要在同一个package下,并且要有__init__.py文件
- 不需要import导入conftest.py,pytest会自动查找
-conftest.py文件不能被其他文件导入
-所有同目录测试文件运行前都会执行conftest.py文件
二、conftest.py的用法
conftest.py文件实际应用需要结合fixture来使用,fixture中参数scope也适用于conftest中的fixture特性,这里说明一下:
1、fixture源码详解:
fixture(scope = 'function',params = None,autouse = False,ids = None,name = None)
fixture 里面有个scope参数可以控制fixture的作用范围,scope:有四个参数级别“function”-默认,class module session
params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
autouse:如果为True,则为所有测试激活fixture func可以看到它。如果为False则显式需要参来激活fixture,参考怎么激活呢?就是在调用fixture函数的 函数中传递fixture函数名
ids:每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分,如果没有提供ID它们将从params自动生成
name:fixture函数的名称,这默认为被装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称江北请求夹具的功能arg遮蔽,解决这个问题的一种方法是将装饰函数命令
"fixture_<fixturename>"然后使用@pytest.fuxture(name = 'fixture_name')
2、fixture的作用范围
fixture里面有个scope参数可以控制fixture的作用范围 session>module>class>function
-function:每个函数或者方法都会调用
-class:每个类调用一次,一个类中可以有多个方法
-module:每个.py文件调用一次,该文件内有多个functions和class
-session/package: 是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
3、conftest结合fixture的使用
-conftest中的fixture的scope参数为session/ package(看fixture源代码 session和 package都支持,而且作用范围也一样),所有测试的.py文件执行前执行一次
-conftest中fixture的scope参数为module,每一个测试.py文件执行前都会执行一次conftest文件中的fixture
-conftest中fixture的scope参数为class,每一个测试文件中的测试类执行前都会执行一次conftest文件中的fixture
-conftest中fixture的scope参数为function,所有文件的测试用例执行前都会执行一次conftest文件中的fixture
例子:
conftest.py文件如下:
import pytest @pytest.fixture(scope='function') def login(): print("\n fixture login function") return 'hahaha'
test_fix1.py文件如下:
import pytest def test_s1(login): print("test_s1-------------") x = 'this' assert 'h' in x @pytest.mark.usefixtures('login') def test_s2(): print("test_s2----------------") x = 'hello' assert hasattr(x,'hello') if __name__ == '__main__': pytest.main(['-s'])
运行结果如下:----每次测试用例执行前都执行 fixture函数
============================= test session starts ============================= collecting ... collected 2 items test_fix1.py::test_s1 fixture login function PASSED [ 50%]test_s1------------- test_fix1.py::test_s2 fixture login function FAILED [100%]test_s2---------------- test_fix1.py:17 (test_s2) @pytest.mark.usefixtures('login') def test_s2(): print("test_s2----------------") x = 'hello' > assert hasattr(x,'hello') E AssertionError: assert False E + where False = hasattr('hello', 'hello') test_fix1.py:22: AssertionError ========================= 1 failed, 1 passed in 0.11s =========================