• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 在Python中进行自动化单元测试的教程

在Python中进行自动化单元测试的教程

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了python 单元测试,python单元测试框架,python单元测试工具,python 合并单元格,python自动化测试教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、软件测试

大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施。正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号)。测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题。

可惜的是,软件开发人员很少能在编码的过程中就进行软件测试,大部分软件项目都只在最终验收时才进行测试,有些项目甚至根本没有测试计划!随着软件质量意识的增强,许多软件开发组织开始转向UML、CMM、RUP、XP等软件工程方法,以期提高软件质量,并使软件开发过程更加可控,好在这些方法对测试都提出了很严格的要求,从而使得测试在软件开发过程的作用开始真正体现出来。

软件测试作为一种系统工程,涉及到整个软件开发过程的各个方面,需要管理人员、设计人员、开发人员和测试人员的共同努力。作为软件开发过程中的主要力量,现今的程序员除了要编写实现代码外,还承担着单元测试这一艰巨任务,因此必须采用新的工作模式:

  •     编写和维护一套详尽的单元测试用例;
  •     先构造单元测试和验收测试用例,然后再编写代码;
  •     根据构造的测试用例来编写代码。

单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。由于软件模块并不是一个单独的程序,为了进行单元测试还必须编写大量额外的代码,从而无形中增加了开发人员的工作量,目前解决这一问题比较好的方法是使用测试框架。测试框架是在用XP方法进行单元测试时的关键,尤其是在需要构造大量测试用例时更是如此,因为如果完全依靠手工的方式来构造和执行这些测试,肯定会变成一个花费大量时间并且单调无味的工作,而测试框架则可以很好地解决这些问题。

使用Python语言的开发人员可以使用Steve Purcell编写的PyUnit作为单元测试框架,通过将单元测试融合到PyUnit这一测试框架里,Python程序员可以更容易地增加、管理、执行测试用例,并对测试结果进行分析。此外,使用PyUnit还可以实现自动单元测试(回归测试)。

二、规范Python单元测试

测试是一个贯穿于整个开发过程的连续过程,从某个意义上说,软件开发的过程实际上就是测试过程。正如Martin Fowler所说的"在你不知道如何测试代码之前,就不该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序。"

测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败。为了更好地理解PyUnit这一自动测试框架的作用,先来看一个简单的例子,假设我们要对例1中的Widget类进行测试:

        例1. widget.py

# 将要被测试的类
class Widget:
  def __init__(self, size = (40, 40)):
    self._size = size
  def getSize(self):
    return self._size
  def resize(self, width, height):
    if width 0 or height < 0:
      raise ValueError, "illegal size"
    self._size = (width, height)
  def dispose(self):
    pass
</div>

采用手工方式进行单元测试的Python程序员很可能会写出类似例2的测试代码来,

    例2. manual.py

from widget import Widget
# 执行测试的类
class TestWidget:
  def testSize(self):
    expectedSize = (40, 40);
    widget = Widget()
    if widget.getSize() == expectedSize:
      print "test [Widget]: getSize works perfected!"
    else:
      print "test [Widget]: getSize doesn't work!"
# 测试
if __name__ == '__main__':
  myTest = TestWidget()
  myTest.testSize()
</div>

稍一留心你不难发现这种手工测试方法存在许多问题。首先,测试程序的写法没有一定的规范可以遵循,十个程序员完全可能写出十种不同的测试程序来,如果每个Python程序员都有自己不同的设计测试类的方法,光维护被测试的类就够麻烦了,谁还顾得上维护测试类。其次,需要编写大量的辅助代码才能进行单元测试,例1中用于测试的代码甚至比被测试的代码还要多,而这毫无疑问将增大Python程序员的工作量。

为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是让开发人员遵循一定的规范来编写用于测试的代码,具体到Python程序员来讲,则是要采用PyUnit这一自动测试框架来构造单元测试用例。目前PyUnit已经得到了大多数Python开发人员的认可,成了事实上的单元测试标准。如果采用PyUnit来进行同样的测试,则测试代码将如例3所示:

    例3. auto.py

