Python Unit Test
-
Upload
david-xie -
Category
Technology
-
view
2.341 -
download
1
Transcript of Python Unit Test
![Page 2: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/2.jpg)
从一个例子开始import randomimport unittest
class TestSequenceFunctions(unittest.TestCase): def setUp(self): self.seq = range(10)
def test_shuffle(self): # make sure the shuffled sequence does not lose any elements random.shuffle(self.seq) self.seq.sort() self.assertEqual(self.seq, range(10))
# should raise an exception for an immutable sequence self.assertRaises(TypeError, random.shuffle, (1,2,3))
def test_choice(self): element = random.choice(self.seq) self.assertTrue(element in self.seq)
def test_sample(self): with self.assertRaises(ValueError): random.sample(self.seq, 20) for element in random.sample(self.seq, 5): self.assertTrue(element in self.seq)
if __name__ == '__main__': unittest.main()
Wednesday, September 1, 2010
![Page 3: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/3.jpg)
什么是单元测试
单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
更形象的比喻: “工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。”
Wednesday, September 1, 2010
![Page 4: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/4.jpg)
一些误解
浪费了时间
我不需要它
以后再测试
Wednesday, September 1, 2010
![Page 5: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/5.jpg)
单元测试的优势
它是一种验证行为
它是一种设计行为
它是一种编写文档的行为
它具有回归性
Wednesday, September 1, 2010
![Page 6: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/6.jpg)
单元测试的几个重要概念
Test Fixture
Test Case
Test Suite
Test Runner
Wednesday, September 1, 2010
![Page 7: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/7.jpg)
Test Fixture
Wednesday, September 1, 2010
![Page 8: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/8.jpg)
测试开始前的准备工作
准备数据
准备环境
Wednesday, September 1, 2010
![Page 9: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/9.jpg)
Test Case
Wednesday, September 1, 2010
![Page 10: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/10.jpg)
小的测试用例, 能够通过一些输入, 得到一些输出
针对某一个功能
Wednesday, September 1, 2010
![Page 11: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/11.jpg)
测试用例
测试用例是一段代码, 它输入一些数据, 运行代码, 显示预期输出
要保证结果正确, 就必须首先保证测试用例和输入数据都正确
Wednesday, September 1, 2010
![Page 12: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/12.jpg)
输入数据
用于测试的数据, 以得到预期的结果
Wednesday, September 1, 2010
![Page 13: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/13.jpg)
预期输出
测试用例的输出, 用以察看代码是否正确
Wednesday, September 1, 2010
![Page 14: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/14.jpg)
Test Suite
Wednesday, September 1, 2010
![Page 15: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/15.jpg)
一系列的Test Case
测试多个功能
或者对一个功能进行多次测试
Wednesday, September 1, 2010
![Page 16: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/16.jpg)
Test Runner
Wednesday, September 1, 2010
![Page 17: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/17.jpg)
一个组件
可以输入测试数据
可以得到测试输出
通常会是一个GUI界面或者文本界面
Wednesday, September 1, 2010
![Page 18: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/18.jpg)
单元测试在Python
Wednesday, September 1, 2010
![Page 19: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/19.jpg)
python自带有单元测试的module
unittest
Wednesday, September 1, 2010
![Page 20: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/20.jpg)
单元测试的步骤
建立一个子类(unittest.TestCase)
重写里面的setUp, tearDown方法
编写自己的测试方法
编写suite函数(用于设置需要执行的测试函数, 可省略)
Wednesday, September 1, 2010
![Page 21: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/21.jpg)
setUp方法
处理测试前的准备工作
初始化变量, 实例, 准备数据等
Wednesday, September 1, 2010
![Page 22: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/22.jpg)
tearDown方法
处理测试后的清除工作
Wednesday, September 1, 2010
![Page 23: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/23.jpg)
举一个例子
Wednesday, September 1, 2010
![Page 24: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/24.jpg)
要测试的代码
Wednesday, September 1, 2010
![Page 25: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/25.jpg)
#!/usr/bin/python#-*-coding:utf-8-*-
import httplibimport simplejson as jsonfrom socket import socketimport struct, ssl, binascii
class APN(object): _conn = None def __init__(self, server='gateway.sandbox.push.apple.com', port=2195): self._server = server self._port = port self._conn = self._get_connection() def _get_connection(self): if not self._conn: s = socket() c = ssl.wrap_socket(s, ssl_version = ssl.PROTOCOL_SSLv3, certfile ='apn_mallsales.pem') c.connect((self._server, self._port)) self._conn = c return self._conn
def send_message(self, udid, message, badge=9): body = { 'aps': { 'alert': message, 'badge': badge } } payload = json.dumps(body) fmt = "!cH32sH%ds" % len(payload) command = '\x00' msg = struct.pack(fmt, command, 32, binascii.unhexlify(udid.replace(' ','')), len(payload), payload) self._get_connection().write(msg)
def close(self): if self.__conn: self.__conn.close()
Wednesday, September 1, 2010
![Page 26: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/26.jpg)
我们的测试代码
Wednesday, September 1, 2010
![Page 27: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/27.jpg)
#!/usr/bin/python#-*-coding:utf-8-*-
import unittestfrom linkapn import APN
class TestApn(unittest.TestCase): def setUp(self): self.apn = APN() self.udid = '4d5479aa 5509cc3f 43ea363d 55406e98 13252481 063c3089 9c317478 736fa722'
def test_one(self): message = 'test from david' badge = 9 self.apn.send_message(self.udid, message, badge)
def test_two(self): message = 'another test from david' badge = 9 self.apn.send_message(self.udid, message, badge)
def tearDown(self): print "closing connection"
if __name__ == '__main__': unittest.main()
Wednesday, September 1, 2010
![Page 28: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/28.jpg)
运行结果
Wednesday, September 1, 2010
![Page 29: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/29.jpg)
Wednesday, September 1, 2010
![Page 30: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/30.jpg)
错误是如何显示的
Wednesday, September 1, 2010
![Page 31: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/31.jpg)
Wednesday, September 1, 2010
![Page 32: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/32.jpg)
使用Test Suite
Wednesday, September 1, 2010
![Page 33: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/33.jpg)
def suite(): suite = unittest.TestSuite() suite.addTest(TestApn('first_test')) suite.addTest(TestApn('second_test')) return suite
or:
def suite(): tests = ['first_test', 'second_test'] return unittest.TestSuite(map(TestApn, tests))
Wednesday, September 1, 2010
![Page 34: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/34.jpg)
扩展阅读
Wednesday, September 1, 2010
![Page 35: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/35.jpg)
tdd - 测试驱动开发
Wednesday, September 1, 2010
![Page 36: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/36.jpg)
Agile - 敏捷开发
Wednesday, September 1, 2010
![Page 37: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/37.jpg)
Questions?
Wednesday, September 1, 2010
![Page 38: Python Unit Test](https://reader038.fdocuments.in/reader038/viewer/2022102608/554f84abb4c905435d8b4b28/html5/thumbnails/38.jpg)
参考资料
http://www.hudong.com/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95
http://www.ibm.com/developerworks/cn/linux/l-pyunit/index.html
Wednesday, September 1, 2010