📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在Python的测试框架pytest中,conftest.py是一个特殊的文件,它允许你定义一些在多个测试文件或测试类中共享的fixture,钩子函数和插件。它是pytest的核心组成部分,提供了极大的灵活性和便利性。本文将会带你深入了解conftest.py的精髓,包括其是什么、用途、使用方法和高级示例。
1、conftest.py是什么?
conftest.py是一个pytest的特殊文件,它位于项目的根目录下或者测试目录中,当pytest运行测试时,会自动寻找并加载该文件。你可以在conftest.py中定义一些全局的配置、fixture、钩子函数或其他工具函数等,这些都可以在整个测试套件中被共享和重用。这种机制使得你可以将一些公共的、可复用的测试设置和逻辑集中管理,提高了代码的复用性和可维护性。
2、conftest.py的常见用途
定义全局配置:我们可以在conftest.py中设置一些全局的配置,比如添加标记、设置默认参数等。
定义fixtures:我们可以在conftest.py中定义一些常用的fixtures,这些fixtures可以在测试用例中直接使用,无需重复定义。
定义工具函数:我们可以在conftest.py中定义一些工具函数,这些函数可以在测试用例中直接调用,提高了代码的复用性。
定义钩子函数:pytest提供了许多钩子函数,允许你在测试的不同阶段执行自定义的代码。在conftest.py中定义的钩子函数可以在整个测试套件中生效。
插件扩展:conftest.py也可以用来定义和注册pytest插件,这为你提供了更多的自定义和扩展pytest功能的可能性。
3、conftest.py的使用用法
编写 Pytest Conftest 文件非常简单,只需在项目中创建一个名为 conftest.py 的 Python 文件,并在其中编写配置、夹具和插件注册的代码。以下是一个简单的示例:
# conftest.py
import pytest
@pytest.fixture
def setup():
print("Setting up test environment")
yield
print("Tearing down test environment")
def pytest_configure(config):
config.addinivalue_line("markers", "custom_marker: custom marker for tests")
在这个示例中,我们定义了一个名为 setup 的夹具,用于设置和清理测试环境。同时,我们还通过 pytest_configure 函数注册了一个自定义的标记(marker)用于标记测试用例。
1、定义fixture:
在conftest.py中定义fixture,你可以使用@pytest.fixture装饰器。例如:
# conftest.py
import pytest
@pytest.fixture
def my_fixture():
return "Hello, pytest!"
然后,在你的测试文件中,你可以使用my_fixture这个fixture:
# test_example.py
def test_example(my_fixture):
assert my_fixture == "Hello, pytest!"
2、定义钩子函数:
你可以使用pytest提供的钩子函数名称作为函数名,pytest会在适当的时机调用这些函数。例如,你可以在conftest.py中定义pytest_configure钩子函数,它在pytest开始收集测试之前被调用:
# conftest.py
def pytest_configure(config):
print("pytest is starting...")
4、高级示例
除了基本的用法外,Pytest Conftest 还支持一些高级用法,如:
参数化夹具:可以通过参数化夹具实现更灵活的测试数据生成。例如:
import pytest
@pytest.fixture(params=[1, 2, 3])
def param_fixture(request):
return request.param
夹具之间的依赖关系:可以通过夹具之间的调用和传参建立依赖关系。例如:
import pytest
@pytest.fixture
def login():
user = User()
user.login()
yield user
user.logout()
@pytest.fixture
def profile(login):
return login.get_profile()
自定义插件:可以编写自定义插件并在 Conftest 文件中注册。例如:
import pytest
class CustomPlugin:
def pytest_runtest_setup(self, item):
print("Running setup for test:", item.name)
pytest_plugins = ["custom_plugin"]
下面是一个更高级的例子,展示了如何在conftest.py中使用作用域(scope)和参数化(parametrize)来定义更复杂的fixture。
# conftest.py
import pytest
@pytest.fixture(scope="module")
def data():
return [1, 2, 3]
@pytest.fixture(scope="function", params=[1, 2])
def param_fixture(request):
return request.param
在这个例子中,data fixture的作用域被设置为"module",这意味着它只会在每个测试模块开始时创建一次,并在整个模块中共享。而param_fixture的作用域被设置为"function",并且使用了参数化,这意味着它会为每个测试函数创建新的实例,并且这些实例会带有不同的参数值。
然后,你可以在你的测试文件中这样使用这些fixture:
# test_example.py
def test_data(data):
assert len(data) == 3
def test_param_fixture(param_fixture):
assert param_fixture in [1, 2]
在这个测试文件中,test_data函数使用了data fixture,而test_param_fixture函数则使用了param_fixture fixture。由于param_fixture是参数化的,所以test_param_fixture函数实际上会被执行两次,一次传入参数1,一次传入参数2。
通过这些高级示例,可以更加灵活地利用 Pytest Conftest 来管理测试资源和扩展测试框架的功能。
总的来说,conftest.py为pytest提供了强大的配置和扩展能力,使得你可以更灵活地组织和管理你的测试代码。通过深入理解和熟练掌握conftest.py的使用,你可以写出更高效、更可维护的测试代码。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】