from widget import Widget
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
# 构造测试集
def suite():
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  return suite
# 测试
if __name__ == "__main__":
  unittest.main(defaultTest = 'suite')
</div>

在采用PyUnit这一单元测试框架后,用于测试的代码做了相应的改动:

  •     用import语句引入unittest模块。
  •     让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
  •     在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
  •     在testSize()中调用assertEqual()方法,对Widget类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是TestCase类中定义的方法。
  •     提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite看成是包含所有测试用例的一个容器。

虽然看起来有点复杂,但PyUnit使得所有的Python程序员都可以使用同样的单元测试方法,测试过程不再是杂乱无章的了,而是在同一规范指导下进行的有序行为,这就是使用PyUnit这一自动单元测试框架所带来的最大好处。

三、自动测试框架PyUnit

在对软件测试理论和PyUnit有了一个大致了解之后,下面辅以具体的实例介绍Python程序员如何借助PyUnit来进行单元测试。所有的代码均在Python 2.2.2下调试通过,操作系统使用的是Red Hat Linux 9。

3.1 安装

在Python中进行单元测试时需要用到PyUnit模块,Python 2.1及其以后的版本都将PyUnit作为一个标准模块,但如果你使用的是较老版本的Python,那就要自已动手安装了。在PyUnit的网站(http://sourceforge.net/projects/pyunit)上可以下载到PyUnit最新的源码包,此处使用的是pyunit-1.4.1.tar.gz。

在下载好PyUnit软件包后,执行下面的命令对其进行解压缩:

[root@gary source]# tar xzvf pyunit-1.4.1.tar.gz

</div> </div>

要在Python程序中使用PyUnit模块,最简单的办法是确保PyUni软件包中的文件unittest.py和unittestgui.py都包含在Python的搜索路径中,这既可以通过直接设置PYTHONPATH环境变量来实现,也可以执行以下的命令来将它们复制到Python的当前搜索路径中:

[root@gary source]# cd pyunit-1.4.1
[root@gary pyunit-1.4.1]# python setup.py install

</div>

3.2 测试用例TestCase

软件测试中最基本的组成单元是测试用例(test case),PyUnit使用TestCase类来表示测试用例,并要求所有用于执行测试的类都必须从该类继承。TestCase子类实现的测试代码应该是自包含(self contained)的,也就是说测试用例既可以单独运行,也可以和其它测试用例构成集合共同运行。

TestCase在PyUnit测试框架中被视为测试单元的运行实体,Python程序员可以通过它派生自定义的测试过程与方法(测试单元),利用Command和Composite设计模式,多个TestCase还可以组合成测试用例集合。PyUnit测试框架在运行一个测试用例时,TestCase子类定义的setUp()、runTest()和tearDown()方法被依次执行,最简单的测试用例只需覆盖runTest()方法来执行特定的测试代码就可以了,如例4所示:

        例4. static_single.py

import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
 
  


 

您可能想查找下面的文章:

  • 在Python中进行自动化单元测试的教程

相关文章

  • 在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
  • python正则匹配抓取豆瓣电影链接和评论代码分享
  • 寻找网站后台地址的python脚本
  • Linux下用Python脚本监控目录变化代码分享
  • 浅谈Python的垃圾回收机制
  • Python的print用法示例
  • 分享一下Python 开发者节省时间的10个方法
  • Python实现的最近最少使用算法
  • 在Python的Django框架下使用django-tagging的教程
  • python实现去除下载电影和电视剧文件名中的多余字符的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 使用IPython下的Net-SNMP来管理类UNIX系统的教程
    • python通过BF算法实现关键词匹配的方法
    • Python下的subprocess模块的入门指引
    • python中正则的使用指南
    • python文件与目录操作实例详解
    • python 多线程应用介绍
    • py中的目录与文件判别代码
    • Python @property装饰器原理解析
    • 列举Python中吸引人的一些特性
    • python 时间戳与格式化时间的转化实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有