前言
学pytest就不得不说fixture,fixture是pytest的精髓所在,就像unittest中的setup和teardown一样,如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。
fixture用途
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
fixture定义
fi本文来源gaodaimacom搞#^代%!码&网(xture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture,看个实例
# test_fixture.py import pytest @pytest.fixture() def fixtureFunc(): return 'fixtureFunc' def test_fixture(fixtureFunc): print('我调用了{}'.format(fixtureFunc)) if __name__=='__main__': pytest.main(['-v', 'test_fixture.py'])
执行结果
test_fixture.py .我调用了fixtureFunc [100%] ========================== 1 passed in 0.02 seconds =========================== Process finished with exit code 0
fixtureFunc 这个函数就是一个fixture,fixture函数内部可以实现一些初始化操作!
fixture使用
调用fixture有三种方式
方式1
fixture的名字直接作为测试用例的参数,上面的实例就这这种方式,再来看一个实例
# test_fixture.py import pytest @pytest.fixture() def fixtureFunc(): return 'fixtureFunc' def test_fixture(fixtureFunc): print('我调用了{}'.format(fixtureFunc)) class TestFixture(object): def test_fixture_class(self, fixtureFunc): print('在类中使用fixture "{}"'.format(fixtureFunc)) if __name__=='__main__': pytest.main(['-v', 'test_fixture.py'])
方式2
每个函数或者类前使用@pytest.mark.usefixtures(‘fixture’)装饰器装饰
实例
# test_fixture.py import pytest @pytest.fixture() def fixtureFunc(): print('\n fixture->fixtureFunc') @pytest.mark.usefixtures('fixtureFunc') def test_fixture(): print('in test_fixture') @pytest.mark.usefixtures('fixtureFunc') class TestFixture(object): def test_fixture_class(self): print('in class with text_fixture_class') if __name__=='__main__': pytest.main(['-v', 'test_fixture.py'])
方式3
指定fixture的参数autouse=True这样每个测试用例会自动调用fixture(其实这里说的不是很准确,因为还涉及到fixture的作用范围,那么我们这里默认是函数级别的,后面会具体说fixture的作用范围)
实例
# test_fixture.py import pytest @pytest.fixture(autouse=True) def fixtureFunc(): print('\n fixture->fixtureFunc') def test_fixture(): print('in test_fixture') class TestFixture(object): def test_fixture_class(self): print('in class with text_fixture_class') if __name__=='__main__': pytest.main(['-v', 'test_fixture.py'])
结果
fixture->fixtureFunc .in test_fixture fixture->fixtureFunc .in class with text_fixture_class [100%] ========================== 2 passed in 0.04 seconds ===========================