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了