如何在 pytest 中生成 XML 报告?

使用pytest生成XML测试报告
本文探讨了在Python测试框架pytest中生成XML测试报告的重要性,介绍了pytest的基本概念和优势。内容涵盖测试报告的价值,XML与HTML的区别,以及如何在pytest中配置和生成XML报告,以实现更有效的测试结果分析和自动化测试套件的优化。

许多组织都有在集成和持续交付系统中运行的自动化测试套件,但未能有效利用测试结束时生成的结果。如果没有适当的分析和记录,就很难将有价值的信息与不相关的数据区分开来。

自动化测试的真正好处不仅在于它能够在开发过程中充当文档,还在于它能够增加测试覆盖率,确保软件质量,并帮助在开发周期的早期识别和修复错误。

此外,拥有清晰详细的测试结果还可以深入了解可能需要进一步关注或优化的代码区域,从而有助于整个开发过程。

因此,有效的测试报告很重要,它将确保正确收集测试结束时的所有数据并将其转化为可用信息。这些测试结果可以深入了解可能需要进一步关注或优化的代码区域,从而为开发团队带来巨大好处。它还确保在开发周期的早期发现并修复错误,从而提高软件开发过程的整体质量和效率。

在这篇关于在pytest中生成XML报告的博客中,我们将首先简要讨论流行的Python测试框架pytest 。Pytest 允许对 Python 代码进行简单高效的测试,并广泛用于开发社区。在讨论完 pytest 之后,我们将深入研究测试报告的好处以及如何在 pytest 中生成 XML 报告。

那么,让我们开始吧!

测试报告的重要性
当您开始每天在管道中运行自动化测试时,您会遇到不同的挑战。这可能是由于产品行为或缺陷的某些变化。测试报告是 QA 团队有效分析和履行职责的重要组成部分。它可以帮助他们评估测试过程并确定需要解决的任何问题。

测试报告是测试自动化框架的关键要素,因为它在有效分析测试结果方面起着至关重要的作用。拥有测试报告可以帮助您构建更强大的测试自动化套件。执行测试报告的效率对自动化工作的整体成功起着重要作用。

测试报告有助于更好地记录正在开发的产品,并为利益相关者做出决策提供有价值的信息。这可以加快上市时间、提高投资回报率、更快地解决错误、加快开发速度并提高全面可见性。

通过提供有关自动化测试结果的清晰详细信息,测试报告有助于确保软件的质量和可靠性,同时还可以提高开发过程的效率和效果。

在 3000 多种浏览器和设备上运行 Python 测试脚本。立即试用 LambdaTest!

测试报告中的 XML 与 HTML
测试报告是任何测试自动化框架的重要组成部分,为开发人员提供有关自动化测试结果的详细信息。一种流行的测试报告格式是 XML,它代表可扩展标记语言。XML 是一种标记语言,用于组织和标记文档的不同部分,使人和机器都易于阅读和理解。

与用于在 Web 浏览器中格式化和显示数据的 HTML(超文本标记语言)不同,XML 旨在存储和传输数据。它允许创建自定义标签和自描述语言,使其高度灵活并适应各种系统。XML 还具有标准和清晰的结构,确保数据的完整性和交换性。

选择测试报告的格式时,重要的是要考虑项目的特定需求和要求。XML 是测试报告的一个很好的选择,因为它易于阅读和理解,并且可以很容易地集成到其他系统中。

此外,XML 报告可以包含有关测试失败和错误的详细信息,从而更容易识别和修复错误。但是,如果您正在寻找更直观的测试结果表示,HTML 报告可能是更好的选择。最终,格式的选择将取决于您项目的具体需要和要求。

什么是测试?
尽管经常被忽视,但测试是软件开发生命周期(SDLC)中必不可少的一步。Python 带有名为 unittest 的内置测试框架。但是,一些开发人员发现在 unittest 中编写测试很复杂。近年来,第三方测试框架pytest以其易用性和灵活性受到了开发者的青睐。

Pytest 是一个 Python 测试框架,旨在帮助开发人员编写更好的系统并自信地发布它们。它需要更少的样板代码,使测试套件更具可读性和易于维护。使用简单的断言语句,而不是单元测试的 assertSomething 方法,使编写和理解测试更容易。
绑定系统简化了测试状态的设置和删除,保持测试的组织性和可靠性。功能性方法允许进行更多模块化测试,而社区维护的大型插件生态系统允许轻松添加功能。还提供了Pytest Fixtures,它允许跨测试共享设置和清理代码,使测试更易于维护和高效。

总的来说,它的易用性和灵活性使 pytest 成为提高代码质量和可靠性的绝佳选择。

