下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >基于Python的测试驱动开发实战

基于Python的测试驱动开发实战

spring发布于 2018-02-27 09:53查看:1547回复:1

近年来测试驱动开发(TDD)受到越来越多的关注。这是一个持续改进的过程,能从一开始就形成规范,帮助提高代码质量。这是切实可行的而非天马行空的。

TDD的全过程是非常简单的。借助TDD,代码质量会得到提升,同时可以让你保持清晰的思路。TDD与敏捷开发可谓强强联合,特别是在进行结对编程的时候。本文主要介绍了TDD的核心概念,还有结合nosetest单元测试包进行Python示例简析。另外还会介绍一些Python备用包。

TDD是什么?

顾名思义,TDD即进行编程时先把测试部分写好,当发现不能通过时,再进行编程以使测试通过。然后在这基础上适当地调整测试代码以实现更多功能,最后再编写代码使之实现。

TDD看起来非常像一个环,首先是要不断调整测试代码,然后是编码,改进,最后直至完成。先实现测试部分的做法会使你自然养成把问题放在首位的思维习惯。当真正去构建代码时,就不得不想清楚该如何把设计做好;比方说,该方法有何返回值?当遇到异常时该怎么办?诸如此类。

以这样的方式进行开发,意味着要想出不同的代码实现路径,并在测试中进行实践。这样做可使你少走前人的弯路:陷入一个问题后写出毫不相关的解决方案。

image.png

该过程可描述如下:

  • 写出一个缺陷单元测试

  • 使该单元测试通过

  • 重构

与敏捷开发结合

TDD与敏捷开发并行不悖甚至1+1远大于2,这里指的是代码质量而不是数量。

“这意味着结对双方都会参与其中,着重于当前工作,然后在每个环节进行互检。”

然而在结对编程时TDD是单独进行的。如果能把双方的开发流程混合好,互相都能理解就最好不过了。例如,其中一人写出单元测试,当测试通过后,另外一人可以编写不同的测试以之通过。

任何时候结对双方都可以互换角色,每半天或天。这意味着结对双方都会参与其中,每人都把精力放在当前任务上,然后在每个环节进行交叉互检。这难道不是一个双赢的做法吗?

TDD也可以是行为驱动开发过程中的组成部分,同样地,首先写出测试,只不过这里指的是接受测试。这样有助于把工作从头到尾都保持规范。

单元测试语法

进行单元测试时,使用到的Python方法如下:

  • assert: 编写个人声明的基本方式

  • assertEqual(a,b):检查a和b的是否等价

  • assertNotEqual(a,b):检查a和b的是否非等价

  • assertIn(a,b):检查是否存在b中

  • assertNotIn(a,b): 检查是否不存在b中

  • assertFalse(a):检查a的值是否为False

  • assertTrue(a):检查a的值是否为Ture

  • assertIsInstance(a,TYPE):检查a是否为“TYPE”类型

  • assertRaises(ERROR,a,args):以参数args调用a时,检查是否会出现ERROR

以上是实际当中使用频率最高的方法,更多的方法请查阅。

安装并使用Python Nose

进行下面的练习前,请把nosetest测试运行包安装好。使用标准pip语句进行安装是最直接的做法。此外在项目中使用VirtualEnv(Python虚拟环境)也是不错的做法,因为它可确保所有包在不同项目中是独立的。假如对pip或VirtualEnv了解不多,不妨先查阅相关文档:,。

pip语句十分简洁:

image.png

安装完成后,可以执行单个测试文件

image.png

或者可以直接执行文件夹中的文件组

image.png


这里要注意的是每个测试方法都应以“test_”为开头,这样nosetest运行机才能正确识别出目标测试文件。

可选参数

下面介绍几个有用的命令行参数:

  • -v:输出更多信息,包括正在执行的测试文件名;

  • -s或-nocapture:进行PRINT语句输出,一般情况下这是隐藏的。开启后可方便调试;

  • –nologcapture:输出日志信息;

  • –rednose:一个可选插件,请点击下载,输出带颜色的输出信息;

  • –tags=TAGS:指定要执行的测试文件,而不是整个测试文件组。

实例分析和测试驱动方法

接下来结合一个简单的计算器类例子例如相加/相减,来讲述Python单元测试和TDD概念。对于add相加功能,会尝试编写一个缺陷测试。

在一个空白项目中,首先创建两个python包app和test。然后在每个文件里建立两个名为_init_.py空白文件。这是Phthon工程的标准结构,完成后可以拥有一个可导入的文件结构。如果需要了解更多有关文档架构的信息,请查阅。 在测试目录里创建一个test_calulator.py文件,其代码如下:

image.png


说明:

  • 首先,从Python标准库里导入标准的unittest模块

  • 接着,创建一个含有不同测试用例的类

  • 最后,创建以“test_”为开头的一个测试方法

完成后可着手编写测试代码了。执行方法前要先对计算器进行初始化,初始化完成后便可调用add方法,并把结果存入变量result中。完成后,使用unittest的assertEqual方法来确保add方法正常执行。

现在可以启动nosetest来执行测试文件了。代码如下:

image.png

