前言
fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手!
fixture简介
fixture的目的是提供一个固定基线,在该基线上测试可以可靠地和重复地执行。fixture提供了区别于传统单元测试(setup/teardown)有显著改进:
- 有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
- 按模块化的方式实现,每个fixture都可以互相调用。
- fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化,或者跨函数 function、类class、模块module或整个测试会话sessio范围。
fixture作为参数传入
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名。
fixture是可以有返回值的,如果没return默认返回None。用例调用fixture的返回值,直接就是把fixture的函数名称当成变量名称,如下案例
# test_fixture1.py import pytest @pytest.fixture() def user(): print("获取用户名") a = "yoyo" return a def test_1(user): assert user == "yoyo" if __name__ == "__main__": pytest.main(["-s", "test_fixture1.py"])
运行结果
============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 rootdir: D:YOYOfixt, inifile: plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10 collected 1 item test_fixture1.py 获取用户名 . ========================== 1 passed in 0.20 seconds ===========================
error和failed区别
测试结果一般有三种:passed、failed、error。(skip的用例除外)
如果在test_用例里面断言失败,那就是failed
# test_fixture2.py import pytest @pytest.fixture() def user(): print("获取用户名") a = "yoyo" return a def test_1(user): assert user == "yoyo111" # 用例失败就是failed if __name__ == "__main__": pytest.main(["-s", "test_fixture2.py"])
如果在fixture里面断言失败了,那就是error
test_fixture3.py import pytest @pytest.fixture() def user(): print("获取用户名") a = "yoyo" assert a == "yoyo123" # fixture失败就是error return a def test_1(user): assert user == "yoyo" if __name__ == "__main__": pytest.main(["-s", "test_fixture3.py"])