8款Pytest插件助力Python自动化测试
当测试用例变得复杂,或者需要处理大量测试数据时,插件通过使测试更加简洁和结构化而变得非常有用。Python凭借其简洁性和多功能性,成为自动化测试的热门选择,而pytest是最广泛使用的测试框架之一。虽然pytest本身功能强大,但通过插件可以充分发挥其真正潜力。
在Python自动化测试中,Pytest以其简单易用、功能强大的特性成为开发者的首选。然而,Pytest的真正魅力不止于其核心功能,而在于丰富的插件生态系统。如何充分利用这些插件,让测试变得更加高效?这8个实用插件绝对是你的测试“秘密武器”。
有哪些Pytest插件能够提升测试效率、增强报告功能,甚至支持复杂测试场景?它们分别适用于哪些测试需求?
pytest插件可以通过为特定需求提供针对性解决方案来帮助测试,比如并行运行测试、管理数据库、改进错误报告以及与CI/CD集成等。它们简化了测试过程,使其更快、更可靠,同时减少了手动操作和出错的可能性。
在本文中,让我们探索一些用于Python自动化测试的有用pytest插件。
如何安装pytest插件?
要安装pytest插件,你可以使用pip从Python包索引(PyPI)中添加插件。以下是具体步骤:
1. 在PyPI或pytest插件目录中查找你想要的插件。
2. 使用pip在你的环境中直接安装它:
pip install <plugin-name>
3. 例如,要安装pytest-check(一个流行的用于实现断言的插件),请运行以下命令:
pip install pytest-check
安装完成后,你可以将已安装的插件导入到你的测试套件中,以执行pytest测试。
8个顶级pytest插件
让我们探索一些顶级的pytest插件,并附上示例。
1. pytest-check
pytest-check是一个插件,它引入了高级的断言功能。虽然pytest本身提供了一套强大的断言功能,但pytest-check插件通过启用参数化测试并增强失败断言的报告,使其功能更加出色。
使用pytest-check,你可以从单个测试函数中动态生成和执行多个测试用例。这对于测试一系列输入值或场景特别有价值,而无需编写重复的测试脚本。
要安装这个pytest插件,请运行以下命令:
pip install pytest-check
示例:
在这个名为test_pytest_check.py的文件中,我们使用pytest-check插件实现了断言。这里的重点是利用pytest-check插件来增强Selenium测试中的断言处理。
名为test_1的测试函数展示了如何为一系列用户消息实现动态断言。首先,定义了一个消息列表,代表测试将要模拟的不同场景。WebDriver定位网页上的特定元素,包括一个输入框、一个按钮和一个消息元素。
在遍历消息列表的过程中,输入框被清空并填充每条消息。然后点击按钮触发一个动作,并使用pytest-check插件执行动态断言。
with check:
assert len(message_element.text) > 50
assert message_element.text == message
time.sleep(3)
在这里,测试确保了显示的消息内容超过50个字符,并且与输入的消息相匹配。添加time.sleep(3)是为了引入一个短暂的暂停,以便在移动到下一个迭代之前让响应在网页上呈现。
这里故意使用验证显示消息的大小来演示在失败情况下pytest-check插件是如何工作的。当运行上面的代码时,如果我们使用普通的断言,测试将在第一次交互时失败。但是,使用pytest-check插件,测试永远不会失败,并且会提供一个有洞察力的报告,以帮助你理解所有失败的情况。
在下面的输出中,生成了pytest-check报告,包含以下详细信息:
- 测试未通过。
- 有三个检查遇到了失败。
- 每个失败检查的详细信息。
2. pytest-bdd
pytest-bdd是一个插件,它能将行为驱动开发(BDD)原则无缝集成到你的自动化测试工作流程中。BDD是一种软件开发方法,它强调利益相关者之间的协作和沟通。
要安装这个pytest插件,请运行以下命令:
pip install pytest-bdd
示例:
要使用pytest-bdd插件自动化与简单表单的交互,你需要创建一个特性文件(feature file),其中概述你想要测试的具体场景。在这个例子中,特性文件的结构应该如下:
Feature: Simple Form Demo
Scenario: Entering a message
Given the user is on the Simple Form Demo page
When the user enters the message "My pytest-bdd message" in the input field
And clicks the Get button
Then the user should see the message "My pytest-bdd message"
确保你在项目根目录下名为features的文件夹中组织这个特性文件。
在test_simple_form_demo.py文件中,我们使用pytest-bdd插件提供的@given、@when和@then装饰器来定义步骤函数。每个步骤函数对应于Gherkin场景中的一行,这使得将特性文件的动作映射到实际的Python代码变得容易。
此外,步骤定义利用parsers.parse()方法的强大解析能力来动态地从Gherkin场景中提取值。
在这个代码片段中,我们首先导入必要的模块,包括用于元素定位策略的By和用于浏览器自动化的webdriver。使用@given、@when和@then装饰器来定义步骤函数。
使用scenarios()函数将步骤定义与特性文件链接起来,这样pytest-bdd插件就可以自动识别和执行定义的场景。使用pytest.fixture设置了一个名为driver的fixture,提供了一个ChromeDriver。
步骤函数对应于Gherkin场景中描述的动作。它们使用find_element()方法与网页上的元素进行交互,并执行诸如发送按键和点击按钮等操作。
最后,进行断言以验证预期行为与实际结果是否匹配。
3.pytest-xdist
pytest-xdist 是一个插件,它提供了跨多台机器并行运行测试的能力。这能够显著减少测试执行时间,使其成为大型测试套件项目中不可或缺的 pytest 插件。
要安装这个pytest插件,请运行以下命令:
pip install pytest-xdist
安装完成后,pytest-xdist插件将与您现有的pytest设置无缝集成。要并行执行测试,您可以使用-n标志,后跟您希望运行的并行进程数。
pytest -n 2
示例:
在test_basic.py文件中,我们有一套Selenium测试。我们将创建一个示例测试套件,并展示pytest-xdist插件如何减少总体执行时间。
除了这个Python文件,我们还将创建另外两个内容完全相同的文件,只是更改了文件名。我们的三个Python自动化脚本是test_basic_1.py、test_basic_2.py和test_basic_3.py。
让我们使用pytest命令运行这些测试脚本。
在上述终端输出中,您可以看到三个测试已运行并通过,执行时间为16.68秒。
现在,让我们使用pytest-xdist的功能运行相同的测试。下面的命令将同时运行三个独立的进程中的测试:
pytest -n 3
在上述终端输出中,您可以看到,与之前一样,三个测试已运行并通过。但是,执行时间仅为7.08秒,测试套件执行时间减少了近58%。
虽然并行测试执行可以显著加快测试过程,但有效监控和管理结果同样重要。pytest-xdist插件提供了清晰简洁的报告,汇总了所有并行进程的结果。
此外,您还可以结合使用pytest的广泛报告选项(如pytest-html)和pytest-xdist插件。这允许您生成全面的报告,这些报告提供了有关测试覆盖率、性能和并行执行过程中遇到的任何失败的见解。
4.pytest-randomly
pytest-randomly插件为您的测试引入随机执行顺序,为Web应用程序的行为提供新的视角。以随机顺序运行测试有助于发现测试套件中隐藏的依赖项或状态问题。
要安装这个pytest插件,请运行以下命令:
pip install pytest-randomly
安装完成后,pytest-randomly插件将与您现有的pytest设置无缝集成。您可以通过在运行以下命令时包含–randomly标志来启用随机测试顺序:
pytest --randomly-seed=1234
该命令使用pytest-randomly插件启动pytest,并指定一个种子值1234。这个种子值确保多次测试运行之间的随机化结果一致,便于调试和结果共享时的可重复性。
因此,如果您想重现相同的执行顺序,可以使用相同的种子。如果您想改变顺序,只需在每次运行时更改种子值,这样测试就会以不同的顺序执行。
示例:
为了展示pytest-randomly插件的工作原理,我们将使用与pytest-xdist部分中相同的代码和项目结构。
让我们使用pytest命令运行这些测试:test_basic_1.py、test_basic_2.py和test_basic_3.py
在下面的终端输出中,您可以看到三个测试已运行并通过,且执行顺序是test_basic_1、test_basic_2和test_basic_3。
如果您再次运行相同的测试,执行顺序将会相同。
现在,让我们使用pytest-randomly插件运行相同的测试。以下命令将执行测试:
pytest --randomly-seed=1234
在上述终端输出中,您可以看到三个测试像以前一样已运行并通过。但是,执行顺序是test_basic_1、test_basic_3和test_basic_2。
如果您再次运行相同的测试,并将种子更改为9999,执行顺序将会改变。
在上述终端输出中,您可以看到,与之前一样,三个测试已运行并通过。然而,执行顺序是test_basic_2、test_basic_1和test_basic_3。
5.pytest-html
pytest-html插件提供了一个强大的解决方案,用于创建交互式HTML报告,从而提高测试结果的可见性。
要安装这个pytest插件,请运行以下命令:
pip install pytest-html
安装完成后,pytest-html插件将与您现有的pytest设置无缝集成。使用pytest运行测试后,插件会自动生成HTML报告,提供测试结果的详细摘要。
示例:
为了展示pytest-html的工作原理,我们将使用与pytest-xdist部分中相同的代码和项目结构。
现在,让我们使用以下命令运行这些测试:test_basic_1.py、test_basic_2.py、test_basic_3.py。
pytest --html=report.html
如果您检查项目文件夹,会发现已创建了report.html文件,并且项目文件夹中还添加了一个包含style.css文件的assets文件夹。
如果您在浏览器中打开report.html文件,可以看到:
pytest-html插件还提供了丰富的自定义选项,使您能够精细地调整生成的HTML报告的外观和内容,以满足您独特的测试需求和偏好。
6.pytest-datafiles
pytest-datafiles插件通过无缝集成外部数据文件(如JSON、YAML或文本文件)到您的Selenium测试中,简化了测试管理过程。
要安装这个pytest插件,请运行以下命令:
pip install pytest-datafiles
示例:
为了演示pytest-datafiles插件的工作原理,让我们创建一个名为test_data.json的示例数据文件,其中包含一些将在我们的演示中使用的消息:
[
{"message": "Test Case 1"},
{"message": "Test Case 2"},
{"message": "Test Case 3"}
]
在test_with_datafiles.py文件中,测试脚本的结构大体上与前面的部分相同,重点是自动化一个简单的表单演示。然而,关键的变化在于test_simple_form_demo函数内部。
通过集成pytest-datafiles,我们现在能够动态遍历一个在名为test_data.json的外部JSON文件中定义的场景集。该文件包含多个测试用例,每个用例都有一个不同的消息。对于每个场景,我们在输入新消息之前确保输入字段已被清空,从而提高测试的准确性。
现在,让我们使用pytest命令运行这些测试:
7.pytest-cov
pytest-cov插件与pytest无缝集成,为Selenium自动化项目提供了一种轻松测量测试覆盖率的方法。
要安装这个pytest插件,请运行以下命令:
pip install pytest-cov
示例:
按照pytest-cov-sample存储库中的定义创建项目结构。在calculator.py文件中,我们将创建两个简单的函数来计算两个数的加法和减法。
def sum(a, b):
return a + b
def diff(a, b):
return a - b
在test_calculator.py文件中,我们将创建一个简单的测试来检查一些加法运算。我们故意不为diff()函数添加任何测试。
from myproject.calculator import sum, diff
def test_sum():
assert sum(2, 3) == 5
assert sum(-1, 1) == 0
assert sum(0, 0) == 0
init.py文件只是为了告诉pytest-cov插件在哪里运行测试。使用覆盖率分析运行测试非常简单。只需像平常一样使用pytest运行测试,但要添加–cov选项和测试文件夹的名称(即tests):
pytest --cov=myproject tests
此命令将运行您的测试,并为您的软件项目生成一个覆盖率报告。报告将指示哪些代码行已被您的测试覆盖,哪些仍未被测试。
8.pytest-mock
pytest-mock是一个与pytest无缝集成的插件,它提供了一种既简单又强大的方式来创建和管理模拟对象(mocks)。模拟对象在多种场景下都很有用,比如处理像数据库、API或第三方服务等外部依赖时。
要安装这个pytest插件,请运行以下命令:
pip install pytest-mock
示例:
在test_sample.py文件中,我们有一个test_network_error_handling(driver, mocker)函数,它测试当在尝试导航时发生网络错误时Selenium WebDriver的行为。
我们使用mocker来模拟driver.get方法。mocker是pytest-mock插件提供的MockFixture类的一个实例,它允许你创建和配置模拟对象以进行测试。
我们配置模拟对象在调用时引发异常,以模拟网络错误的情况。当我们尝试使用driver.get("https://www.xxxx.com/simple-form-demo")导航到网页时,模拟的driver.get方法将引发异常,以模拟网络错误。我们捕获异常,打印它,并断言错误消息包含“Network Error”。
现在,让我们使用pytest -s命令运行这些测试,你可以看到下面的输出:
我们上面运行的测试是在本地Selenium Grid上进行的。然而,对于需要可扩展性和可靠性的大型测试套件,你可以利用与基于云的测试平台集成的pytest插件。
结论
在您的自动化测试过程中充分利用pytest插件的力量,有助于您构建健壮、可维护和高效的测试套件。当pytest与其广泛的插件生态系统相结合时,它使测试人员和开发人员能够根据自己的确切需求定制测试框架。
通过利用pytest插件,您能够以可能无法通过标准测试框架轻松实现的方式,扩展自动化测试项目的功能。从专门的断言到全面的报告和数据驱动测试,pytest插件生态系统提供了多种增强测试工作的方法。
在自动化测试逐步普及的当下,测试开发者的核心任务正从手动操作向工具优化转变。Pytest插件的灵活性和扩展性,不仅降低了测试开发的门槛,也为提升测试效率提供了无限可能。
Pytest插件的丰富生态,为自动化测试开发者提供了从测试执行、结果分析到环境优化的全方位支持。熟练掌握这些工具,不仅能大幅提升工作效率,更能让测试变得轻松高效。
工具是手段,效率是目标,Pytest插件是测试开发者的“好帮手”,让你的测试工作事半功倍!
作/译者:Paulo Oliveira/路人甲