测试环境设置
博客中关于在pytest中生成XML报告的这一部分将介绍配置测试环境的过程。

设置测试
注意: 博客中有关在 pytest 中生成 XML 报告的这一部分适用于可能不熟悉设置 pytest 的读者。如果您已经熟悉该过程,请随时跳过此部分。

pytest的安装很简单。如果您已经克隆了存储库,则它已经安装,您可以跳过此步骤。如果您尚未克隆存储库,请按照以下步骤操作:

确保你的机器上有 Homebrew,因为我们将在本教程中使用 macOS 操作系统来在 pytest 中生成 XML 报告。

步骤1

在终端中键入以下命令。

	
brew install pipenv

pipenv 安装应该如下所示。
在这里插入图片描述
第2步

在空目录中创建 Pipfile。这个文件对于使用 Pipenv 是必不可少的。如果您需要重新安装它们,它会跟踪您项目的依赖项。

在这里插入图片描述
python_version 参数是您在创建新的 pipenv 环境时指定的基本解释器的版本。

包部分是您可以列出项目所需包的地方。“*”用于安装最新稳定版本的软件包。

在写这篇关于在pytest中生成XML报告的博客时,pytest和Selenium的最新版本分别是pytest 7.1.2和4.2.2。

步骤 3

在您的终端中,转到目录并使用以下命令安装最新稳定版本的 pytest 和 Selenium 包:

Pipenv Install

在这里插入图片描述
这篇博文演示了如何使用 pytest 和 LambdaTest Selenium Grid 运行测试。但是,可以通过为所需浏览器安装最新的 WebDriver 版本或使用WebDriverManager在本地执行这些测试。事实上,在 Selenium v​​4.6(及更高版本)中提供对 Selenium Manager 的支持后,WebDriverManager 也已成为历史。
现在让我们添加一些代码来演示如何从我们的 Selenium 控制的浏览器中通过索引在 Selenium WebDriver for Python 中查找元素。

如何在XML中使用pytest生成测试报告?
现在我们的项目已经准备就绪,让我们创建我们的测试套件。我们的测试套件将包括三个测试场景
测试场景 1 的 test_cart.py。
测试场景 2 的 test_cart.py。
测试场景 3 的 test_cart.py。
这是我们项目的结构应该是这样的:
在这里插入图片描述
我们的每个测试用例都将包含测试场景。

测试场景 1

测试用例 1 - 查看购物车(通过)

转到“ https://ecommerce-playground.lambdatest.io/ ”
单击查看购物车按钮。
测试用例 2:将产品添加到购物车(失败)

转到“ https://ecommerce-playground.lambdatest.io/ ”
单击一个产品。
将产品添加到购物车。
由于使用无效定位器在页面上定位所需产品,预计第二个测试用例会失败。

测试场景 2

测试用例 1:使用有效凭据登录(通过)

转到“ https://ecommerce-playground.lambdatest.io/ ”
单击按钮我的帐户。
输入电子邮件地址。
输入密码。
单击“登录”按钮。
测试场景 3

测试用例 1:执行搜索(通过)

转到“ https://ecommerce-playground.lambdatest.io/ ”
在搜索字段中输入关键字“iphone”。
单击“搜索”按钮。

import pytest<font></font>
import time<font></font>
from selenium import webdriver<font></font>
from selenium.webdriver.common.by import By<font></font>
<font></font>
<font></font>
@pytest.mark.usefixtures('driver')<font></font>
class TestCart():<font></font>
<font></font>
<font></font>
 def test_view_cart(self, driver):<font></font>
   driver.get("https://ecommerce-playground.lambdatest.io/")<font></font>
   cart_button = driver.find_element(By.XPATH, '//*[@id="entry_217825"]/a/div[1]')<font></font>
   cart_button.click()<font></font>
<font></font>
<font></font>
 def test_add_to_cart(self, driver):<font></font>
   driver.get("https://ecommerce-playground.lambdatest.io/")<font></font>
   product = driver.find_element(By.XPATH, 'INVALID XPATH')<font></font>
   product.click()<font></font>
<font></font>
<font></font>
   add_to_cart_button = driver.find_element(By.XPATH, '//*[@id="entry_216842"]/button')<font></font>
   time.sleep(5)<font></font>

代码演练

该脚本包含两个测试方法,test_view_cart和test_add_to_cart,它们用@pytest.mark.usefixtures(‘driver’)装饰器装饰。