标准的Python文件执行方式为$ python test_calculator.py,相比之下本文使用的nosetests方法功能更丰富,例如可以运行目录中的全部测试文件。

image.png运行后可见出错的原因是没有导入Caculator。因为还没有创建呢!创建的方法是在app目录下建立calculator.py文件,然后导入:

image.png

image.png


把Caculator构建好之后,再次运行看会出现什么结果:

image.png


很明显,add方法返回了错误的值,因为还没有为它指定行为。幸好nosetest会指出出错的位置,方便进行修改。稍作改动后,测试便可通过了:

image.png

image.png

虽然通过了,但是围绕该方法还可以做更多的工作。

沉迷于某个案例很容易造成短视

如果进行非数字型数据相加会导致什么后果呢?事实上Python是允许字符串或其它类型进行相加的,但在我们的例子里不允许。接着尝试就这个例子加入另一个缺陷测试,然后使用assertRaises方法来判断是否有异常抛出:

image.png

以上代码中,检查了是否引起了ValueError错误,其实还可以进行更多的检测,不过在这里不作深入讲述。此外,setup()方法用于推入计算对象。下面再看看nosetest会反馈什么信息:

image.png


显然nosetests告诉我们ValueError没有被抛出。现在我们有了一个新的缺陷测试,接着尝试编码进行解决:

image.png

代码中使用了isinstance方法是为了确保输入的是数字型数据。

由于两个变量的类型有多种组合,为了进行完整的测试,所以需要把可能出现的组合进行统筹并进行处理:

image.png

至此我们可以运行所有的测试了,所要实现的需求也都满足了。

其它的单元测试包

py.test

pytest的作用与nosetest类似,不过可以在单独的区域里输出信息,这意味着能够使我们很快地看清楚命令行中出现的打印信息。这对于只运行单个测试的情况是很有用的。

image.png

安装pytest的方式与nosetest差不多,命令是$ pip install pytes。执行的命令是$ pip install pytes或者指定要执行的测试文件$ py.test test/calculator_tests.py。

image.png

pytest运行后的结果如下。注:只有代码含有错误或异常的情况下,pytest才会进行输出。

image.png

单元测试

如果不想安装额外的包并想保持一个纯净的标准库结构,使用Python内建的unittest单元测试包是不错的选择。其使用方法如下:

image.png

使用python calculator_tests.py执行后,看会得到什么结果:

image.png


    想要报考2018年软考的朋友现在就可以开始备考了,也可以报名课课家软考学院,含有软考各科目考试辅导教材历年真题、考前冲剌资料、在线模拟测试题库,还有老师专属答疑指导等,帮助大家顺利通过考试。


>>>>>>点击进入软考报名专题


一楼:软考网络工程师

软考网络工程师终极解密视频课程套餐

http://www.kokojia.com/package-68.html

 

软考网络工程师中级工程师进阶路线图

http://www.kokojia.com/package-82.html

 

软考网络工程师强化通关套餐

http://www.kokojia.com/package-16.html

 

软考网络工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-1.html

 

软考网络工程师分类题型强化训练套餐(最新、最全)

http://www.kokojia.com/package-8.html

 

二楼:软考网络规划设计师

软考网络规划设计师终极解密课程视频套餐

http://www.kokojia.com/package-104.html

 

网络规划设计师高级工程师进阶路线图

http://www.kokojia.com/package-13.html

 

软考网络规划设计师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-11.html

 

软考网络规划设计师考试套餐(最经典、最实用)

http://www.kokojia.com/package-14.html

 

软考网络规划设计师历年真题详解套餐(最新、最全)

http://www.kokojia.com/package-9.html

 

楼:软考系统集成项目管理工程师

软考系统集成项目管理工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-76.html

 

软考系统集成项目管理工程师考试学习套餐(最新、最全)

http://www.kokojia.com/package-75.html

 

软考系统集成项目管理工程师上午基础知识视频课程套餐

http://www.kokojia.com/package-70.html

 

楼:软考信息系统项目管理师

软考信息系统项目管理师考试顺利通关新考纲视频培训套餐

http://www.kokojia.com/package-114.html

 

软考高项高级项目经理进阶路线图

http://www.kokojia.com/package-116.html

 

软考信息系统项目管理师考试新考纲视频培训学习套餐

http://www.kokojia.com/package-115.html

 

信息系统项目管理师视频教程

http://www.kokojia.com/course-4200.html

 

五楼:软考信息安全工程师

软考信息安全工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-41.html

 

软考信息安全工程师学习套餐(最新、最全)

http://www.kokojia.com/package-40.html

 

软考信息安全工程师上午基础知识套餐

http://www.kokojia.com/package-38.html

 

六楼:软考软件设计师

软件设计师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-91.html

 

软考软件设计师考试学习套餐(最新、最全)

http://www.kokojia.com/package-92.html

 

七楼:系统规划与管理师

系统规划与管理师视频教程

http://www.kokojia.com/course-4717.html



收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有1条评论

    • 课课家运营团队
    • 酸酸~甜甜
    • Mr ken
    • YUI
    • cappuccino
    • mr jack
    • IT宅男
    • Mright
    • 课课家技术团队1
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: