软件测试

TIP

以一个前端的角度学习测试,非专业测试

最后更新时间:2019年6月15日

字数:10417

每天都在更新中...

自动化

简单来说:自动化就是由机器设备代替人为自动完成指定目标的过程

自动化优点

  • 减少人力物力,节省成本
  • 产品标准统一,规模化生产

自动化测试

  • 简单来说就是:让程序代替人为去验证程序功能的过程

自动化测试优点

  • 提高测试执行效率,节约时间成本
  • 解放人力去做更重要的工作
  • 可重复利用,建设对人的依赖
  • 提升客户满意度
  • 提升测试团队的整体水平
  • 可大幅度减少兼容性测试的工作量
  • 有些测试工作必须依靠自动化实现来完成

自动化测试缺点

  • 开发测试脚本需要花费较大的时间成本,拉长周期
  • 产品的快速迭代,自动化脚本也将不断迭代,时间成本很高
  • 不同的项目之间自动化脚本的复用度很低
  • 对短期型项目产品实现自动化价值不高
  • 自动化无法完全代替手工测试找到bug,实现100%覆盖
  • 自动化更多的适用于回归测试
  • 自动化开发过程对软件测试团队的技术有更高的要求

为什么要进行自动化测试

  • 解决 — 回归测试
  • 解决 — 压力测试
  • 解决 — 兼容性测试
  • 提高测试效率,保证产品质量

回归测试

  • 项目在发新版本之后对项目之前的功能进行验证

压力测试

  • 多用户同时去操作软件,统计软件服务器处理多用户请求的能力

兼容性测试

  • 不同浏览器(IE、Firefox、Chrome)等等

TIP

兼容性问题是前段绕不过的一道坎,各家都在全力推广各家的标准,坑!

自动化测试分类

  • 按测试目的分类大致可划分为:

    • 功能自动化测试
    • 性能自动化测试
  • 按测试对象可以划分为:

    • Web应用测试
    • APP测试
    • 接口测试
    • 单元测试等

TIP

有了自动化测试,并不意味着任何时候都可以进行自动化测试,自动化测试一般在手工测试完毕之后的阶段,并且项目满足一定的特点之后,才可以进行自动化测试,否则,得不偿失!

web自动化测试

主流测试工具

  • QTP(Quick Test Professional)

  • Selenium(浏览器自动化测试框架)

    • 免费开源的web自动化测试
    • 许多大公司都采用,开源可定制线强
  • Jmeter

    • Apache公司的java开源测试框架
    • web测试,接口测试,性能测试
  • LoadRunner

    • 商业收费
    • 主要做性能测试
  • Robot Framework

    • Python可扩展
    • 关键字驱动
    • 自动化测试框架

开发环境

  • python(脚本编写语言)
  • pycharm(Python IDE)
  • selenium(自动化测试框架)
  • chrome(浏览器,也可以火狐)
  • WebDriver

Selenium

自动化测试框架

相关资料

Selenium 和 WebDriver

  • WebDriver 和 Selenium 都是自动化测试工具
  • WebDriver 曾经是 Selenium 的竞争对手
  • Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver
  • 也就是说 Selenium 2 是 Selenium 和 WebDriver 两个项目的合并,即 Selenium 2 兼容 Selenium,它既支持 Selenium API 也支持 WebDriver API

Selenium组成

  • Selenium主要由三种工具组成:
    • SeleniumIDE
      • 他是Firefox的扩展插件,支持用户录制和回访测试。
    • Selenium WebDriver
      • 它提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序
    • SeleniumGrid
      • 帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试

TIP

在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”**

Selenium IDE

  • selenium IDE是Firefox的一个插件,仅限安装与Firefox浏览器中,可实现网页操作步骤的录制和回放

  • 使用此插件可执行简单测试逻辑的自动化测试,可以将Selenium IDE插件的脚本导出为java、Python、C#等多种语言格式的程序代码,将认为操作网页的各种操作直接转换为自动化测试的程序代码,便于编写更为复杂的测试代码

  • 优点:

    • 小巧简单
    • 无需编程经验也能够快速上手使用
    • 可使用列表方式选择操作命令
  • 缺点:

    • 录制脚本转换为其他语言脚本时有可能出现一些错误,还需要自动化测试工程师人为修改
    • 仅适用于执行简单逻辑的自动化脚本测试,或通过录制方式导出相关语言的自动化测试脚本,不适用于执行大中型项目的自动化测试程序

TIP

小峰哥一般不使用IDE,局限性太大,一般都是自己编写脚本,进行测试

