python之单元测试--常见问题
Python在unittest.TestCase中提供了许多断言的方法。
assertEqual(a,b) ---------> 核实a==b
assertNotEqual(a,b) -----> 核实a!=b
assertTrue(a) -------------> 核实a==True
assertFalse(a) ------------> 核实a==False
assertIn(a,list) -------------> 核实a in list
assertNotIn(a,list) ---------> 核实a not in list
(好吧,这个我也是在书上看的,^V^)
咳咳,下面开始正题了,先说下,我英语水的一笔,所以在命名上会是野路子,哈哈!
创建了一个文件test001.py
代码如下:
def test1(x): return x **2
无聊的一笔,简单明了
好的,那下面在同目录下再创建一个测试文件,test002.py
代码如下:
#coding:UTF-8
import unittest from test001 import test1 class TestNew(unittest.TestCase): '''这是一个用于测试的类''' def ceshi1(self): '''测试开始1''' a=test1(4) self.assertEqual(a,16)
if __name__ == '__main__':
''' 这是一个测试执行语句 '''
unittest.main()
好的,运行代码
---------------------------------------------------------------------- Ran 0 tests in 0.000s OK
什么鬼,一脸懵逼,于是问了一下度娘,解释是单元测试方法的命名是有规则的,就是说测试文件test002的def方法必须以test开头,如test_is_file,否者不执行。这脾气我服
那就说改就改呗!
#coding:UTF-8 import unittest from test001 import test1 class TestNew(unittest.TestCase): '''这是一个用于测试的类''' def test_ceshi_1(self): '''测试开始1''' a=test1(4) self.assertEqual(a,16) if __name__ == '__main__': ''' 这是一个测试执行语句 ''' unittest.main()
再次运行
. ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
好的,完美,这个单元就过了!
但同时请注意,测试结果不是出现OK就表示通过了,有可能是没有被执行
请看运行结果的第一行,是一个实心的句号‘ .’,全部都是实心句号才表示执行通过
来,如果我将test002.py中的一行代码修改一下,如下
a=test1(4) self.assertEqual(a,15) #4** 2 显然不等于15
再次运行
F ====================================================================== FAIL: test_ceshi_0 (__main__.TestNew) 测试开始-1 ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\esclipse\test\python_test\test002.py", line 9, in test_ceshi_0 self.assertEqual(ce_shi,15) AssertionError: 16 != 15 ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1)
第一行,显示的‘F’,表示出错了
好了接下来,加长一点,test001.py
def test1(x): return x **2 def test2(name,sal): return name.title()+','+str(sal) def test3(x): if x%2==0: return "True" else: return "False" def test4(x): if type(x)==str: return 1 else: return 0
test002.py 如下:
1 #coding:UTF-8 2 import unittest 3 from test001 import test1,test2,test3,test4 4 class TestNew(unittest.TestCase): 5 '''这是一个用于测试的类''' 6 def test_ceshi_0(self): 7 '''测试开始-1''' 8 ce_shi=test1(4) 9 self.assertEqual(ce_shi,16) 10 11 def test_ceshi_1(self): 12 '''测试2''' 13 ce_shi2=test2('yin',8000) 14 self.assertNotEqual(ce_shi2,'yin8000') 15 16 def test_ceshi_2(self): 17 '''测试3''' 18 ce_shi3=test3(2) 19 self.assertTrue(ce_shi3) 20 21 def test_ceshi_3(self): 22 '''测试4''' 23 ce_shi4=test3(2.3) 24 self.assertFalse(ce_shi4) 25 26 def test_ceshi_4(self): 27 '''测试5''' 28 ce_shi5=test4('name') 29 self.assertIn(ce_shi5,[1,2,3]) 30 31 def test_ceshi_5(self): 32 '''测试6''' 33 ce_shi6=test4(123) 34 self.assertNotIn(ce_shi6,[1,2,3]) 35 36 37 if __name__ == '__main__': 38 unittest.main()
运行一下test002.py
1 ...F.. 2 ====================================================================== 3 FAIL: test_ceshi_3 (__main__.TestNew) 4 测试4 5 ---------------------------------------------------------------------- 6 Traceback (most recent call last): 7 File "E:\esclipse\test\python_test\test002.py", line 24, in test_ceshi_3 8 self.assertFalse(ce_shi4) 9 AssertionError: 'False' is not false 10 11 ---------------------------------------------------------------------- 12 Ran 6 tests in 0.001s 13 14 FAILED (failures=1)
运行结果中第一行显示:第4个测试不通过,原因是AssertionError: 'False' is not false
好吧,在 Python中 False==0的,所以将test001.py中返回“False”,修改为0,再次运行一下
1 ...... 2 ---------------------------------------------------------------------- 3 Ran 6 tests in 0.001s 4 5 OK
完美,以上测试的单元就通过,可以pass了