网站建设开发方式包括购买,中国设计之窗官方网站,手机网站设计手机壳尺寸一览表,vps服务器中的网站不显示图片Pytest 是一个功能强大的 Python 测试框架#xff0c;其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据#xff0c;这些环境和数据可以在多个测试用例中重复使用。通过使用fixture#xff0c;你可以避免在每个测试函数中编写重复的…Pytest 是一个功能强大的 Python 测试框架其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据这些环境和数据可以在多个测试用例中重复使用。通过使用fixture你可以避免在每个测试函数中编写重复的设置和清理代码使得测试更加干净、简洁并提高代码的可维护性。
本文将介绍 Pytest Fixture 的概念、用途以及十种常见的使用方法并提供相应的示例代码。
1、什么是 Fixture
Fixture 是 Pytest 中用于提供测试环境的一种机制它可以在测试函数执行前后进行一些准备工作和清理工作如初始化数据库连接、创建临时文件等。Fixture 可以被多个测试用例共享使用从而提高测试代码的复用性和可维护性。
2、Fixture用途
fixture的主要用途包括 设置测试环境例如配置数据库连接、初始化外部服务等。 准备测试数据提供测试所需的数据如用户信息、产品列表等。 模拟外部依赖当测试难以直接访问外部系统时可以使用fixture来模拟这些系统的行为。 执行特定操作在测试前后执行某些特定操作如临时修改配置、记录日志等。 共享资源在不同的测试用例之间共享资源减少资源的创建和销毁开销。
3、10种常见用法及示例
1. 基础使用 import pytestpytest.fixturedef sample_data():return [1, 2, 3]def test_example(sample_data):assert sum(sample_data) 6
2. 带参数的fixture import pytestpytest.fixture(params[1, 2, 3])def number(request):return request.paramdef test_number(number):assert number in [1, 2, 3]
3. 使用范围scope
在pytest中fixture的作用域决定了测试夹具的生命周期以及它们能被哪些测试用例或测试类访问。以下是pytest中fixture的几种作用域及其用途 function这是fixture的默认作用域。当不指定scope参数时fixture会在每个测试函数执行前被调用并在测试函数结束后清理。它适用于需要为每个测试准备和清理资源的场合。例如打开和关闭数据库连接、初始化和释放内存空间等。 class当设置scopeclass时fixture会在一个测试类开始前被调用一次然后在整个类的所有测试方法运行完毕后被清理。这适用于整个测试类共享的准备工作如创建共享的测试环境或对象。 module如果设置scopemodule则fixture会在整个模块的第一个测试开始前被调用并在模块中的所有测试完成后被清理。这通常用于模块级别的资源管理比如建立和断开与外部服务的连接。 package/package.module当设置为scopepackage或scopepackage.module时fixture将在整个包或指定的包的模块中运行一次。这适用于跨模块或跨包共享的测试资源例如配置全局服务或执行一次性的环境设置。 session通过scopesession设置fixture将在整个测试会话中只运行一次。这适用于开销较大且所有测试用例都可以共享的准备步骤如复杂的系统级设置或一次性的资源分配。 instance如果设置了scopeinstance则可以为每个测试实例创建一个fixture实例。这允许在不同的测试用例之间共享状态而不需要在每个测试用例中重新准备。 classinstance通过scopeclassinstance可以为每个测试类创建一个fixture实例。与instance类似但适用于在类的不同方法间共享状态。 once使用scopeonce时fixture只会被调用一次无论被多少个测试用例或测试类引用。这对于单例资源管理或确保某些操作只执行一次非常有用。
例如 import pytestpytest.fixture(scopeclass)def class_fixture():print(setup)yield dataprint(teardown)def test_use_fixture(class_fixture):assert class_fixture data
通过合理选择不同的fixture作用域可以有效地组织和管理测试代码提高测试的效率和可维护性。
4. fixture的依赖
可以指定一个fixture依赖于其他fixture。 import pytestpytest.fixturedef db():return sqlite:///:memory:pytest.fixturedef session(db):return create_session(db)def test_database(session):assert isinstance(session, Session)
示例2: import pytestpytest.fixturedef login():user User()user.login()yield useruser.logout()pytest.fixturedef profile(login):return login.get_profile()
5. 使用autouse自动应用
通过设置autouseTrue无需手动将fixture作为参数传递到测试用例中。 import pytestpytest.fixture(autouseTrue)def print_hello():print(Hello, World!)def test_example():pass
6. 使用request对象访问fixture
request对象可以用来访问调用的fixture及其参数。 import pytestpytest.fixture(params[1, 2, 3])def numbers(request):return request.param * 2def test_numbers(numbers):assert numbers % 2 0
7. 异常处理
可以对fixture中的异常进行处理。 import pytestpytest.fixture(autouseTrue)def exception_handler():try:yield some setup codeexcept Exception as e:print(fHandled exception: {e})raise edef test_example():raise ValueError(test error)
8. 使用indirect间接引用
indirect 参数是 Pytest 中 Fixture 的一个高级用法在pytest中indirect参数用于间接引用fixture。
indirectTrue 是 pytest.mark.parametrize 装饰器的一个可选参数。当设置为 True 时它告诉 pytest对应的参数值不是一个直接的输入值而是一个用于请求 fixture 的名称。这意味着pytest 会查找一个与参数值同名的 fixture并使用该 fixture 的返回值作为测试用例的参数。
当使用indirect时它允许你通过一个fixture的名称来引用另一个fixture而不是直接使用它的返回值。这在某些情况下非常有用比如当你需要将一个fixture的返回值作为另一个fixture的输入。
使用方法 在测试函数的参数列表中指定需要间接引用的 Fixture 名称。 在 pytest.mark.parametrize 装饰器中使用 indirectTrue 参数来启用间接引用。
示例1: import pytest pytest.fixture def test_data(request): # 这里只是一个简单的示例你可以根据需要生成更复杂的测试数据 data request.param return data * 2
然后我们编写一个测试用例并使用 pytest.mark.parametrize 装饰器来参数化它。注意我们在 indirectTrue 时传递 fixture 名称 test_data而不是直接的测试数据值 def test_example(test_data): assert test_data 0
最后我们使用 pytest.mark.parametrize 来指定测试数据的范围并将 indirect 设置为 True pytest.mark.parametrize(test_data, [1, 2, 3], indirectTrue) def test_example(test_data): assert test_data 0
在这个例子中pytest 会为每一组测试数据1, 2, 3调用 test_data fixture并将 fixture 的返回值即数据的两倍作为 test_example 测试用例的参数。因此test_example 测试用例实际上会运行三次每次使用不同的参数值2, 4, 6。
通过这种方式你可以使用 fixtures 来生成复杂的测试数据并通过 pytest.mark.parametrize 和 indirectTrue 来参数化你的测试用例。
示例2indirect间接引用fixture另外一种用法 import pytest# 定义一个fixture返回一个字符串pytest.fixturedef string_fixture():return Hello, World!# 定义另一个fixture接受一个字符串作为参数并返回其长度pytest.fixturedef length_fixture(request):string request.getfixturevalue(string_fixture)return len(string)# 使用indirect间接引用length_fixture并将结果传递给test_example测试函数def test_example(length_fixture):assert length_fixture 13
在上面的示例中我们定义了两个fixturestring_fixture和length_fixture。string_fixture返回一个字符串而length_fixture接受一个字符串作为参数并返回其长度。
在test_example测试函数中我们使用indirect间接引用了length_fixture并将其结果传递给测试函数。这样pytest会自动解析length_fixture的依赖关系并获取string_fixture的返回值作为输入。
运行上述代码将会执行test_example测试函数并断言字符串的长度是否为13。由于使用了indirect间接引用我们可以灵活地管理fixture之间的依赖关系并在测试中使用它们的结果。
9. 使用fixtures获取所有fixtures
可以获取当前测试用例的所有fixtures。 import pytestpytest.fixture(scopemodule)def module_fixture():return module datadef test_example(module_fixture, request):fixtures request.getfixturevalue(module_fixture)assert fixtures module data
10. 自定义fixture解析器
可以自定义解析器来控制如何解析fixture的名称。 import pytestfrom pytest_mock import MockerFixturepytest.fixture(scopemodule, autouseTrue)def my_custom_parser(request, mocker: MockerFixture):mocker.patch(my_module.some_function, return_valuemocked value)request.addfinalizer(lambda: mocker.stop())
以上是pytest fixture的10种常见用法及示例它们涵盖了从基本使用到高级技巧的各个方面。掌握这些用法可以帮助你编写更加高效和易于维护的测试代码。 最后感谢每一个认真阅读我文章的人下方这份完整的软件测试教程已经整理上传完成需要的朋友们可以文末自行领取【保证100%免费】
这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你