xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进。pytest fixture为测试准备一个良好的测试环境,测试函数使用的每一个 fixture一般有一个参数(以 fixture 命名),测试函数经过参数访问它们。本文将介绍pytest fixture的一些基本用法。html
import pytest @pytest.fixture() def login(): print("登陆") return 8 class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n开始执行测试用例2") print(login) assert 2 + login == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
test_case2须要调用login方法(或者获取login的返回值),pytest 将会寻找并调用@pytest.fixture
标记的login() 方法。python
结果:session
PASSED [ 33%] 开始执行测试用例1 登陆 PASSED [ 66%] 开始执行测试用例2 8 PASSED [100%] 开始执行测试用例3
在测试过程当中,多个测试文件可能都要调用 fixture 函数,能够将其移动到 conftest.py 文件中。conftest.py 文件中的 fixture 函数不须要在测试函数中导入,能够被 pytest 自动识别,查找顺序从测试类开始,而后是测试模块,而后是 conftest.py 文件,最后是内置插件和第三方插件。架构
conftest.py :框架
import pytest @pytest.fixture() def login(): print("登陆") return 8
测试用例:函数
import pytest class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n开始执行测试用例2") print(login) assert 2 + login == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:测试
PASSED [ 33%] 开始执行测试用例1 登陆 PASSED [ 66%] 开始执行测试用例2 8 PASSED [100%] 开始执行测试用例3
使用yield关键字能够实现setup/teardown的功能,在yield关键字以前的代码在case以前执行,yield以后的代码在case运行结束后执行插件
import pytest @pytest.fixture() def login(): print("登陆") yield print("退出登陆") class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n开始执行测试用例2") assert 2 + 8 == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:code
PASSED [ 33%] 开始执行测试用例1 登陆 PASSED [ 66%] 开始执行测试用例2 退出登陆 PASSED [100%] 开始执行测试用例3
addfinalizer也能够实现环境的清理,实现与yield方法相同的效果,跟yield不一样的是须要注册做为终结器使用的函数。htm
import pytest @pytest.fixture() def login(request): print("登陆") def demo_finalizer(): print("退出登陆") # 注册demo_finalizer为终结函数 request.addfinalizer(demo_finalizer) class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n开始执行测试用例2") assert 2 + 8 == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:
PASSED [ 33%] 开始执行测试用例1 登陆 PASSED [ 66%] 开始执行测试用例2 退出登陆 PASSED [100%] 开始执行测试用例3
fixture 做用范围能够为module、class、session和function,默认做用域为function。
import pytest @pytest.fixture(scope="function") def login(): print("登陆...") class Test_Demo(): def test_case1(self, login): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n开始执行测试用例2") assert 2 + 8 == 10 def test_case3(self, login): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:
登陆... PASSED [ 33%] 开始执行测试用例1 登陆... PASSED [ 66%] 开始执行测试用例2 登陆... PASSED [100%] 开始执行测试用例3
一个class里面多个用例都调用了此fixture,那么只在class里全部用例开始前执行一次
import pytest @pytest.fixture(scope="class") def login(): print("登陆...")
结果:
登陆... PASSED [ 33%] 开始执行测试用例1 PASSED [ 66%] 开始执行测试用例2 PASSED [100%] 开始执行测试用例3
autouse设置为True时,自动调用fixture功能。因为默认做用域为function,不指定scope则每一个方法都会调用fixture方法。
import pytest @pytest.fixture(autouse=True) def login(): print("登陆...") class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self): print("\n开始执行测试用例2") assert 2 + 8 == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:
登陆... PASSED [ 33%] 开始执行测试用例1 登陆... PASSED [ 66%] 开始执行测试用例2 登陆... PASSED [100%] 开始执行测试用例3
在测试方法上加@pytest.mark.usefixtures()
import pytest @pytest.fixture() def login(): print("登陆...") @pytest.mark.usefixtures("login") class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 1 + 1 == 2 def test_case2(self): print("\n开始执行测试用例2") assert 2 + 8 == 10 def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:
登陆... PASSED [ 33%] 开始执行测试用例1 登陆... PASSED [ 66%] 开始执行测试用例2 登陆... PASSED [100%] 开始执行测试用例3
若是多条用例都须要调用相同参数,能够将fixture函数参数化。fixture 函数将执行每一个参数值,fixture经过固定参数request传递。
import pytest @pytest.fixture(scope="module", params=[ [1, 1, 2], [2, 8, 10], [99, 1, 100] ]) def data(request): yield request.param class Test_Demo(): def test_case1(self): print("\n开始执行测试用例1") assert 2 + 8 == 10 def test_case2(self, data): print("\n开始执行测试用例2") assert data[0] + data[1] == data[2] def test_case3(self): print("\n开始执行测试用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
结果:
PASSED [ 20%] 开始执行测试用例1 PASSED [ 40%] 开始执行测试用例2 PASSED [ 60%] 开始执行测试用例2 PASSED [ 80%] 开始执行测试用例2 PASSED [100%] 开始执行测试用例3
文章标题:Pytest测试框架(三):pytest fixture 用法
本文做者:hiyo
本文连接:https://www.cnblogs.com/hiyong/p/14163280.html 欢迎关注公众号:「测试开发小记」及时接收最新技术文章!