WebDriver

  • WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript
  • WebDriver与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制
  • 除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入
  • WebDriver支持:
    • Firefox(FirefoxDriver)
    • IE (InternetExplorerDriver)
    • Opera (OperaDriver)
    • Chrome (ChromeDriver)
  • 它还支持Android (AndroidDriver)和iPhone (IPhoneDriver)的移动应用测试
  • 它还包括一个基于HtmlUnit的无界面实现,称为HtmlUnitDriver
  • WebDriver API可以通过Python、Ruby、Java和C#访问,支持开发人员使用他们偏爱的编程语言来创建测试

Selenium Grid

  • selenium grid是selenium家族中的三大组件的一员
  • 为什么要用Selenium Grid:
    • 当我们在selenium webdriver中写好了各种脚本时,我们可能需要在不同的系统里,不同的浏览器下去运行
    • 我们的一个系统,可能有上万条用例需要执行。我们又不希望用例在回归时一条一条被执行,而是希望能够节省时间的批量执行用例
    • 基于以上两点,我们需要这个强大的组件grid

TIP

selenium grid这里就简单介绍一下,感兴趣的小伙伴可以去深入了解

selenium grid用法

WebDriver API(重点)

浏览器相关

这一部分我们将介绍关于浏览器相关的操作

打开网页

# 导入模块
from selenium import webdriver

"""
注意:
    打开操作浏览器需要安装想对应的浏览器Driver才行
"""

# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
# driver = webdriver.Firefox() # 打开火狐浏览器
# driver = webdriver.Ie() # 打开Ie浏览器
# 以此类推

# 打开网址:http://www.xuefeng666.com
driver.get("http://www.xuefeng666.com")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

设置休眠

  • 家在网页是需要时间的,所以我们可以稍微等待一下
  • python自带的模块time,可以实现我们需要的功能
# 导入模块
from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
# 打开百度
driver.get("http://www.xuefeng666.com")

# 延迟(设置休眠)

# 导入模块
import time

# 延迟3秒(单位:秒,可以是整数,也可以是小数)
time.sleep(3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

页面刷新

  • 有时候网页加载失败或者,我们需要刷新页面
  • 注意:这里的刷新和我们点击浏览器刷新按钮是一样的,会看到刷新按钮被点击
# 导入模块
from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
# 打开百度
driver.get("http://www.xuefeng666.com")

# 刷新页面
driver.refresh()
1
2
3
4
5
6
7
8
9

页面切换

  • 这里页面切换相当于点击浏览器的前进和后退
# 导入模块selenium
from selenium import webdriver
# 导入模块time
import time

# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
# 打开网页百度1
driver.get("http://www.baidu.com")
# 延迟3秒
time.sleep(3)
# 打开网页百度新闻
driver.get('http://news.baidu.com/')
# 延迟3秒
time.sleep(3)

# 切换到百度
driver.back()

# 延迟3秒
time.sleep(3)

# 切换到百度新闻
driver.forward()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

TIP

driver.get()打多个网页,其实是同一个tab标签,而不是新开tab或者新开窗口

打开新的tab

# 方法一
js='window.open("http://news.baidu.com/");'
# 执行js语句
driver.execute_script(js)

# 方法二
# 导入模拟键盘的包
# command + t :打开标签
# commamd + w :关闭当前抱歉
from  selenium.webdriver.common.keys import Keys
# windows 用Keys.CONTROL 如同ctrl+t
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't') 
# 关闭当前标签
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w') 
1
2
3
4
5
6
7
8
9
10
11
12
13
14

TIP

  • selenium可以执行js脚本打开新的页面
  • selenium可以模拟键盘按下,打开新的页面(奇怪的是上面的代码mac chrome执行没有成功,奇怪)
  • window.open()方法使用教程

