Python 领域运用之:自动化测试

1. 自动化测试简介

1.1 手工测试

手工测试是由人逐个的输入测试用例,然后观察程序运行结果,和预期结果进行比对。人工测试是一种低效的测试方法,对程序进行修改后,都需要人工重新执行测试用例,属于典型的重复劳动。

根据 51testing 的《中国软件测试从业人员调查报告》,在软件项目的测试环节,手工测试占到 89%,相对开发来说,测试的门槛底,薪资普遍较底,所要求的知识面虽然有一定广度,但缺乏深度。

因为手工测试人门槛不高,使大量的毕业生、甚至是非专业人员涌入这个行业,从而加剧了这个行业的激烈竞争。对于工作几年仍处于手工测试的人员来说,都会有强烈的危机感。由于工作的技术含量不高,薪资的涨幅遇到瓶颈,另一方面受到新进入者的威胁,公司花 5K 招来的人能够胜任测试工作,那么就不会花 8K 招聘人做同样的工作。

因此,从自身的发展来说,测试人员非常需要通过自动化技术来增加自己有竞争力。

1.2 自动化测试

自动化测试是通过编写脚本的方式模拟手工测试的过程。通过运行脚本来执行测试用例,代替人工对系统的功能进行验证,从而节省了大量的人力。

一切通过工具的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试、接口测试等,但凡用到测试工具的测试都称为自动化测试。

自动化测试得到广泛的应用,在招聘测试职位时,都需要自动化测试经验。在计算机专业招聘网站,以 “自动化测试” 作为关键字进行搜索,能够搜索到大量的职位,如下图所示:

图片描述

1.3 自动化测试的优点和缺点

自动测试的优点:

  • 避免测试人员因重复劳动产生厌倦
  • 提高测试效率
  • 保证每次测试地一致性和可重复性
  • 更好的利用无人值守时间
  • 能够进行一些手工无法进行的测试

自动测试的缺点:

  • 编写和维护自动化测试程序需要花费成本
  • 部分测试工作还是依赖手工测试

2. 自动化测试的前提条件

2.1 适合采用自动化测试

考虑否采用自动化测试,需要从三个方面进行权衡:

  1. 软件需求变动不频繁

测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架。如果开发、维护测试脚本的成本高于利用其节省的测试成本,即投入产出比太高,那么自动化测试就失去了意义。

项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。

  1. 项目周期足够长

软件测试包含有如下环节:

  • 自动化测试需求的确定
  • 自动化测试框架的设计
  • 自动测试脚本的编写与调试

这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,则无法实施自动化测试。

  1. 自动化测试脚本可重复使用

通常情况下,专职的测试人员对多个产品进行测试,需要考虑自动化测试脚本能否重复使用:

  • 所测试的项目之间是否很大的差异性
  • 所选择的测试工具是否适应这种差异

如果测试脚本的重复使用率很低,致使其间所耗费的成本大于所创造的价值,自动化测试就失去了意义。

  1. 敏捷开发、频繁的版本迭代

敏捷开发,增量式开发,持续集成项目由于这种开发模式是频繁的发布新版本,需要频繁的回归测试,自动化能把能从回归测试中解脱出来测试新的功能。

2.2 不适合采用自动化测试

如果项目具备如下特征,则不适合做自动化测试:

  1. 被测系统或需求不稳定

在自动化测试用例的更新、维护、调试的频率太高,自动化测试完全得不偿失。

  1. 项目时间非常紧张

建自动化测试框架,开发测试脚本需要时间,对时间比较紧张的项目可以先不考虑自动化。

  1. 项目周期很短

测试脚本不能得到重复的利用,不值得花精力去进行自动化测试。

  1. 涉及人的感观、物理交互等方面的测试

易用性测试、需要人的主观判断,涉及物理交互,自动化工具无法完成与物理设备的交互,例如打印、摄像等操作,不适合采用自动化测试。

4. 主流自动化测试框架

4.1 PyUnit 单元测试框架

