10、自动化测试技术
目录
自动化测试
特点
通常情况下,引入自动化测试需要满足以下条件:
自动化测试的适用范围
自动化测试的局限
自动化测试的原理
自动化测试的流程
测试用例模板
自动化测试的关键技术
对象识别;
脚本技术;
自动比较技术;
自动化测试框架。
实验
Web自动化测试
1. 主流的Web自动化测试工具
Selenium家族史
基于Python环境搭建
页面元素定位
2. 元素定位方式
元素常用操作方法
Unitest单元测试框架
为什么使用UnitTest框架
UnitTest核心要素
Unitest断言方法(直接在测试类中使用即可)
生成HTML测试报告
HTML测试报告生成步骤
自动化测试
借助测试工具及相关测试脚本等工具,在依据预先制定的测试方案下进行自动化测试,在此过程中可确保软件能够满足用户需求。
特点
可重复性
可操作系统
高效率
通常情况下,引入自动化测试需要满足以下条件:
项目需求变动不频繁
项目周期足够长
自动化测试脚本可重复使用
自动化测试的适用范围
对涉及关键性的测试项目以及涵盖面广的综合测试进行评估。例如:从组件性能到功能完整性再到移动平台兼容性等方面进行系统验证;同时特别关注内部系统的交互点与数据流处理能力
期望测试结果完全可以预料,测试的复用性要求较强的情形。
要求加快软件开发周期, 期望通过自动化测试缩短测试周期, 并通过自动化测试希望增加软件信度的测试. 如安全性测试等
执行某些手工测试困难或不可能进行的测试。如性能测试的负载测试等。
对频繁的测试,或在较少时间内需更多测试。
对于实施全面的测试管理而言,必须具备全方位、精确且即时反馈的能力。例如,在整个测试管理流程中进行系统性评估与优化工作。
自动化测试的局限
自动化测试不能代替手工测试,有其局限性,具体表现在:
预期结果不确定时;
缺乏自动化测试经验时;
文档较少或文档不一致时;
发现缺陷能力不足;
测试成本较高。
以用户登录功能为例,如何使用自动化测试技术对其进行测试?
执行测试前,应完成测试用例设计

自动化测试的原理
录制/回放技术
测试过程
自动录制手工操作,转化为测试脚本;
通过在脚本中插入指令来设置校验点;
自动化测试平台能够解析配置文件并生成所需操作指令。该平台按照预先定义的参数组合运行预设测试序列,并在设定的时间间隔内完成周期性任务模式下的操作。
自动化测试的流程

测试用例模板


自动化测试的关键技术
对象识别;
Windows对象; App对象; Web对象;
脚本技术;
- 线性脚本:是指通过人工操作运行并记录下来的测试指令序列。这种指令序列包含了所有的击键操作、移动操作以及输入的数据等,并且所有录制完成的测试指令都能完整地进行回放。
- 结构化脚本:类似于典型的程序结构设计方法,在其中包含各种逻辑分支和函数调用等功能。
- 数据驱动脚本:它将预先准备好的测试输入存储在一个独立的数据文件中,并非直接嵌入到脚本代码中。
- 关键字驱动:"填表格"式的关键字驱动方式实际上封装了许多底层的操作功能。当测试人员进行自动化测试时,则只需要关注三个问题即可:
- 做什么
- 对谁做
- 怎么做
自动比较技术;
- 静态分析与动态分析,
- 基本对比与深入对比,
- 敏感度评估与鲁棒性评估
- 比较筛选机制
| 验证点命令 | 对象 | 值 |
|---|---|---|
| verifyTitle | My Page | |
| verifyValue | nameField | John Smith |
| verifySelected | dorpdown2 | value=js*123 |
| verifyTextPresent | You are now logged in | |
| verifyAttribute | txt1@class | bigAndBlod |
| verfyVisible | postcode |
自动化测试框架。
Selenium自动化测试工具
作为专业的Web应用程序自动化测试工具,Selenium其测试功能模拟了真实用户对网站的操作流程.该工具支持广泛主流浏览器如IE系列版本从7到11号 Mozilla Firefox Safari Google Chrome以及 Opera等.Selenium该工具的主要功能体现在以下几个方面:
测试与浏览器的兼容性 、测试系统功能
在普遍的经验中,一般会对具有下列特征的项目开展UI自动化测试:
软件需求变动不频繁
项目周期较长

Selenium Web Development Environment:作为内置工具,在Firefox浏览器中集成使用。该工具旨在支持在Firefox环境中生成并执行相应的测试脚本演示。
接下来创建第一款Selenium Python自动化测试工具

