1. 程式人生 > >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: 'False' is not false

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

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

完美,以上測試的單元就通過,可以pass了