【51CTO.com快译】如今,在不牺牲产品质量的情况下,频繁地部署大型软件的新版本,已经成为了主流趋势。通常,在每次引入新的功能、触发新的部署时,各种针对缺陷的修复都需要进行深入的、端到端的测试,以确保部署的成功率。虽然对于小型产品或项目而言,我们可以通过手动测试来保证覆盖率;但是对于那些功能数量庞大的产品或应用来说,我们肯定需要通过自动化测试,在最短的时间内提供最大的测试覆盖率。此时,我们往往需要通过将Selenium与某种编程语言结合使用,来实现该目的。在本文中,我将和您探讨如何使用Selenium与Python,来构建自动化的Web测试框架。
Selenium WebDriver架构速览
通常,Selenium Web自动化测试框架可结合使用诸如:Java、Python、JavaScript、Ruby、C#等不同的编程语言。其中,根据GitHub的一项调查(https://pypl.github.io/PYPL.html)显示,Python是开发人员最常用的编程语言。它具有流畅的学习曲线、简单的语法、以及简洁的代码。因此,Selenium可以轻松地与Python相集成,以自动化Web测试的过程。
而作为一种Web框架,Selenium WebDriver能够在各种受支持的浏览器(如:Chrome、Firefox、Safari等)上,自动化各种基于Web的应用程序。因此,Selenium自动化测试框架能够让用户自定义与Web应用的逐步交互,并通过添加断言,来发现各种错误。
Selenium WebDriver并非一个独立的测试工具,它通过各种组件来满足Web自动化测试的需要。简单而言,Selenium WebDriver的后端组件包括:
- Selenium WebDriver客户端库/语言绑定:如上所述,由于Selenium可以与任何语言集成,因此其下载页面提供了Selenium客户端与WebDriver语言的绑定。用户可以在任何首选语言中创建能与Selenium服务器交互的语言脚本。
- JSON Wire协议:作为Selenium的核心,JSON Wire协议通过提供能与REST API进行数据传输的媒介,以促进客户端代码和浏览器之间的通信。也就是说,它能够在浏览器的二进制文件和客户端库之间建立连接。
- 浏览器驱动程序:每个浏览器都会通过本浏览器的驱动程序,来实现数据传输。这些驱动可以从已编写的、基于Selenium的脚本处接收命令,在相应的浏览器上执行之,并以HTTP响应的形式返回结果。当然,这些都需要在JSON Wire协议的帮助下方可实现。
- 浏览器:确保每个自动化测试都能够被安装在本地或远程机器上,并能够在其支持的浏览器中(如:Firefox、Chrome、Microsoft Edge、Safari等)被执行。
四大Python自动化测试框架
随着需求的增加,目前市场上出现了各种受欢迎程度不同的Python自动化测试框架。这些框架在管理脚本的执行顺序、存储结果、呈现日志、以及添加断言等方面,都发挥着各自的作用。下面,我们将重点讨论四个比较流行的自动化测试框架:
Robot Framework
作为一个开源的自动化测试框架,Robot Framework主要被用于机器人过程自动化(robotic process automation,RPA)和验收测试驱动开发(acceptance test-driven development,ATDD)等方面。它支持Python 2.7.14及其更高版本。
优点:
- 它适用于所有类型的应用程序,包括:Web应用程序、移动应用程序、以及桌面应用程序等。
- 通过采用关键字驱动方法 (Keyword Driven Approach,KDA),它允许开发者在无需编程经验的情况下,以人类可读的关键字创建测试用例。
- 它支持源自RF v4.0的原生IF/ELSE语法。
- 它提供了专门的社区支持和多种资源。
缺点:
- 报告的定制过程较为复杂。
- 虽然该框架的并行测试范围比较有限,但是可以通过Pabot(一种机器人框架的并行执行器,https://pabot.org/)来实现。
Pytest
作为最常用的Python自动化测试框架之一,Pytest主要被用于单元、功能、以及API等方面的测试。它支持Python 3.5及其更高版本。
优点:
- 通过提供fixtures,来覆盖所有的参数组合,而无需重新编写代码。
- 支持包括:pytest-randomly、pytest-cov、pytest-django、以及pytest-bdd在内的多种插件。
- 支持pytest html插件。开发人员只需一个命令,即可针对自动化测试套件生成html类型的报告。
- 支持使用pytest-xdist插件并行执行各种测试用例。
缺点:
- 由于pytest拥有一个单独编写测试用例的例程,因此它与其他测试框架的兼容性较差。
PyUnit
作为由Python附带的默认测试框架,PyUnit受到了许多开发人员的青睐。同时,作为一个单元测试的框架,它主要借鉴了流行的Java测试框架--JUnit。
优点:
- 由于属于默认的Python包,因此PyUnit无需额外的安装与设置。
- 能够快速地生成XML和unittest-sml-reporting两种测试报告。
缺点:
- 有时会涉及到大量的样板代码(boilerplate code)。
- 由于它是基于JUnit的,因此使用了camelCase命名方式,而非Python snake_case的命名约定。
Behave
作为最流行的Python行为驱动开发(behavior-driven development,BDD)自动化测试框架之一,Behave在功能上与Cucumber框架非常相似。
优点:
- 它既可以完全支持Gherkin语言,又能够以可读性的语言去编写测试用例,以便于非技术团队的参与。
- 它具有针对Django和Flask的集成。
缺点:
- 它仅适用于黑盒测试。
- 它不支持并行测试。
使用Selenium和Pytest框架来设置Python
有了前面Selenium WebDriver架构和四大Python测试框架的基础,下面让我们开始在Windows上安装,并运行基于Selenium的自动化测试。
第 1 步: 下载并安装适用于Windows的Python。当然,如果您的计算机上已安装了Python,则完全可以跳过此步。
第 2 步: 为了在Python中安装和管理代码包,您必须使用Python在本地主机上提前安装PIP(可以从Python官网处,下载包管理系统)。在完成下载后,您可以使用如下命令进行安装:
- python get-pip.py
并使用如下命令,来确认PIP是否已被正确安装:
- pip –version
第 3 步: 为了构建自动化测试套件,我们需要通过执行如下命令,来安装Pytest库Pytest:
- pip install -U pytest
并使用如下命令,来确认Pytest是否已被正确安装:
- pytest –version
第 4 步: 使用PIP的如下命令,来安装Selenium框架:
- pip install -U selenium
并使用如下命令,来确认被安装的selenium的版本:
- python -c “import selenium; print(selenium.__version__)”
第 5 步: 为了保持浏览器的独立性,我们无需专门下载针对某种浏览器的驱动程序。相反,我们会使用如下命令来安装开源库:WebDriver-Manager,以自动管理不同的浏览器驱动:
- pip install webdriver-manager
并使用如下命令,来确认Selenium和Webdriver-manager是否已被正确安装:
- pip list
至此,我们已经满足了使用Python去运行基于Selenium的自动化测试的先决条件。下面,让我们通过编写脚本,快速地创建如下简单的测试场景:
1. 直接访问pCloudy主页
2. 点击登录
3. 获取页面标题
4. 断言登录页面的标题
在此,我们使用pytest框架的selenium-python脚本:
- import pytest
- from selenium
- import webdriver
- from webdriver_manager.chrome
- import ChromeDriverManager
- import sys
- from selenium.webdriver.chrome.options
- import Options
- from selenium.webdriver.common.keys
- import Keys
- from time
- import sleep
- def pcloudy_sample_test(): driver = webdriver.Chrome(ChromeDriverManager().install())
- driver.get('https://www.pcloudy.com/') driver.maximize_window()
- driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)
- title = "" Remote Mobile Web & Application Testing on Real Android Devices - pCloudy ""
- assert title == driver.title
- driver.close()
正如上述代码所示,我们最初导入了那些自动化测试所需的代码库。为了创建函数,我们首先使用WebDriverManager来调用Chrome浏览器。WebDriverManager会去检查最新版本的WebDriver的二进制文件,如果不在目标系统上,则需额外下载。接着,我们会导出Selenium所需的WebDriver环境变量。在启动浏览器后,我们将pCloudy主页的URL传递给浏览器,并将浏览器最大化,以获得更好的分辨率。
在使用XPATH定位器加载了pCloudy主页之后,我们会通过登录按钮,定向到登录页面上。最后,我们使用主页的预期检索标题,去断言实际的标题。如果断言通过,那么测试用例会被标记为已通过,否则会被标记为失败。最终,在执行完毕时,程序会关闭正在运行的会话。
在pCloudy Browser Cloud上运行Pytest框架的跨浏览器测试
作为一种可持续测试的云服务,pCloudy提供了跨浏览器测试(无论是Windows平台还是Mac平台)的功能。其中,Browser Cloud平台允许用户访问那些被托管在云端的远程主机,并且能够在Selenium自动化框架中,使用RemoteWebDriver。因此,我们可以在云端,模拟不同的环境(例如:不同的浏览器、某个浏览器的多个版本、以及不同操作系统),并开展各种自动化测试。
同时,Browser Cloud自动化测试平台,可以在各种云托管的主机上,对Web应用程序开展手动测试。如果您的自动化测试在某个特定环境中出现了失败,那么您只需从UI中选择相同的环境,就可以在pCloudy的相同环境中,手动运行该测试。
下面是基于Pytest框架的Selenium脚本。它将在pCloudy的Browser Cloud上执行跨浏览器的测试:
- import pytest
- from os
- import environ
- from selenium
- import webdriver
- from selenium.common.exceptions
- import WebDriverException
- from selenium.webdriver.remote.remote_connection
- import RemoteConnection
- @pytest.fixture(scope = 'function')
- def driver():
- desired_caps = {}
- browser = { "pCloudy_Username": "ramit.dhamija@gmail.com", "apiKey": "5TfF4UcNRbN3JhucQ", "clientName": "ramit.dhamija@gmail.com", "email": "ramit.dhamija@gmail.com", "os": "Mac", "osVersion": "Catalina", "browserName": "safari", "browserVersions": "14", "pCloudy_EnableVideo": "true", "pCloudy_EnablePerformanceData": "true", "pCloudy_EnableDeviceLogs": "true"
- }
- desired_caps.update(browser)
- selenium_endpoint = "https://prod-browsercloud-in.pcloudy.com/seleniumcloud/wd/hub"
- executor = RemoteConnection(selenium_endpoint, resolve_ip = False) browser = webdriver.Remote( command_executor = executor, desired_capabilities = desired_caps )
- yield browser
sample_login_test.py的代码内容为:
- import pytest
- import sys
- @pytest.mark.usefixtures('driver')
- class TestLink: def test_title(self, driver): ""
- " Verify click and title of login page: return :None "" "
- driver.get('https://www.pcloudy.com/') driver.maximize_window()
- driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)
- title = ""
- Remote Mobile Web & Application Testing on Real Android Devices - pCloudy ""
- assert title == driver.title driver.quit()
您可以执行如下pytest测试脚本的命令:
- pytest -n=2 tests\sample_login_test.py
其中,-n用于指定并行测试执行的次数。
正如上述代码所示,在我们的第一个脚本中,我们用到了pytest的fixtures。它们会在每个对应的测试函数之前,事先被运行。在fixtures中定义的范围——'function'是fixture的默认值,它表示fixture将在每个测试会话中执行一次。
为了能够在pCloudy浏览器的云中运行测试,我们定义了“用户名+API密钥”方式的pCloudy身份验证等函数。此外,在必需的功能中,我们定义了各种运行所需的环境,其中包括Mac操作系统的Catalina版本和Safari-14浏览器。
当然,在pCloudy中,被用来捕获测试视频记录、性能数据、以及日志的内置功能,其实并不多。为了能够在pCloudy Selenium网格上运行测试,我们将Selenium网格的URL定义为selenium_endpoint。被连接的节点主机将会根据所用到的测试环境,进行自动分配。此外,在第一个脚本的末尾,我们会生成一个浏览器,用于存储和更新自动化测试所需的各项功能。
而在下一个脚本中,我们用到了与之前在pCloudy登录页面处断言标题是否相同的Selenium脚本。该自动化测试会在pCloudy Browser Cloud中模拟Mac-Catalina、Safari-14等环境运行。
pCloudy的输出:
- 若要查看测试的当前运行状态,请重定向到pCloudy设备页面,依次点击“报告”->“我的活动会话”。
- 若要查看目前已执行的所有测试,请直接跳转到pCloudy设备页面,依次单击“报告”->“所有报告”。
- 若要查看特定测试的日志和快照,请直接跳转到pCloudy设备页面,依次单击“报告”->“所有报告”,并对需要日志和截屏的特定会话名称执行相关的操作。
原文标题:Setting up Modern Web Test Automation Framework with Selenium and Python,作者:Ramit Dhamija
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】