不同的浏览器版本需要下载匹配其版本的驱动程序
谷歌:http://npm.taobao.org/mirrors/chromedriver/
火狐:https://github.com/mozilla/geckodriver/releases
该Edge版本工具包:官方文档开发人员可访问https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
访问个人设置-设备管理器-系统属性-高级选项卡中找到对应的设备类型
Selenium WebDriver:用于操作浏览器的一套API,可以支持多种编程语言。
它是测试团队编写的一组供测试人员使用的代码库;然而这些代码无法直接操控browser;而WebDriver(亦即对应于browser的驱动程序)在selenium脚本与browser之间扮演了中介角色;实际上它是selenium客户端向webdriver发送请求,并由webdriver通过调用browser内置组件来完成对browser的操作。

WebDirver通过一些方法来实现与浏览器窗口、网页和页面元素的交互。

Selenium WebDriver的功能

示例:定位一组元素
此示例用于在百度首页找到所有的链接,并输出链接文字

WebElement接口


Selenium Grid 兼容多个节点环境,在每个节点上同时运行多个测试,并且这些节点能够使用不同的浏览器和操作系统。
========================================================================
实验
Web自动化测试
1. 主流的Web自动化测试工具
(1) QTP QTP是一个商业化的功能测试工具,收费,支持web,桌面自动化测试。
(2)Selenium(本课程) Selenium是一个免费的开源web自动化测试工具,并主要用于功能测试。
该框架以Python语言为基础,并通过关键字驱动实现了一种高效的测试自动化方案。
Selenium家族史

基于Python环境搭建
1. Python 开发环境
2. 安装selenium包
pip install selenium
3. 安装浏览器
配置浏览器运行环境 -- 确保可以通过程序控制浏览器完成自动化测试流程,并且可以选择将该配置文件放置在Python的主安装目录或项目所在的目录位置
示例:通过程序启动浏览器,并打开百度首页,暂停3秒,关闭浏览器
1. 导包
from selenium import webdriver
import time
2. 创建浏览器驱动对象
Firefox浏览器:driver = webdriver.Firefox()
Chrome浏览器:driver = webdriver.Chrome()
Edge浏览器:driver = webdriver.Edge()
3. 打开Web页面
driver.get("http://www.baidu.com/")
4. 暂停
time.sleep(3)
5. 关闭驱动对象
driver.quit()
python

页面元素定位
1. 如何进行元素定位?
html页面由标签构成,标签的基本格式如下:
<标签名 属性名1="属性值1" 属性名2="属性值2">文本</标签名>
示例:
<input id="username" type="text" name="username" placeholder="用户名" />
<div id="my_cart">
<span>我的购物车</span>
</div>
python
元素定位就是通过元素的信息或元素层级结构来定位元素的。
2. 元素定位方式
Selenium提供了八种定位元素方式
id element = driver.find_element_by_id(id)
name element = driver.find_element_by_name(name)
class_name element = driver.find_element_by_class_name(class_name)
tag_name element = driver.find_element_by_tag_name(tag_name)
link_text element = driver.find_element_by_link_text(link_text)
variable partialLinkText = driver.findElementUsingPartialLinkText(partialLinkText)
XPath element = driver.find_element_by_xpath(xpath)
CSS element = driver.find_element_by_css_selector(css_selector)
例:id定位方式
通过查询元素的唯一ID属性来确定元素位置即为ID定位法,在HTML标准中要求每个元素的ID属性必须唯一以确保正确解析。前提条件是目标元素需具备唯一的ID属性具体操作步骤如下:使用WebDriver实例查找所需元素并调用其find_element_by_id方法即可实现目标
1. 导入selenium包 --> from selenium import webdriver
2. 导入time包 --> import time
3. 实例化浏览器驱动对象 --> driver = webdriver.Firefox()
4. 打开登录页A.html --> driver.get(url)
5. 调用id定位方法 --> element = driver.find_element_by_id("")
6. 使用send_keys()方法输入内容 --> element.send_keys("admin")
7. 暂停3秒 --> time.sleep(3)
8. 关闭浏览器驱动对象 --> driver.quit()
说明:为了更好的学习体验,我们先暂时使用下send_keys()方法来输入内容
python
元素常用操作方法
通过获取元素的ID属性值来确定元素的位置即为ID定位法;基于HTML标准的规定每个元素的ID必须唯一以确保正确引用与定位;先决条件是该元素具有唯一的ID标识;具体操作步骤如下:使用WebDriver实例调用find_element_by_id方法获取目标元素
1. 导入selenium包 --> from selenium import webdriver
2. 导入time包 --> import time
3. 实例化浏览器驱动对象 --> driver = webdriver.Firefox()
4. 打开登录页A.html --> driver.get(url)
5. 调用id定位方法 --> element = driver.find_element_by_id("")
6. 使用send_keys()方法输入内容 --> element.send_keys("admin")
7. 暂停3秒 --> time.sleep(3)
8. 关闭浏览器驱动对象 --> driver.quit()
说明:为了更好的学习体验,我们先暂时使用下send_keys()方法来输入内容
python
Unitest单元测试框架
UnitTest是Python自带的一个单元测试框架,用它来做单元测试
为什么使用UnitTest框架
1. 能够组织多个用例去执行
2. 提供丰富的断言方法
3. 能够生成测试报告
UnitTest核心要素
1. TestCase
2. TestSuite
3. TestRunner
4. Fixture
案例:蛋糕商城购物系统登录功能自动化测试
实现思路
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头