PyUnit 是 Python 内置的 Python 单元测试框架(The Python unit testing framework),可对程序中的最小可测试单元进行检查和验证。它的主要特点如下:

  • 内置的标准模块,在 Python 3 中,PyUnit 是标准模块,安装 Python 后引入 unittest 模块即可使用
  • PyUnit 是 JUnit 的衍生产品,其工作原理与其他 JUnit 框架十分类似,熟悉 JUnit 的开发者可以很快上手
  • 能够以简单的方式运行单个测试用例
  • 能够快速的生成各种测试报告

PyUnit 是 Kent Beck 和 Erich Gamma 设计的 JUnit 的 Python 版本,是 JUnit 的衍生产品,在工作原理、命名规则上保留了很多 Java 语言的特征。例如,PyUnit 要求所有的测试用例都必须继承于 TestCast,示例如下:

#!/usr/bin/python3
import unittest

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

class MathTest(unittest.TestCase):
    def testAdd(self):
        self.assertEqual(add(1, 1), 2)

    def testSub(self):
        self.assertEqual(sub(2, 1), 1)

unittest.main()
  • 定义了类 MathTest,继承于 unittest.TestCase
  • 定义了测试用例 testAdd,测试函数 add
  • 定义了测试用例 testSub,测试函数 sub

4.2 PyTest 测试框架

Pytest 是一个第三方单元测试框架,比内置的 PyUnit 更简洁和高效,Pytest 主要特点有以下几点:

  • 简单灵活,容易上手,测试的可读性强
  • 支持参数化,可以细粒度地控制要测试的测试用例
  • 能够支持单元测试、集成测试、功能测试、接口测试多种类型
  • Pytest 具有丰富的第三方插件,并且可以自定义扩展,例如如 pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)等
  • 可以很好的和 CI 工具结合,例如 jenkins

与其它测试框架相比 Pytest 简单易学,举例如下:

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def test_add():
    assert add(1, 1) == 2

def test_sub():
    assert sub(2, 1) == 1
  • 定义了函数 test_add,它测试函数 add 的功能
  • 定义了函数 test_sub,它测试函数 sub 的功能
  • 运行 pytest ,发现所有名称以 test_ 为前缀的函数、并运行

凭借着其开源和易学的特点,该工具被质量分析团队、开发团队、个人团队、以及各种开源项目广泛使用。许多大型互联网应用,如 Dropbox 和 Mozilla,均采用 Pytest。

4.3 Robot 测试框架

Robot Framework 是一个基于 Python 的,可扩展的关键字驱动的测试自动化框架,主要被用在测试驱动 (test-driven)类型的开发与验收中。

Robot Framework 具有高度模块化的架构,用户通过编写 Python 脚本扩展功能,如下图所示:

图片描述

  • 测试数据 (Test Data) 是简单、易于编辑表格格式
  • 启动 Robot Framework 时,它会处理测试数据,执行测试用例并生成日志和报告
  • 测试库 (Test library) 可以直接使用应用程序接口

Robot Framework 具有如下优点:

  • 通过使用关键字驱动测试的方法,帮助测试人员创建具有可读性的测试用例,进而简化了整个自动化的过程。

  • 启用易于使用的表格语法,以统一的方式创建测试用例。

  • 提供易于阅读的结果报告和 HTML 格式的日志。

  • 提供一个简单的库 API,可以使用 Python 创建自定义测试库。

4.4 Selenium Web 应用程序测试

Selenium 是一个用于 Web 应用程序测试的工具,它使用 JavaScript 模拟真实用户对浏览器进行操作。Selenium 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

Selenium 支持使用 Python 语言编写动作测试脚本,测试脚本执行时,浏览器自动按照脚本代码做出点击、输入、打开、验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。

用户使用 Python 编写测试脚本:

  • 测试应用程序的浏览器兼容性,验证应用程序是否能够工作在不同浏览器和操作系统之上
  • 创建回归测试检验软件功能和用户需求

Selenium 主要用于测试 Web 应用程序,学习 web 自动化测试前,需要补充 Web 相关的知识,包括:

  • HTTP 协议
  • HTML 的基础知识,如何使用 Javascript 操纵 DOM
  • Firebug 或者 Chrome 开发者工具的使用,用于抓取元素