Python札记 -- 测试优先
竹风看的第一本有关Python的书是《Dive Into Python》(简称DIP),本人觉得这本书写得是相当不错的(当然竹风无意卷入关于这本书是好是坏的争论,只要找到适合自己的资料和学习方式就好)。读《DIP》的时候,竹风对HTML和XML是一窍不通(当然现在也只是会点基本的),所以这两章是看得云里雾里的。当然也有给竹风带来震撼的章节,比如“单元测试”和“测试优先编程”。
《DIP》中给出了一个罗马数字的程序例子,里面用到了Python中的unittest模块,这段时间竹风看了下Python 2.7的文档,结合自己的工作体会,做一个简单总结,跟大家分享一下。当然,如果错误,是竹风学艺不精,欢迎大家的指正和讨论^_^。
参考资料:《Dive Into Python》 Mark Pilgrim 第13章.单元测试 第14章.测试优先编程 (强力推荐读一下,里面测试驱动开发的思想很值得了解)
《ActivePython Documentation》 这个是在windows上安装 ActiveState ActivePython 2.7 附带的
一、简单的例子
竹风琢磨着,程序员最好的交流就是用代码了,“翠花,上代码~~”
1 #!/usr/bin/env python 2 #coding: utf-8 3 4 import random 5 import unittest #首先将 unittest 模块导入 6 7 class TestSequenceFunctions(unittest.TestCase): #继承了TestCase 8 9 def setUp(self): #初始化函数,生成10个元素的列表 10 self.seq = range(10) 11 12 def test_shuffle(self): 13 #测试shuffled操作是否会丢失元素 14 random.shuffle(self.seq) 15 self.seq.sort() 16 self.assertEqual(self.seq, range(10)) #用到了一个判断相等的断言 17 18 #如果传入一个不可变的对象,比如元组,应抛出一个异常 19 self.assertRaises(TypeError, random.shuffle, (1,2,3)) 20 21 def test_choice(self): 22 #测试choice操作返回的值是否属于seq 23 element = random.choice(self.seq) 24 self.assertTrue(element in self.seq) #用到了一个判断值为真的断言 25 26 def test_sample(self): 27 #测试sample操作返回的结果是否属于seq 28 self.assertRaises( #当传入的参数有误时,应抛出一个异常 29 ValueError, random.sample, self.seq, 20 30 ) 31 for element in random.sample(self.seq, 5): 32 self.assertTrue(element in self.seq) #用到了一个判断值为真的断言 33 34 if __name__ == '__main__': 35 unittest.main()
竹风在文档的例子上稍微加了点注释,这个例子对各位园友来说应该是小菜一碟了。如果使用的是Python 2.7的话,还可以将28-30行修改为:
1 with self.assertRaises(ValueError): 2 random.sample(self.seq, 20)
运行起来应该是这个样子的:
1 $ python TestSequenceFuncions.py 2 ... 3 ---------------------------------------------------------------------- 4 Ran 3 tests in 0.000s 5 6 OK
如果想看稍微详细点的测试信息,可以将最后一行 “unittest.main()” 修改如下:
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)unittest.TextTestRunner(verbosity=2).run(suite)
这时候输出信息就会稍微详细一点:
$ python TestSequenceFuncions.py test_choice (__main__.TestSequenceFunctions) ... ok test_sample (__main__.TestSequenceFunctions) ... ok test_shuffle (__main__.TestSequenceFunctions) ... ok---------------------------------------------------------------------- Ran 3 tests in 0.000sOK
如果还觉得不够详细,那么可以在命令行上加 -v 选项:
$ python -v TestSequenceFuncions.py
不过这个输出到屏幕的信息已经达到刷屏的程度了。。。大家还是慎用。。。
二、测试的顺序与命名规范
不知道各位园友注意到了没有,测试的顺序是跟class里面定义的def的顺序无关的。
在class的定义顺序是:(test_shuffle,test_choice,test_sample);
而实际测试的时候是:(test_choice,test_sample,test_shuffle);
根据竹风的个人经验,测试的顺序应该是在去掉 “test_” 前缀后,按照字母顺序排序。
还需要提到的一点是,需要测试的 def 需要以 “test_” 为前缀。针对这点,我们可以写一个 “make_test_data” 的函数准备测试数据,再写一个 “clean_test_data” 的函数清理测试数据。
PS:根据《DIP》里面提到关于测试的两个基本原则:
一、每个测试用例只回答一个问题。
二、每个测试用例必须可以与其他测试用例隔离工作,每个测试用例是一个“孤岛”。
根据这两个基本原则,的确应该与定义他们的顺序无关的。
三、初始化(setUp)和清理工作(tearDown)
如果竹风用“make_test_data”来创建测试数据,竹风的基友用的是"create_test_data",一千个程序员可能就带来一千种命名方式,这五花八门的函数名字可就真的让人头疼了。
根据Python里“import this”的精神,应该会有专门的函数来执行初始化或者清理工作的。也的确有这两个函数,setUp 与 tearDown 分别负责 初始化 和 清理 工作。
setUp函数总是第一个调用,而tearDown函数则总是在最后一个调用。现在函数调用的顺序也大概理清楚了:setUp --> test_* --> tearDown。
四、常用的断言方法(assert methods)
最后水一下几个常用的断言。
assertEqual(first, second, msg=None)
assertNotEqual(first, second, msg=None)
判断first和second是否相等(不等),msg为测试失败时给出的信息。msg一般使用默认值就行
assertTrue(expr, msg=None)
assertFalse(expr, msg=None)
判断expr的值是否为真(假),msg为测试失败时给出的信息。
assertRaises(exception, callable, *args, **kwds) #参数魔法里面有提到过的哦
assertRaises(exception)
判断是否抛出一个异常,*args和 **kwds 为调用 callable 需要传的参数,注意这里callable的传参数方式。可参照上面的例子。
到这里竹风这个简单的分享也结束了,用上面的这些内容,写个简单的测试用例问题应该不大了。
测试个人感觉上是一个很大的领域,竹风也只是刚接触。
建议有兴趣的园友看一下《DIP》的13、14章,当然也可以看下Python的文档。
祝大家新年快乐,万事如意^_^
转载于:https://www.cnblogs.com/PandaBamboo/archive/2013/02/06/2907387.html
Python札记 -- 测试优先相关推荐
- 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?
很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...
- python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~
坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. 测试开发python系列面试题 01 单选题 1.下列哪个语句在P ...
- python nose测试框架全面介绍十---用例的跳过
又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...
- python自动测试n_接口自动化:Jenkins 自动构建python+nose测试
参考: 通过Jenkins自动化构建python nose测试分两步: 1. 创建节点(节点就是执行自动化测试的机器): 2. 创建任务并绑定节点(用指定的机器来跑我们创建的任务,这里我们选择执行一段 ...
- 机器学习 测试_测试优先机器学习
机器学习 测试 Testing software is one of the most complex tasks in software engineering. While in traditio ...
- 基于python渗透测试_Python中基于属性的测试简介
基于python渗透测试 by Shashi Kumar Raja 由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testi ...
- python代码测试_Python入门学习系列——Python代码测试
Python代码测试 对于编写的代码,可以使用unittest模块中的相关方法进行测试. 测试函数 首先定义一个简单的函数,该函数用来合并名称并返回. name_function.py: def ge ...
- python api测试框架_python api 测试框架
python常用框架 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是 ...
- 6-5 软件测试与测试优先的编程
本节目标: 本节大纲: 1.软件测试 软件测试是提高软件质量的主要手段,能够确定软件是否达到可用级别,评估系统的某一侧面的质量特性. 测试的目标是证明软件存在错误,但再好的测试也无法证明系统不存在错误 ...
最新文章
- 财务 计算机网络,计算机网络技术在财务系统中的应用
- php性能测试下载,PHP性能测试工具xhprof安装与使用方法详解
- 动态加载JS脚本的4种方法
- Linux中fork函数的作用及用法
- myeclipse中的classpath .
- std::future详解
- [转载] Java8 Stream流遍历 如何使用索引
- WebRTC直播技术方案
- 2021富途校招后台C++
- DB9 串口母对母转接头是个坑
- 教你如何使用Ip地址进行精准定位
- VS2015+OpenCV3.4.0+dmtx最新版联合集成开发 解析dm码
- 《王阳明心学及其当代意义》观后总结
- ​LeetCode刷题实战510:二叉搜索树中的中序后继 II
- 计算机显卡型号中数字含义详解,显卡型号中字母和数字所代表的含义
- 介绍一款开源、高性价比的在线教育建站系统
- Arduino火焰传感器(红外线接收器)的使用
- EXTJS开发过程遇到的一些问题的小结(转自麦田守望者)
- 【渝粤题库】国家开放大学2021春2721乡镇行政管理题目
- kalman滤波基础及matlab仿真_MATLAB基于EKF算法估计电动汽车蓄电池的SOC