pytest测试框架1-强大的Fixture功能
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处连接和本声明。session
本文连接:https://blog.csdn.net/qq_30758629/article/details/95923286框架
1.fixture是 干什么用的??函数
fixture是在测试函数运行先后,由pytest执行的外壳函数;代码能够定制,知足多变的测试需求;测试
包括定义传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源等等...url
fixture是pytest用于将测试先后进行预备,清理工做的代码分离出核心测试逻辑的一种机制!spa
2.举个例子.net
@pytest.fixture() def some_data(): return 42 def test_some_data(some_data): assert some_data == 42
#@pytest.fixture() 装饰器用于声明函数是一个fixturecode
若是测试函数的参数列表中包含fixture名字,那么pytest会检测到,blog
检测顺序是:优先搜索该测试所在的模块,而后搜索conftest.pyget
并在测试函数运行以前执行该fixture,
fixture能够完成测试任务,也能够返回数据给测试函数
pytest --setup-show test_example1.py
3.fixture函数放在哪里合适?
1.能够放在单独的测试文件里
2.若是但愿多个测试文件共享fixture,能够放在某个公共目录下新建一个conftest文件,将fixture放在里面。
4.使用fixture传递测试数据
fixture很是适合存放测试数据,而且他能够返回任何数据
@pytest.fixture() def a_list(): return [1,2,3,44,5] def test_a_list(a_list): assert a_list[2] == 3
5.指定fixture做用范围
fixture里面有个scope参数能够控制fixture的做用范围:session > module > class > function
1)function 每个函数或方法都会调用 \ @ pytest.fixture() def first(): print("\n获取用户名") a = "xiaoyulaoshi" return a @pytest.fixture(scope="function") def sencond(): print("\n获取密码") b = "123456" return b def test_1(first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" def test_2(sencond): '''用例传fixture''' print("测试密码:%s" % sencond) assert sencond == "123456" 2).class 每个类调用一次,一个类能够有多个方法 @pytest.fixture(scope="class") def first(): print("\n获取用户名,scope为class级别只运行一次") a = "xiaoyulaoshi" return a class TestCase(): def test_1(self, first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" def test_2(self, first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" 3).module,每个.py文件调用一次,该文件内又有多个function和class import pytest @pytest.fixture(scope="module") def first(): print("\n获取用户名,scope为module级别当前.py模块只运行一次") a = "xiaoyulaoshi" return a def test_1(first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" class TestCase(): def test_2(self, first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" 4).session 是多个文件调用一次,能够跨.py文件调用,每一个.py文件就是module 当咱们有多个.py文件的用例时候,若是多个用例只需调用一次fixture,那就能够设置为scope = "session",而且写到conftest.py文件里 conftest.py import pytest @pytest.fixture(scope="session") def first(): print("\n获取用户名,scope为session级别多个.py模块只运行一次") a = "xiaoyulaoshi" return a test_fixture11.py import pytest def test_1(first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi" import pytest def test_2(first): '''用例传fixture''' print("测试帐号:%s" % first) assert first == "xiaoyulaoshi"
6.fixture的参数化
pytest支持在多个完整测试参数化方法:
1).pytest.fixture(): 在fixture级别的function处参数化
2).@pytest.mark.parametrize:容许在function或class级别的参数化,为特定的测试函数或类提供了多个argument/fixture设置。
3_.pytest_generate_tests:能够实现本身的自定义动态参数化方案或扩展。
import pytest import requests par_to_test=[{ "case": "serach a word :haha", "headers": {}, "querystring": { "wd":"hah" }, "payload": {}, "expected": { "status_code":200 } }, { "case": "serach a word2 :kuku", "headers": {}, "querystring": { "wd":"kuku" }, "payload": {}, "expected": { "status_code":200 } }, { "case": "serach a word3 :xiaoyulaoshi", "headers": {}, "querystring": { "wd":"xiaoyulaoshi" }, "payload": {}, "expected": { "status_code":200 } } ] @pytest.fixture(params = par_to_test) def class_scope(request): return request.param def test_baidu_search(class_scope): url = "https://www.baidu.com" r = requests.request("GET", url, data=class_scope["payload"], headers=class_scope["headers"], params=class_scope["querystring"]) assert r.status_code == class_scope["expected"]["status_code"]