Unit test
-
Upload
david-xie -
Category
Technology
-
view
993 -
download
0
description
Transcript of Unit test
UNIT TESTdavidx <[email protected]>
Saturday, September 4, 2010
从一个例子开始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()
Saturday, September 4, 2010
什么是单元测试
单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
更形象的比喻: “工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。”
Saturday, September 4, 2010
一些误解
浪费了时间
我不需要它
以后再测试
Saturday, September 4, 2010
单元测试的优势
它是一种验证行为
它是一种设计行为
它是一种编写文档的行为
它具有回归性
Saturday, September 4, 2010
单元测试的几个重要概念
Test Fixture
Test Case
Test Suite
Test Runner
Saturday, September 4, 2010
Test Fixture
Saturday, September 4, 2010
测试开始前的准备工作
准备数据
准备环境
Saturday, September 4, 2010
Test Case
Saturday, September 4, 2010
小的测试用例, 能够通过一些输入, 得到一些输出
针对某一个功能
要保证结果正确, 就必须首先保证测试用例和输入数据都正确
Saturday, September 4, 2010
输入数据
用于测试的数据, 以得到预期的结果
Saturday, September 4, 2010
预期输出
测试用例的输出, 用以察看代码是否正确
Saturday, September 4, 2010
Test Suite
Saturday, September 4, 2010
一系列的Test Case
测试多个功能
或者对一个功能进行多次测试
Saturday, September 4, 2010
Test Runner
Saturday, September 4, 2010
一个组件
可以输入测试数据
可以得到测试输出
通常会是一个GUI界面或者文本界面
Saturday, September 4, 2010
单元测试在Python
Saturday, September 4, 2010
python自带有单元测试的module
unittest
Saturday, September 4, 2010
单元测试的步骤
建立一个子类(unittest.TestCase)
重写里面的setUp, tearDown方法
编写自己的测试方法
编写suite函数(用于设置需要执行的测试函数, 可省略)
Saturday, September 4, 2010
setUp方法
处理测试前的准备工作
初始化变量, 实例, 准备数据等
Saturday, September 4, 2010
tearDown方法
处理测试后的清除工作
Saturday, September 4, 2010
举一个例子
Saturday, September 4, 2010
要测试的代码
Saturday, September 4, 2010
#!/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()
Saturday, September 4, 2010
我们的测试代码
Saturday, September 4, 2010
#!/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()
Saturday, September 4, 2010
运行结果
Saturday, September 4, 2010
Saturday, September 4, 2010
错误是如何显示的
Saturday, September 4, 2010
Saturday, September 4, 2010
使用Test Suite
Saturday, September 4, 2010
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))
Saturday, September 4, 2010
扩展阅读
Saturday, September 4, 2010
tdd - 测试驱动开发
Saturday, September 4, 2010
Agile - 敏捷开发
Saturday, September 4, 2010
Questions?
Saturday, September 4, 2010
参考资料
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
Saturday, September 4, 2010