Time will tell.
一、Fixture介绍
fixture
是 Pytest 特有的功能,它用pytest.fixture
标识,定义在函数前面。在编写测试函数的时候,可以将此函数名称做为传入参数, Pytest 将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
fixture
有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。
fixture
是基于模块来执行的,每个 fixture 的名字就可以触发一个fixture
的函数,它自身也可以调用其他的fixture
。
我们可以把fixture
看做是资源,在你的测试用例执行之前需要去配置这些资源,执行完后需要去释放资源。比如 module类型的fixture
,适合于那些许多测试用例都只需要执行一次的操作。
fixture
还提供了参数化功能,根据配置和不同组件来选择不同的参数。
fixture
主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture
就可以只做一次,否则每个测试用例都要做这两步也是冗余。
二、Fixture基础实例
把一个函数定义为 Fixture 很简单,只要在函数声明之前加上@pytest.fixture
。其他函数要来调用这个Fixture
,只用把它当做一个输入的参数即可。
代码:
import pytest
@pytest.fixture()
def before():
print '\nBefore each test'
def test_1(before):
print 'test_1()'
def test_2(before):
print 'test_2()'
assert 0 # For test purpose
结果:
(wda_python) bash-3.2$ pytest -q test_smtpsimple.py
.F [100%]
================================================================ FAILURES ================================================================
_________________________________________________________________ test_2 _________________________________________________________________
before = None
def test_2(before):
print 'test_2()'
> assert 0 # For test purpose
E assert 0
test_smtpsimple.py:12: AssertionError
--------------------------------------------------------- Captured stdout setup ----------------------------------------------------------
Before each test
---------------------------------------------------------- Captured stdout call ----------------------------------------------------------
test_2()
1 failed, 1 passed in 0.09 seconds
(wda_python) bash-3.2$
三、调用fixture
-
在测试用例中直接调用它,例如上面的基础实例。
-
用
fixture decorator
调用fixture
。
可以用以下3种不同的方式来写,我只变化了函数名字和类名字,内容没有变。
第一种是每个函数前声明,第二种是封装在类里,类里的每个成员函数声明,第三种是封装在类里在前声明。在可以看到3种不同方式的运行结果都是一样。
import pytest
@pytest.fixture()
def before():
print '\nBefore each test'
@pytest.mark.usefixtures("before")
def test_1():
print 'test_1()'
@pytest.mark.usefixtures("before")
def test_2():
print 'test_2()'
class Test1:
@pytest.mark.usefixtures("before")
def test_3(self):
print 'test_3()'
@pytest.mark.usefixtures("before")
def test_4(self):