使用 Python 大规模运行自动化测试





5.00/5 (1投票)
本文主要讨论使用 Python 规模化运行自动化测试,重点是 Selenium。
互联网无处不在。网络和移动平台对消费者的购买决策有着举足轻重的影响。因此,越来越多的企业正朝着为最终用户提供优质的数字化优先体验迈进。简而言之,人们正在构建许多 Web 和移动应用程序。根据 Statista 报告,互联网上共有超过 18.8 亿个网站,并且这个数字还在不断增长。
质量是企业成功的关键方面,因此,组织正在投入越来越多的资源来建立内部 QA 实践,而 自动化测试正处于这场变革的最前沿。
那么,作为开发人员或测试人员,这与您有什么关系?在当今的就业市场,拥有自动化能力在您的简历上非常有吸引力。而且上手也很快。开始自动化测试的最佳框架是 Selenium。它支持所有编程语言,并且在自动化测试框架中拥有最大的市场份额。
在本文中,我们将探讨 Selenium 是什么,如何设置 Selenium,以及如何使用 Python 语言编写自动化测试脚本。
接下来,我们将学习如何使用像 pytest 这样的测试框架,并通过 LambdaTest 在云端执行并行测试。
目录
- 什么是 Selenium
- 如何使用 Python 设置 Selenium
- 使用 Selenium 编写第一个自动化测试脚本
- 如何使用 Python 测试框架设置 Selenium
- 使用 pytest 框架进行并行测试执行
- 本地 Grid 测试的挑战
- 结论
什么是 Selenium?
Selenium 是一个流行的 Web 应用程序浏览器自动化测试框架。在最近一项关于测试自动化的调查中,81% 的受访者表示他们使用 Selenium 进行自动化测试。
它允许在众多操作系统和浏览器上进行网站或 Web 应用程序测试。它还支持多种编程语言,如 Python、C#、Java、JavaScript (Node.js)、Ruby 等,使测试人员能够使用最熟悉的语言来自动化其网站测试。
Selenium 框架有三个组件,如下图所示。
Selenium IDE
Selenium IDE(集成开发环境)提供了一个录制和回放工具,可以根据在浏览器上执行的操作生成脚本。它提供了一个用户友好的界面,使测试人员和开发人员可以轻松地以 Java、Python、Ruby、C# 等编程语言导出自动化测试脚本。它是初学者的理想工具,几乎不需要任何先前的编程知识。然而,它无法创建更复杂的测试用例。为此,可以使用 Selenium WebDriver 和 Selenium Grid。
Selenium WebDriver
Selenium WebDriver 提供了一种可靠且面向对象的方法来自动化浏览器。使用 Selenium WebDriver 可以使用 Java、C#、Python、Ruby 和 JavaScript 等编程语言编写自动化脚本。通过直接与浏览器交互,它可以以编程方式控制浏览器。WebDriver 支持众多浏览器,包括 Chrome、Firefox、Safari、Microsoft Edge 等。
Selenium Grid
Selenium Grid 也被归类为本地 Grid,它通过允许您将测试执行分散到多个物理或虚拟机器上来实现并行测试执行。通过与 Selenium WebDriver 集成,您可以同时在多个浏览器、操作系统和设备上运行测试。Selenium Grid 由多个节点和一个 Hub 组成。测试在 Hub 上分发到可用的节点进行执行,Hub 作为测试注册的中心位置。
如何使用 Python 设置 Selenium?
使用 Python 设置 Selenium 相对容易。您可以按照本节提供的步骤轻松完成设置。
必备组件
- 最新版本的 Python。
- 您希望在其上运行测试的 Web 浏览器。
使用 Python 包管理器 pip
,您可以在命令行或终端中输入以下命令来安装 Selenium
pip install selenium
控制台输出
要验证 Selenium 的安装,您可以运行以下代码
import selenium
print(selenium.__version__)
控制台输出
使用 Selenium 编写第一个自动化测试脚本
我们中的大多数人将创建示例待办事项应用程序作为我们的第一个项目,那么为什么不为它创建一个测试呢?在本节中,我们将创建两个简单而实用的困难,其中一个是在线获取网站的标题,另一个是向待办事项列表中添加一个项目。
获取网站标题
在此测试中,我们将打印从网站检索到的标题。对于此测试,我们将使用 Chrome 浏览器执行我们的测试。
from selenium import webdriver
# Create a new instance of the Chrome driver
driver = webdriver.Chrome()
# Navigate to the website
driver.get("https://lambdatest.github.io/sample-todo-app/")
# Get the title of the webpage
website_title = driver.title
# Print the title to the console
print("Title:", website_title)
# Close the entire browser session
driver.quit()
控制台输出
代码演练
导入语句用于从 Selenium 包中获取 WebDriver。
它用于初始化 Chrome WebDriver 的新实例。
get()
:这是 WebDriver 对象提供的一个方法,用于导航到特定 URL。它指示 Web 浏览器打开指定的 URL。
title
:title 方法用于检索用户当前正在处理的网页的标题。
quit()
:此方法将关闭整个浏览器会话及其所有选项卡和窗口。
在自动化中,与输入字段和按钮交互是一项常规任务。右键单击网页上的任意位置,然后选择检查元素以查看元素的详细信息。将鼠标悬停在要访问的元素上。
使用 find_element()
方法识别输入元素,您可以使用 send_keys()
方法模拟键盘输入。通过将选定的文本或值作为参数,您可以填充输入字段并模拟用户输入。要使用按钮,您需要使用 find_element()
方法查找按钮,并使用 click()
方法单击它。借助下面的测试,我们将看到如何使用这些方法。
将项目添加到待办事项列表
在此测试中,我们将“喝水”添加到待办事项列表中。对于此测试,我们将使用 Firefox 浏览器来执行我们的测试。
from selenium import webdriver
from selenium.webdriver.common.by import By
# Create a new instance of the Firefox driver
driver = webdriver.Firefox()
# Navigate to website
driver.get("https://lambdatest.github.io/sample-todo-app/")
# This code finds the input field.
search_for_key = driver.find_element(By.ID, "sampletodotext")
# This code adds text to the input field.
search_for_key.send_keys("Drinking Water")
# This code gets the button
search_btn = driver.find_element(By.ID, "addbutton")
# This method press the button
search_btn.click()
# Close the browser window
driver.quit()
输出
代码演练
要使用 By
,需要导入以下导入语句
初始化 Firefox 浏览器。
使用 find_element()
方法获取元素。
send_keys()
:用于将文本发送到任何字段,例如表单的输入字段。
click()
:此方法将单击按钮。
如何使用 Python 测试框架设置 Selenium?
测试框架提供了一种有组织有效的方法来进行测试,这对于软件开发至关重要。它提供了一种系统的方法来组织、自动化和管理测试,从而更轻松地查找和解决编码错误。
测试框架支持测试自动化,使组织测试用例变得更容易,生成有见地的报告,并保证测试的一致性和可靠性。它们是维护代码质量、验证功能和为用户提供可靠软件的关键资源。
Python 提供了 Unittest、pytest、Behave 和 Robot 等测试框架,这些框架都可以轻松使用。为了开始,我们将使用 pytest 重写我们之前的测试。
首先,我们需要使用以下命令安装 pytest。
pip install pytest
控制台输出
我们需要将我们的测试转换为如下函数。
from selenium import webdriver
from selenium.webdriver.common.by import By
import pytest
# Test 1: Get Title of the Website
def test_get_website_title():
driver = webdriver.Chrome()
driver.get("https://lambdatest.github.io/sample-todo-app/")
website_title = driver.title
driver.quit()
assert "Sample page - lambdatest.com" in website_title
# Test 2: Adding an Item to a To-Do List
def test_add_todo_item():
driver = webdriver.Firefox()
driver.get("https://lambdatest.github.io/sample-todo-app/")
search_for_key = driver.find_element(By.ID, "sampletodotext")
search_for_key.send_keys("Drinking Water")
search_btn = driver.find_element(By.ID, "addbutton")
search_btn.click()
driver.quit()
if __name__ == "__main__":
pytest.main()
此脚本包含两个测试函数,test_get_website_title()
和 test_add_todo_item()
,每个函数代表一个测试用例。pytest 将自动发现并执行这些测试。
输出
Pytest 将找到测试并运行它们,为您提供包含通过/失败状态的详细输出。通过将 Selenium 与 pytest 结合使用,您可以在自动化 Selenium 的 Web 测试任务时利用 pytest 的测试功能。
使用 pytest 框架进行并行测试执行
当您拥有一个大型测试套件时,并行测试可以大大缩短每次运行测试所需的时间。您可以使用 pytest 内置的并行测试执行功能来并行运行指定的代码。
考虑一个例子,我们需要执行 2 个测试用例,这将花费 7-8 秒。与之形成鲜明对比的是,如果我们使用并行测试执行来完成,时间将是 3-4 秒。以下是具体操作方法
安装 pytest-xdist 插件
要允许并行运行测试,您必须安装 pytest-xdist
插件。您可以使用 pip
来完成此操作
pip install pytest-xdist
控制台输出
现在,使用以下命令运行脚本。
pytest main.py -n 2
pytest-xdist
插件提供 -n 2 选项用于并行测试运行。这表示您希望使用两个并行进程来执行测试。这意味着 pytest 将分割测试并在两个 CPU 核心上同时运行它们,这可以加快您的测试套件的执行速度。
未使用并行测试执行
使用并行测试执行
正如您所见,整个测试脚本在 3.73 秒内执行完毕,几乎是上面执行的测试(耗时 7.88 秒)的一半。
本地 Grid 测试的挑战
在本地 Grid 上进行测试时可能会遇到许多挑战。更易获得的物理设备和浏览器是主要问题之一。本地 Grid 难以跨各种设备和浏览器配置进行测试,这可能会对整体测试覆盖率产生负面影响。
它还需要大量资源,包括基础设施设置、软件和硬件,才能进行维护和管理。为了满足不断增长的测试需求而扩展 Grid 可能需要花费时间和金钱。
基于云的测试 Grid 解决了本地 Grid 的问题。它们提供各种设备和浏览器,实现可扩展且灵活的测试。测试人员可以利用不同的配置,同时运行测试以加快执行速度,并增加覆盖率。基于云的 Grid 不需要管理本地基础设施。
像 LambdaTest 这样的 AI 驱动的测试编排和执行平台提供了一个云 Grid,您可以在其中使用 自动化测试工具(如 Selenium with Python)运行测试。它们支持多种 Chrome 浏览器版本和操作系统,可以轻松编写和执行自动化脚本,并支持像 pytest 和 Unittest 这样的流行测试框架。
在基于云的测试 Grid 上运行测试用例
在本节中,我们将使用 pytest 作为框架在 LambdaTest 上运行测试。我们将在 Windows 10 操作系统和 Chrome 114.0 版本上进行测试。
在 LambdaTest 上运行 Python 测试之前,请遵循简单的步骤。
- 创建 LambdaTest 账户并完成所有必需的流程。
- 转到 LambdaTest Dashboard。要获取您的凭据,请导航到右上角的 个人资料头像。
- 然后转到 帐户设置 > 密码与安全。您可以找到您的 用户名和访问密钥,并保存以供将来使用。
分步理解代码
上面显示的是一个示例待办事项应用程序的测试脚本。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.common.by import By
import pytest
# LambdaTest Selenium Grid configuration
username = "YOUR USERNAME"
access_key = "YOUR ACCESS KEY"
# Test 1: Get Title of the Website on LambdaTest
def test_get_website_title_on_lambdatest():
# Desired capabilities for the LambdaTest test
lt_options = {
"browserName": "Chrome",
"platformName": "macOS Ventura",
"project": "First Test",
"build": "Testing to-do list",
"name": "Get Website Title Test",
}
remote_url = "http://{}:{}@hub.lambdatest.com/wd/hub".format(username, access_key)
browser_options = ChromeOptions()
# adding the capability to the chrome
browser_options.set_capability("LT:Options", lt_options)
# initializing remote server
driver = webdriver.Remote(command_executor=remote_url, options=browser_options)
driver.get("https://lambdatest.github.io/sample-todo-app/")
website_title = driver.title
driver.quit()
assert "Sample page - lambdatest.com" in website_title
# Test 2: Adding an Item to a To-Do List on LambdaTest
def test_add_todo_item_on_lambdatest():
lt_options = {
"browserName": "Firefox",
"platformName": "macOS Ventura",
"project": "First Test",
"build": "Testing to-do list",
"name": "Add Todo Item Test",
}
remote_url = "http://{}:{}@hub.lambdatest.com/wd/hub".format(username, access_key)
browser_options = FirefoxOptions()
browser_options.set_capability("LT:Options", lt_options)
# initializing remote server
driver = webdriver.Remote(command_executor=remote_url, options=browser_options)
driver.get("https://lambdatest.github.io/sample-todo-app/")
search_for_key = driver.find_element(By.ID, "sampletodotext")
search_for_key.send_keys("Drinking Water")
search_btn = driver.find_element(By.ID, "addbutton")
search_btn.click()
driver.quit()
if __name__ == "__main__":
pytest.main()
在上面的脚本中,在上面的测试脚本中添加您的 LambdaTest 凭据(用户名和访问密钥),或者将它们设置在您的环境变量中,因为这将帮助 LambdaTest 在您的帐户上运行测试。
从 LambdaTest Capabilities Generator 生成您所需的 Capabilities。
运行您的第一个 Python 测试
在 Automation > Web Automation 下查找您的测试用例的详细信息。
您还可以探索其他可用选项,以更全面地了解 LambdaTest 平台。
使用并行测试执行在云 Grid 上运行测试用例
要并行执行测试,您必须运行与我们为本地 Grid 运行相同的命令。
pytest main.py -n 2
正如您所见,两个测试都在 LambdaTest 上同时运行。
结论
Selenium 是一套强大的技术,用于自动化 Web 浏览器交互。我们探讨了如何将 Python 和 Selenium 结合使用,并实现了我们的第一个测试。我们还讨论了使用 pytest 等测试框架以及并行运行测试以提高效率的好处。
我们还强调了使用本地 Grid 进行测试的挑战,以及使用像 LambdaTest 这样的基于云的自动化测试平台的优势,该平台提供了可扩展且资源高效的解决方案。测试人员可以通过 Selenium、基于云的 Grid 和并行执行来加速测试执行并提高测试覆盖率,从而提高其 Web 应用程序的质量。
总而言之,Selenium 提供了全面有效的 Web 自动化和测试方法,结合 Python、现代测试框架、基于云的 Grid 和并行执行。它为测试人员提供了应对挑战和交付高质量软件的工具。