1.fixture介绍:
fixture区别于unittest的传统(setup/teardown)变化显著:
1.必须使用pytest.fixture装饰器装饰;
有独立的命名,并通过声明从测试函数function/模块module/类class或整个项目session的使用来激活;
·函数function:每一个函数或方法都会调用,默认是function的scope class:每个class的所有test只运行一次;
·类class:每一个类调用一次,一个类中可以有多个方法;
·模块module:每一个.py文件调用一次,该文件内又有多个function和class;
·会话session:每个session只运行一次,多个文件调用一次,可以跨.py文件调用,每个文件就是module;
2.按模块化的方式实现,每个fixture都可以相互调用;
3.fixture范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围。
4.可以和测试函数卸载同一个文件夹里;
5.fixture看做资源,在测试用例执行之前去配置这些资源,执行完后需要去释放资源;
6.fixture提供参数化功能,根据配置和不同组件来选择不同的参数。
2.fixture源码详解:
fixture(scope=‘function’,params=None,autouse=False,ids=None,name=None):
scope:有4个级别的参数,分别是:function(默认),class,module,session
·@pytest.fixture()不写参数,参数就是scope='function',它的作用范围是每个测试用例来之前运行一次,销毁代码在测试用例之后运行;
·scope='class',fixture为class级别时,如果一个class里面有多个用例,都调用了fixture,那么此fixture只在此class里所有用例开始前执行一次;
·scope='moudle',在当前.py脚本里面所有用例开始之前只执行一次;
·scope='session',可以跨.py模块调用,也就是当我们有多个.py文件的用例,如果多个用例只需调用一次fixture,那就可以设置scope='session',并且写到conftest.py文件里。
params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
autouse:如果是true,为所有测试激活fixture funct可以看到它;如果为false则显示需要参考来激活fixture
ids:每个字符串id的列表,每个字符串对应于params,这样他们就是测试ID的一部分;如果没有提供id,他们会从params自动生成
name:fixture的名称,默认为装饰函数的名称。如果fixture在定义它的同一模块,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题一种方法是将装饰函数命令 fixture_
3.conftest.py:共享fixture功能
如在实现测试期间,要使用多个测试文件中的fixture函数,则可以将其移动到conftest.py文件中。 并且,不需要导入要在测试中使用的fixture,它会自动被pytest发现。 fixture功能的发现从测试类开始,然后是测试模块,然后是conftest.py文件,最后是内置和第三方插件。
一个工程下可以建多个conftest.py的文件,一般在工程根目录下设置的conftest文件起到全局作用。在不同子目录下也可以放conftest.py的文件,作用范围只能在改层级以及以下目录生效。
1.conftest在不同的层级间的作用域不一样
2.conftest是不能跨模块调用的
4.调用fixture的三种方法:
·函数或类里面方法直接传fixture的函数参数名称
·使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
·叠加usefixture 如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。
5.用例设计原则(牢记)
1.文件名以test_*.py文件和*_test.py
2.以test_开始的函数
3.以Test开始的类
4.以test_开始的方法