首页 > 代码库 > python之单元测试--常见问题

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: Falseis not false

好吧,在 Python中 False==0的,所以将test001.py中返回“False”,修改为0,再次运行一下

1 ......
2 ----------------------------------------------------------------------
3 Ran 6 tests in 0.001s
4 
5 OK

完美,以上测试的单元就通过,可以pass了

 

python之单元测试--常见问题