设置窗口大小和位置

  • 我们可以设置浏览器窗口大小
  • 也可以设置最大化,最小化窗口
  • 设置窗口位置(最大化窗口后,设置窗口位置无效
# 导入模块selenium
from selenium import webdriver
# 导入模块time
import time

# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
driver.get("http://www.baidu.com")
time.sleep(3)

# 设置窗口大小
# 设置窗口指定大小
driver.set_window_size(100,100)

time.sleep(3)
# 设置窗口最大化
driver.maximize_window()

# 设置窗口最小化
time.sleep(3)
driver.minimize_window()

time.sleep(3)
# 设置浏览器位置
x = driver.get_window_position()['x'] #获取x轴的位置
y = driver.get_window_position()['y'] #获取y轴的位置
driver.set_window_position(x+40,y+0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

全屏截屏

  • 在做测试的时候,空口无凭都是白掐,特别是自动化测试的时候,更需要图片来佐证自己发现的问题
  • 我们可以用代码自动创建日期目录,并将截取的图片以年月日时分秒命名保存在当前日期目录下,这样就能很方便的查看图片保存路径,也方便管理自己的测试图片
  • 小峰哥用的是mac,保存图片目录,如果存在问题,可能是文件路径的写法问题,window请注意
# 导入模块selenium
from selenium import webdriver
# 导入模块time
import time

# 打开浏览器
driver = webdriver.Chrome() # 打开chrome
driver.get("http://www.baidu.com")
time.sleep(3)

# 截屏,保存到桌面,命名为1.png
# 方法一:get_screenshot_as_file
driver.get_screenshot_as_file("/Users/xiaofengge/Desktop/1.png")
# 方法二:save_screenshot
driver.save_screenshot("/Users/xiaofengge/Desktop/1.png")

# 根据日期保存截图
import os
# 生成年月日时分秒时间
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
directory_time = time.strftime("%Y-%m-%d", time.localtime(time.time()))
print(picture_time)
print(directory_time)
# 打印文件目录
print(os.getcwd())
# 获取到当前文件的目录,并检查是否有 directory_time 文件夹,如果不存在则自动新建 directory_time 文件
try:
    File_Path = os.getcwd() + '/' + directory_time + '/'
    if not os.path.exists(File_Path):
        os.makedirs(File_Path)
        print("目录新建成功:%s" % File_Path)
    else:
        print("目录已存在!!!")
except BaseException as msg:
    print("新建目录失败:%s" % msg)

driver = webdriver.Chrome()
driver.get("https://baidu.com/")
try:
    url=driver.save_screenshot('./' + directory_time + '/' + picture_time + '.png')
    print("%s :截图成功!!!" % url)
except BaseException as pic_msg:
    print("截图失败:%s" % pic_msg)
time.sleep(2)
driver.quit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

TIP

  • get_screenshot_as_file和save_screenshot效果一样,都是截图保存到本地
  • 这里的截图不是长图!不是长图!不是长图!
  • WebDriver.PhantomJS截图可以获取整个页面的长图,自己研究

局部截图(思路一)

  • 第一步:先截图全屏保存到本地
  • 第二步:找到和定位到自己需要局部截图的元素,相关坐标(location)和大小(size)
  • 第三部:根据location和size,使用Image的crop函数,从截图中再次截取我们需要的区域

浏览器退出

  • 退出分为2中:close和quit

close

关闭当前窗口,如果开启的多个窗口(tab),可以关闭当前tab

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开一个tab
driver.get("http://www.baidu.com")
# 4秒后关闭
time.sleep(4)
driver.close()
1
2
3
4
5
6
7
8

TIP

如果关闭的是当前最后一个tab,可能会关闭浏览器进程

quit

管理浏览器进程,所有的页面都会被关闭

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开一个tab
driver.get("http://www.baidu.com")
# 4秒后关闭
time.sleep(4)
driver.quit()
1
2
3
4
5
6
7
8

8元素定位方法

为什么要学习元素定位

  • 让程序操作指定元素,就必须先告诉机器是哪个元素
  • 类似JavaScript操作DOM一样,去找到元素
  • WebDriver提供了8种元素定位方式

8种元素定位方式

  • id
  • name
  • class_name
  • tag_name
  • link_text
  • partial_link_text
  • xpath
  • css

find_element_by_id

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com")
# 通过id定位元素
input = driver.find_element_by_id("kw")
# 页面加载需要时间,否则是定位不到元素的
time.sleep(3)
# 搜索小峰哥
input.send_keys("xiaofengge")
1
2
3
4
5
6
7
8
9
10
11

TIP

  • 在HTML文档中 id 必须是唯一的,但是开发人员让不唯一也不报错…..这是浏览器兼容机制

find_elements_by_id

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com")
# 定位元素
input = driver.find_elements_by_id("kw")
# 页面加载需要时间,否则是定位不到元素的
time.sleep(3)
# 搜索小峰哥
input[0].send_keys("xiaofengge")
1
2
3
4
5
6
7
8
9
10
11

TIP

  • find_elements_by_id 获取的是一个list,使用的时候要注意

  • 后续查找元素是elements的,都是获取到的是list

find_element_by_name

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com")
# 定位元素
input = driver.find_element_by_name("wd")
# 页面加载需要时间,否则是定位不到元素的
time.sleep(3)
# 搜索小峰哥
input.send_keys("xiaofengge")
1
2
3
4
5
6
7
8
9
10
11

TIP

find_elements_by_name

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com")
# 定位元素
input = driver.find_elements_by_name("wd")
# 页面加载需要时间,否则是定位不到元素的
time.sleep(3)
# 搜索小峰哥
input[0].send_keys("xiaofengge")
1
2
3
4
5
6
7
8
9
10
11