这告诉 pytest 在运行这些测试方法之前运行驱动程序夹具。
在这里插入图片描述
test_view_cart方法使用driver.get()方法导航到https://ecommerce-playground.lambdatest.io/ ,然后使用driver.find_element()方法和 By 类的XPATH属性定位购物车按钮。然后单击购物车按钮。
在这里插入图片描述
test_add_to_cart方法也会转到https://ecommerce-playground.lambdatest.io/页面,然后尝试使用无效的 XPATH 定位产品。然后它应该找到添加到购物车按钮并单击它。

它还包含一个time.sleep(5)语句,该语句将脚本的执行暂停 5 秒钟,然后再继续下一步。

注意:同样值得注意的是,该脚本使用无效的 XPATH 来定位产品,因此该测试用例将失败,因为该脚本将找不到具有该 XPATH 的任何项目。

import pytest<font></font>
import time<font></font>
from selenium import webdriver<font></font>
from selenium.webdriver.common.by import By<font></font>
<font></font>
<font></font>
@pytest.mark.usefixtures('driver')<font></font>
class TestLogin():<font></font>
<font></font>
<font></font>
 def test_valid_credentials(self, driver):<font></font>
   driver.get("https://ecommerce-playground.lambdatest.io/")<font></font>
   account_button = driver.find_element(By.XPATH, '//*[@id="widget-navbar-217834"]/ul/li[6]/a/div/span')<font></font>
   account_button.click()<font></font>
<font></font>
<font></font>
   time.sleep(5)<font></font>
<font></font>
<font></font>
   email_field = driver.find_element(By.NAME, "email")<font></font>
   email_field.send_keys("email@email.com")<font></font>
<font></font>
<font></font>
   password_field = driver.find_element(By.NAME, "password")<font></font>
   password_field.send_keys("email")<font></font>
<font></font>
<font></font>
<font></font>
<font></font>
   login_button = driver.find_element(By.XPATH, '//*[@id="content"]/div/div[2]/div/div/form/input[1]')<font></font>
   login_button.click()<font></font>

此脚本导航到https://ecommerce-playground.lambdatest.io/页面,然后它使用提供的 XPATH 找到帐户按钮,单击它,并等待 5 秒钟。

之后,它使用名称属性找到电子邮件和密码字段,并分别输入email@email.com和email的硬编码值。

最后,它使用提供的 XPATH 找到登录按钮并单击它。

import pytest<font></font>
from selenium import webdriver<font></font>
from selenium.webdriver.common.by import By<font></font>
<font></font>
<font></font>
@pytest.mark.usefixtures('driver')<font></font>
class TestSearch():<font></font>
<font></font>
<font></font>
 def test_valid_search(self, driver):<font></font>
   driver.get("https://ecommerce-playground.lambdatest.io/")<font></font>
   search_field = driver.find_element(By.NAME, "search")<font></font>
   search_field.send_keys("iphone")<font></font>
   submit_button = driver.find_element(By.XPATH, '//*[@id="search"]/div[2]/button')<font></font>
   submit_button.click()<font></font>

test_valid_search方法导航到https://ecommerce-playground.lambdatest.io/页面。然后,它使用driver.find_element()方法和By class 的NAME属性定位搜索字段,并将键“iphone”发送给它。

之后,它使用Selenium 中的查找元素方法和 By 类的XPATH属性定位提交按钮。然后使用 Selenium 中的 click 方法单击页面上的按钮元素。

现在我们所有的测试用例都已实施,让我们使用 LambdaTest Selenium Grid 运行我们的测试。

LambdaTest 是一个数字体验测试平台,允许开发人员和 QA 在 3000 多种真实浏览器和平台组合上执行Python Web 自动化。它支持各种基于 Python 的测试框架,包括 pytest,用于进行Selenium Python 测试。

请访问我们的支持文档以开始使用 Selenium Python 测试。

以下是您可以遵循的步骤:

如果您已有帐户,请导航至 LambdaTest 网站并登录,如果您还没有帐户,请创建一个。
在这里插入图片描述
登录后,通过单击屏幕左侧栏上的自动化导航到自动化页面。
在这里插入图片描述
要将 pytest 与 LambdaTest Grid 一起使用,您需要 LambdaTest 凭据(即用户名和访问密钥)。要获取凭据,请单击屏幕右侧的“访问密钥”按钮。
在这里插入图片描述
现在让我们将 conftest.py 文件添加到项目的根目录:

from os import environ<font></font>
<font></font>
import pytest<font></font>
from selenium import webdriver<font></font>
from selenium.webdriver.remote.remote_connection import RemoteConnection<font></font>
<font></font>
@pytest.fixture(scope='function')<font></font>
def driver(request):<font></font>
   desired_caps = {}<font></font>
<font></font>
   browser = {<font></font>
       "platform": "Windows 10",<font></font>
       "browserName": "chrome",<font></font>
       "version": "latest"<font></font>
   }<font></font>
