目录
自动化测试
通过测试工具,测试脚本等手段,按照测试工程师的预定计划对软件产品进行自动的测试,从而验证软件是否满足用户的需求。
特点
可重复性
可操作系统
高效率
通常情况下,引入自动化测试需要满足以下条件:
项目需求变动不频繁
项目周期足够长
自动化测试脚本可重复使用
自动化测试的适用范围
对涉及非常重要的测试和范围宽广的测试。如组件、功能、性能、安全性、移动 APP 的兼容性测试等;内部系统之间的交互点。
期望测试结果完全可以预料,测试的复用性要求较强的情形。
要求加快软件开发周期,期望通过自动化测试缩短测试周期,并通过自动化测试希望增加软件信度的测试。如安全性测试等
执行某些手工测试困难或不可能进行的测试。如性能测试的负载测试等。
对运行频繁的测试,或在较少时间内需更多测试。
需要进行全面、准确、快速响应的测试,并进行全面的测试管理运用。如实施测试管理的全过程。
自动化测试的局限
自动化测试不能代替手工测试,有其局限性,具体表现在:
预期结果不确定时;
缺乏自动化测试经验时;
文档较少或文档不一致时;
发现缺陷能力不足;
测试成本较高。
以用户登录功能为例,如何使用自动化测试技术对其进行测试?
执行测试前,应完成测试用例设计
自动化测试的原理
录制/回放技术
测试过程
自动录制手工操作,转化为测试脚本;
通过在脚本中插入指令来设置校验点;
测试工具通过读取脚本,执行插入的指令,并根据脚本的设置重复执行制定的测试用例。
自动化测试的流程
测试用例模板
自动化测试的关键技术
对象识别;
Windows对象; App对象; Web对象;
脚本技术;
- 线性脚本:是录制手工执行的测试用例得到的脚本,这种脚本包含所有的击键、移动、输入数据等,所有录制的测试用例都可以得到完整的回放
- 结构化脚本:类似于结构化程序设计,具有各种逻辑结构、函数调用功能
- 数据驱动脚本:将测试输入存储在独立的(数据)文件中,而不是存储在脚本中
- 关键字驱动:“填表格”式的关键字驱动封装了很多底层的东西,测试人员进行自动化测试时只要考虑3个问题就可以了:做什么、对谁做、怎么做。
自动比较技术;
- 静态比较和动态比较,
- 简单比较和复杂比较,
- 敏感性测试比较和健壮性测试比较
- 比较过滤器
验证点命令 | 对象 | 值 |
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自动化测试工具
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作网站一样。Selenium支持的浏览器包括IE(7, 8, 9, 10, 11)、Mozilla Firefox、Safari、Google Chrome、Opera等。这个工具的主要功能包括:
测试与浏览器的兼容性 、测试系统功能
在普遍的经验中,一般会对具有下列特征的项目开展UI自动化测试:
软件需求变动不频繁
项目周期较长
Selenium IDE:嵌入在Firefox浏览器中的插件,用于在Firefox上录制与回放Selenium脚本。
接下来编写第一个Selenium Python脚本,本例使用Selenium WebDriver提供的类和方法模拟用户与浏览器的交互,代码如下所示。
不同的浏览器版本需要下载匹配其版本的驱动程序
谷歌:http://npm.taobao.org/mirrors/chromedriver/
火狐:https://github.com/mozilla/geckodriver/releases
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
查看自己的谷歌浏览器对应驱动版本_谷歌浏览器驱动_微信153的博客-CSDN博客
Selenium WebDriver:用于操作浏览器的一套API,可以支持多种编程语言。
Selenium-client是测试人员编写的测试代码,但是这些代码无法直接操作浏览器,而WebDriver(也就是浏览器所对应的驱动程序)在Selenium脚本和浏览器之间扮演了类似中介的角色,实际上是Selenium-client去请求WebDriver,然后WebDriver通过调用浏览器原生组件驱动浏览器操作。
WebDirver通过一些方法来实现与浏览器窗口、网页和页面元素的交互。
Selenium WebDriver的功能
示例:定位一组元素
此示例用于在百度首页找到所有的链接,并输出链接文字
WebElement接口
Selenium Grid:支持在若干个节点上并行执行多个测试,这些结点可以运行不同的浏览器和操作系统。
========================================================================
实验
Web自动化测试
1. 主流的Web自动化测试工具
(1) QTP QTP是一个商业化的功能测试工具,收费,支持web,桌面自动化测试。
(2)Selenium(本课学习) Selenium是一个开源的web自动化测试工具,免费,主要做功能测试。
(3)Robot framework Robot Framework是一个基于Python可扩展地关键字驱动的测试自动化框架。
Selenium家族史
基于Python环境搭建
1. Python 开发环境
2. 安装selenium包
pip install selenium
3. 安装浏览器
4. 安装浏览器驱动 -- 保证能够用程序驱动浏览器,实现自动化测试(可放置在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()
页面元素定位
1. 如何进行元素定位?
html页面由标签构成,标签的基本格式如下:
<标签名 属性名1="属性值1" 属性名2="属性值2">文本</标签名>
示例:
<input id="username" type="text" name="username" placeholder="用户名" />
<div id="my_cart">
<span>我的购物车</span>
</div>
元素定位就是通过元素的信息或元素层级结构来定位元素的。
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)
partial_link_text element = driver.find_element_by_partial_link_text(partial_link_text)
XPath element = driver.find_element_by_xpath(xpath)
CSS element = driver.find_element_by_css_selector(css_selector)
例:id定位方式
id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的; 前提:元素有id属性 id定位方法:element = driver.find_element_by_id(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()方法来输入内容
元素常用操作方法
id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的; 前提:元素有id属性 id定位方法:element = driver.find_element_by_id(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()方法来输入内容
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测试报告_unittest生成html报告_是李黏黏鸭的博客-CSDN博客
=========================================================================
(1)打开网上蛋糕商城购物系统首页,使用Python+Selenium自动化测试工具,编写脚本,完成以下操作:
① 通过链接文本定位登录链接,并单击登录链接。
② 打开登录页面后,切换页面窗口到登录页面窗口,通过name属性定位用户名,并输入正确的用户名”admin”。
③ 通过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()
(2)请根据提供的测试用例模板,针对登录功能设计测试用例,并根据设计的测试用例编写自动化测试脚本,要求使用Unittest框架进行测试用例管理,并生成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()
测试文件
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)
效果图