Unitest断言方法(直接在测试类中使用即可)
| 序号 | 断言方法 | 断言描述 |
|---|---|---|
| 1 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
| 2 | assertFalse(expr, msg=None) | 验证expr是false,如果为true,则fail |
| 3 | assertEqual(expected, actual,msg=None) | 验证expected==actual,不等则fail 【掌握】 |
| 4 | assertNotEqual(first, second,msg=None) | 验证first != second, 相等则fail |
| 5 | assertIsNone(obj, msg=None) | 验证obj是None,不是则fail |
| 6 | assertIsNotNone(obj, msg=None) | 验证obj不是None,是则fail |
| 7 | assertIn(member, container, msg=None) | 验证是否member in container【掌握】 |
| 8 | assertNotIn(member, container,msg=None) | 验证是否member not in container |
生成HTML测试报告
HTMLTestReport
UnitTest框架本身不支持生成HTML格式的测试报告
在网上的资源库中存在多种工具能够实现类似的功能。这些工具的基本操作流程大致相同但它们输出的结果可能会因为HTML格式的不同而有所差异。
本课程中使用 HTMLTestReport 类库来生成测试报告
HTML测试报告生成步骤
1. 导包: from htmltestreport import HTMLTestReport
2. 封装测试套件
3. 实例化HTMLTestReport对象
4. 执行测试套件: report.run(suite)
该文章介绍了37个UnitTest框架中的一种方法用于生成基于HTML的测试报告,并详细说明了其实现过程及具体应用案例
=========================================================================
访问蛋糕商城的线上购物系统主页,并利用Python+Selenium自动化测试工具开发自动化测试脚本以实现相应的功能测试。
① 通过链接文本定位登录链接,并单击登录链接。
打开登录页面后
③ 通过xpath相对路径定位密码,并输入正确的密码”admin”。
④ 通过CSS定位方式中属性选择器定位登录按钮并单击。
⑤ 停留5秒后关闭浏览器。
我在jupyter上写的
from selenium import webdriver
import time
#实例化浏览器对象
driver=webdriver.Chrome()
#打开系统页面
driver.get("http://localhost:8080/")
driver.find_element_by_link_text("登录").click()
driver.find_element_by_name("ue").send_keys("admin")
driver.find_element_by_xpath("//input[@type='password']").send_keys("admin")
driver.find_element_by_xpath("//input[@type='submit']").click()
#强制等待
time.sleep(3)
driver.quit()
python

请基于所给定的测试用例模板,在针对登录功能制定相应的步骤,并依据制定的步骤编写自动化测试脚本;同时采用Unitest框架管理所有必要的数据,并输出相应的HTML格式报告
**测试脚本**
# 测试脚本
import unittest
import time
from selenium import webdriver
from htmltestreport import HTMLTestReport
class LoginTestCase(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.driver.get("http://localhost:8080/user_login.jsp")
login_link = self.driver.find_element_by_link_text("登录")
print(login_link.text)
login_link.click()
self.driver.switch_to.window(self.driver.current_window_handle)
#测试方法,一个测试方法执行一条测试用例
def test_login(self):
# 定位用户名输入框
username = self.driver.find_element_by_name("ue")
username.send_keys("admin")
# 定位密码输入框
password = self.driver.find_element_by_xpath("//input[@type='password']")
password.send_keys("123")
# 定位登录按钮
login_btn = self.driver.find_element_by_xpath("//input[@type='submit']")
login_btn.click()
msg = self.driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]").text
self.assertIn("用户名、邮箱或者密码错误,请重新登录!", msg)
def tearDown(self):
time.sleep(3)
self.driver.quit()
python

测试文件
import unittest
from htmltestreport import HTMLTestReport
from lab10_2 import LoginTestCase
# 生成测试套件
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(LoginTestCase))
# 实例化HTMLTestReport对象
report_path = "./report.html"
report = HTMLTestReport(report_path,title='登录测试报告',description='LoginTestCase函数测试报告V1.0')
# 执行测试套件
report.run(suite)
python

效果图

