Unit test

37
UNIT TEST davidx <[email protected] > Saturday, September 4, 2010

description

 

Transcript of Unit test

Page 1: Unit test

UNIT TESTdavidx <[email protected]>

Saturday, September 4, 2010

Page 2: Unit test

从一个例子开始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

Page 3: Unit test

什么是单元测试

单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。

更形象的比喻: “工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。”

Saturday, September 4, 2010

Page 4: Unit test

一些误解

浪费了时间

我不需要它

以后再测试

Saturday, September 4, 2010

Page 5: Unit test

单元测试的优势

它是一种验证行为

它是一种设计行为

它是一种编写文档的行为

它具有回归性

Saturday, September 4, 2010

Page 6: Unit test

单元测试的几个重要概念

Test Fixture

Test Case

Test Suite

Test Runner

Saturday, September 4, 2010

Page 7: Unit test

Test Fixture

Saturday, September 4, 2010

Page 8: Unit test

测试开始前的准备工作

准备数据

准备环境

Saturday, September 4, 2010

Page 9: Unit test

Test Case

Saturday, September 4, 2010

Page 10: Unit test

小的测试用例, 能够通过一些输入, 得到一些输出

针对某一个功能

要保证结果正确, 就必须首先保证测试用例和输入数据都正确

Saturday, September 4, 2010

Page 11: Unit test

输入数据

用于测试的数据, 以得到预期的结果

Saturday, September 4, 2010

Page 12: Unit test

预期输出

测试用例的输出, 用以察看代码是否正确

Saturday, September 4, 2010

Page 13: Unit test

Test Suite

Saturday, September 4, 2010

Page 14: Unit test

一系列的Test Case

测试多个功能

或者对一个功能进行多次测试

Saturday, September 4, 2010

Page 15: Unit test

Test Runner

Saturday, September 4, 2010

Page 16: Unit test

一个组件

可以输入测试数据

可以得到测试输出

通常会是一个GUI界面或者文本界面

Saturday, September 4, 2010

Page 17: Unit test

单元测试在Python

Saturday, September 4, 2010

Page 18: Unit test

python自带有单元测试的module

unittest

Saturday, September 4, 2010

Page 19: Unit test

单元测试的步骤

建立一个子类(unittest.TestCase)

重写里面的setUp, tearDown方法

编写自己的测试方法

编写suite函数(用于设置需要执行的测试函数, 可省略)

Saturday, September 4, 2010

Page 20: Unit test

setUp方法

处理测试前的准备工作

初始化变量, 实例, 准备数据等

Saturday, September 4, 2010

Page 21: Unit test

tearDown方法

处理测试后的清除工作

Saturday, September 4, 2010

Page 22: Unit test

举一个例子

Saturday, September 4, 2010

Page 23: Unit test

要测试的代码

Saturday, September 4, 2010

Page 24: Unit test

#!/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

Page 25: Unit test

我们的测试代码

Saturday, September 4, 2010

Page 26: Unit test

#!/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

Page 27: Unit test

运行结果

Saturday, September 4, 2010

Page 28: Unit test

Saturday, September 4, 2010

Page 29: Unit test

错误是如何显示的

Saturday, September 4, 2010

Page 30: Unit test

Saturday, September 4, 2010

Page 31: Unit test

使用Test Suite

Saturday, September 4, 2010

Page 32: Unit test

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

Page 33: Unit test

扩展阅读

Saturday, September 4, 2010

Page 34: Unit test

tdd - 测试驱动开发

Saturday, September 4, 2010

Page 35: Unit test

Agile - 敏捷开发

Saturday, September 4, 2010

Page 36: Unit test

Questions?

Saturday, September 4, 2010