<font></font>
   username = "YOUR_USERNAME"<font></font>
   access_key = "YOUR_ACCESS_KEY"<font></font>
<font></font>
   desired_caps.update(browser)<font></font>
   test_name = request.node.name<font></font>
   build = environ.get('BUILD', "Generate - Test Report")<font></font>
   tunnel_id = environ.get('TUNNEL', False)<font></font>
<font></font>
   selenium_endpoint = "http://{}:{}@hub.lambdatest.com/wd/hub".format(username, access_key)<font></font>
   desired_caps['build'] = build<font></font>
   desired_caps['name'] = test_name<font></font>
   desired_caps['video'] = True<font></font>
   desired_caps['visual'] = True<font></font>
   desired_caps['network'] = True<font></font>
   desired_caps['console'] = True<font></font>
   caps = {"LT:Options": desired_caps}<font></font>
<font></font>
   executor = RemoteConnection(selenium_endpoint)<font></font>
   browser = webdriver.Remote(<font></font>
       command_executor=executor,<font></font>
       desired_capabilities=caps<font></font>
   )<font></font>
   yield browser<font></font>
<font></font>
   def fin():<font></font>
       if request.node.rep_call.failed:<font></font>
           browser.execute_script("lambda-status=failed")<font></font>
       else:<font></font>
           browser.execute_script("lambda-status=passed")<font></font>
           browser.quit()<font></font>
<font></font>
   request.addfinalizer(fin)<font></font>
<font></font>
@pytest.hookimpl(tryfirst=True, hookwrapper=True)<font></font>
def pytest_runtest_makereport(item, call):<font></font>
   # this sets the result as a test attribute for LambdaTest reporting.<font></font>
   # execute all other hooks to obtain the report object<font></font>
   outcome = yield<font></font>
   rep = outcome.get_result()<font></font>
<font></font>
   # set a report attribute for each phase of a call, which can<font></font>
   # be "setup", "call", "teardown"<font></font>
   setattr(item, "rep_" + rep.when, rep)<font></font>

测试执行
使用以下命令运行 pytest 测试:

pipenv run python -m pytest

执行测试后,您应该在控制台中获得测试执行的摘要。
在这里插入图片描述
在您的LambdaTest Automation Dashboard上。

在这里插入图片描述
在 pytest 中生成 XML 报告
要在 pytest 中生成 XML 报告,您可以使用 pytest-xml 插件。该插件将生成一个包含测试结果的 XML 文件,其他工具可以读取该文件以进行进一步分析。

以下是如何使用 pytest-xml 插件:

首先,使用 pip 安装插件:
1个
pipenv install pytest-xml
接下来,使用 –junitxml 标志运行 pytest 测试以指定将保存结果的 XML 文件的路径:
1个
pipenv run python -m pytest -v --junitxml=“path/to/report.xml”
XML 报告将在指定路径生成。您可以在文本编辑器中打开该文件,或使用能够读取 XML 文件的工具(例如 Web 浏览器)查看它。
在这里插入图片描述
让我们在浏览器中打开我们的result.xml文件

在这里插入图片描述
在我们的一个XML文件中的测试报告中,我们可以通过标签找到一些信息。

测试套件:
在这里插入图片描述
这个标签表示我们的测试套件。我们可以找到如下属性:

name:测试套件的名称
errors:执行测试套件后发现的错误数
failures:测试套件执行后失败的测试用例数
skipped:未执行的测试用例数
测试:我们的测试套件包含的测试用例数量
time:测试套件被执行的次数
时间戳:报告生成的时间
测试用例:

在这里插入图片描述
classname:测试用例类的名称
name:测试用例的名称
time:测试用例的执行时间
我们还在失败标签中包含测试用例 test_add_to_cart 失败的原因。
在这里插入图片描述
如果您希望成为自动化测试专家,注册Selenium Python 101 认证计划是开启您成为自动化测试专家和提高 Python 技能之旅的好方法。它将帮助您为在测试中使用 Selenium Python 打下坚实的基础,并为您在该领域的事业蒸蒸日上铺平道路。

结论
在这个Selenium pytest 教程中,我们看到了测试报告在测试自动化项目中的重要性以及如何在 pytest 框架中生成 XML 报告。我们首先使用 pytest 在 Selenium 中配置测试环境,然后发现了允许我们在 pytest 中生成 XML 报告的 pytest-xml 插件。

我们还看到了代码在像 LambdaTest 这样的 Selenium 云网格上的执行。

我希望你喜欢阅读这篇关于如何在 pytest 中生成 XML 报告的文章?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值