首页 > 代码库 > python中的单元测试

python中的单元测试

python中的单元测试可以使用doctest,unittest完成

1.doctest的使用

(1)写入程序如下(cubetest.py):

#!/usr/bin/python
def cube(x):
	"""
	cube a number and return the result
	
	>>> cube(2)
	8
	>>> cube(3)
	27
	>>> cube(4)
	64
	"""
	return x**3;
if __name__==‘__main__‘:
	import doctest;
	doctest.testmod(verbose=True);

测试用例写在字符串””” cube a number… “””中。

 调用doctest中的testmod的方法即可测试。

输出如下:

Trying:

    cube(2)

Expecting:

    8

ok

Trying:

    cube(3)

Expecting:

    27

ok

Trying:

    cube(4)

Expecting:

    64

ok

1 itemshad no tests:

    __main__

1 itemspassed all tests:

   3 tests in __main__.cube

3 testsin 2 items.

3 passedand 0 failed.

Testpassed.

TestResults(failed=0, attempted=3)

 (2)也可以把测试用例写在记事本文件中。新建记事本example.txt,写入以下内容:

>>> from cubetest import cube

>>> cube(1)

1

>>> cube(2)

8

>>> cube(4)

64

 然后写测试代码 test.py:

import doctest
doctest.testfile("example.txt")

使用python test.py  –v 执行测试代码,可以得到以下结果

Trying:

    from cubetest import cube

Expectingnothing

ok

Trying:

    cube(1)

Expecting:

    1

ok

Trying:

    cube(2)

Expecting:

    8

ok

Trying:

    cube(4)

Expecting:

    64

ok

1 items passedall tests:

   4 tests in example.txt

4 tests in 1items.

4 passed and 0failed.

Test passed.                           

 2.unittest的使用

(1)写待测试的程序如下:

def iseven(x):
	if(x%2==0):
		return 1;
	else:
		return 0;
def isodd(x):
	if(x%2==1):
		return 1;
	else:
		return 0;

测试程序中的类eventest类继承自TestCase,它包含setUp() ,test_1(),test_2()和tearDown()四个方法。在测试运行前,会自动运行setUp()方法,在测试完成之前,会自动调用tearDown()方法。test_1()和test_2()是自定义的测试方法。写测试程序如下:

import unittest,evenodd
class eventest(unittest.TestCase):
	def setUp(self):
		self.ex1=range(0,2,20);
		self.ex2=range(1,2,20);
	def test_1(self):
		
		for x in self.ex1:
			x=evenodd.iseven(x);
			self.assertEqual(x,1);
		for x in self.ex2:
			x=evenodd.iseven(x);
			self.assertEqual(x,0);
	def test_2(self):
		
		for x in self.ex1:
			x=evenodd.isodd(x);
			self.assertEqual(x,0);
		for x in self.ex2:
			x=evenodd.isodd(x);
			self.assertEqual(x,1);
	def tearDown(self):
		self.ex1=None;
		self.ex2=None;
if __name__==‘__main__‘:
	unittest.main();

上面用到了self.AssertEqual(),类似的判断方法还有:

assertNotEqual(a,b)   a!=b

asserTrue(x)     bool(x)为真

assertFalse(x)     bool(x)为假

assertIs(a,b)     a is b

assertIsNot(a,b)   a is not b

assertIsNone(x)    x is None

assertIsNotNone(x)   x is not None

assertIn (a,b)   a in b

assertNotIn(a,b)  a not in b

assertIsInstance(a,b)   isinstance(a,b)

assertNotIsInstance(a,b)   not instance(a,b)

(2) 也可以使用TestSuite对测试用例进行封装,下面的程序定义了类evensuite,它继承自类TestSuite,方法addTest()用于添加测试方法。

测试程序如下:

import unittest,evenodd
class eventest(unittest.TestCase):
	def setUp(self):
		self.ex1=range(0,2,20);
		self.ex2=range(1,2,20);
	def test_1(self):
		for x in self.ex1:
			x=evenodd.iseven(x);
			self.assertEqual(x,1);
		for x in self.ex2:
			x=evenodd.iseven(x);
			self.assertEqual(x,0);
	def test_2(self):
		for x in self.ex1:
			x=evenodd.isodd(x);
			self.assertEqual(x,0);
		for x in self.ex2:
			x=evenodd.isodd(x);
			self.assertEqual(x,1);
	def tearDown(self):
		self.ex1=None;
		self.ex2=None;
class evensuite(unittest.TestSuite):
	def suite(self):
		suite=unittest.TestSuite();
		suite.addTest(eventest(‘test_1‘));
		suite.addTest(eventest(‘test_2‘));
		return suite;
	
if __name__==‘__main__‘:
	unittest.main();

运行程序 ,结果输出:

_ _

ran 2 tests in 0.001s

OK