用Selnium和Python构建自动化Web测试框架

译文
开发 前端 自动化
本文和您探讨了Selenium WebDriver架构的基本概念,四大Python自动化测试框架,以及如何使用Selenium与Python,来构建自动化的Web测试框架。

[[417910]]

【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官网处,下载包管理系统)。在完成下载后,您可以使用如下命令进行安装:

  1. python get-pip.py 

并使用如下命令,来确认PIP是否已被正确安装:

  1. pip –version 

第 3 步: 为了构建自动化测试套件,我们需要通过执行如下命令,来安装Pytest库Pytest:

  1. pip install -U pytest 

并使用如下命令,来确认Pytest是否已被正确安装: 

  1. pytest –version 

第 4 步: 使用PIP的如下命令,来安装Selenium框架:

  1. pip install -U selenium 

并使用如下命令,来确认被安装的selenium的版本:

  1. python -c “import selenium; print(selenium.__version__)” 

第 5 步: 为了保持浏览器的独立性,我们无需专门下载针对某种浏览器的驱动程序。相反,我们会使用如下命令来安装开源库:WebDriver-Manager,以自动管理不同的浏览器驱动:

  1. pip install webdriver-manager 

并使用如下命令,来确认Selenium和Webdriver-manager是否已被正确安装:

  1. pip list 

至此,我们已经满足了使用Python去运行基于Selenium的自动化测试的先决条件。下面,让我们通过编写脚本,快速地创建如下简单的测试场景:

1. 直接访问pCloudy主页

2. 点击登录

3. 获取页面标题

4. 断言登录页面的标题

在此,我们使用pytest框架的selenium-python脚本:

  1. import pytest 
  2. from selenium 
  3. import webdriver 
  4. from webdriver_manager.chrome 
  5. import ChromeDriverManager 
  6. import sys 
  7. from selenium.webdriver.chrome.options 
  8. import Options 
  9. from selenium.webdriver.common.keys 
  10. import Keys 
  11. from time 
  12. import sleep  
  13. def pcloudy_sample_test():     driver = webdriver.Chrome(ChromeDriverManager().install())  
  14. driver.get('https://www.pcloudy.com/') driver.maximize_window()  
  15. driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)  
  16. title = "" Remote Mobile Web & Application Testing on Real Android Devices - pCloudy "" 
  17. assert title == driver.title  
  18. 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上执行跨浏览器的测试:

  1. import pytest 
  2. from os 
  3. import environ  
  4. from selenium 
  5. import webdriver 
  6. from selenium.common.exceptions 
  7. import WebDriverException 
  8. from selenium.webdriver.remote.remote_connection 
  9. import RemoteConnection  
  10. @pytest.fixture(scope = 'function'
  11. def driver(): 
  12.     desired_caps = {}  
  13. 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" 
  14. }  
  15. desired_caps.update(browser)  
  16. selenium_endpoint = "https://prod-browsercloud-in.pcloudy.com/seleniumcloud/wd/hub" 
  17.  executor = RemoteConnection(selenium_endpoint, resolve_ip = False) browser = webdriver.Remote(    command_executor = executor,    desired_capabilities = desired_caps ) 
  18. yield browser 

sample_login_test.py的代码内容为:

  1. import pytest 
  2. import sys  
  3. @pytest.mark.usefixtures('driver'
  4. class TestLink:     def test_title(self, driver):    "" 
  5. " Verify click and title of login page: return :None "" " 
  6. driver.get('https://www.pcloudy.com/') driver.maximize_window()  
  7. driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)  
  8. title = "" 
  9. Remote Mobile Web & Application Testing on Real Android Devices - pCloudy "" 
  10. assert title == driver.title driver.quit() 

您可以执行如下pytest测试脚本的命令:

  1. 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】

 

责任编辑:华轩 来源: 51CTO
相关推荐

2011-06-03 17:06:09

自动化测试

2023-09-13 11:40:12

2011-01-20 10:17:25

ibmdwWeb

2012-03-29 10:57:12

Web自动化测试

2017-01-06 10:54:03

AndroidiOSJenkins

2009-08-19 09:00:48

单元测试框架自动化测试

2021-06-26 07:40:21

前端自动化测试Jest

2019-04-22 09:00:00

Python框架自动化测试

2020-08-03 15:40:57

Web自动化工具测试

2017-12-24 21:00:10

自动化测试测试框架敏捷

2012-12-24 22:54:31

2023-05-18 14:01:00

前端自动化测试

2012-09-04 10:20:31

IBMdw

2020-09-14 07:00:00

测试自动化框架

2020-04-28 09:00:00

测试测试自动化

2023-10-12 07:40:54

Minium自动化框架

2019-04-18 09:00:00

Java自动化测试框架

2018-05-11 08:29:10

Python自动化测试数据驱动

2018-05-11 13:39:05

PythonCSV接口测试

2019-02-20 11:19:52

Python 开发编程语言
点赞
收藏

51CTO技术栈公众号