25 【python入門指南】如何編寫測試程式碼
python如何編寫測試程式碼
python內建了unittest,使得寫應用層的單元測試變得超乎尋常的簡單。
1,執行單個測試函式
#!/bin/python import unittest class TestMathFunc(unittest.TestCase): def test_add(self): self.assertEqual(3, 1+2) self.assertEqual(4, 2+2) self.assertNotEqual(3, 1+3) def runTest(self): self.test_add() suite= unittest.TestSuite() testCase = [TestMathFunc()] suite.addTests(testCase) runner = unittest.TextTestRunner(verbosity = 2) runner.run(suite)
單元測試,只需要仿照上面的例子寫就可以完成自己的測試程式碼。
其中包含幾個部分:
a,測試類(要繼承unittest.TestCase);
b,測試小元件,unittest.TestSuite,負責將測試類裝入進來;
c,執行類,unittest.TextTestRunner;
2,執行多個測試函式
#!/bin/python import unittest class TestMathFunc(unittest.TestCase): def test_add(self): self.assertEqual(3, 1+2) self.assertEqual(4, 2+2) self.assertNotEqual(3, 1+3) def test_minus(self): self.assertEqual(-1, 1-2) defrunTest(self): self.test_add() self.test_minus() suite = unittest.TestSuite() #testCase = [TestMathFunc('test_add'), TestMathFunc('test_minus')] testCase = [TestMathFunc()] suite.addTests(testCase) runner = unittest.TextTestRunner(verbosity = 2) runner.run(suite)
修改runTest函式,將測試函式包含進來即可。
3,執行多個測試類
#!/bin/python import unittest class TestStringFunc(unittest.TestCase): def test_str_concat(self): self.assertEqual("abcabc", "abc" + "abc") def runTest(self): self.test_str_concat() class TestMathFunc(unittest.TestCase): def test_add(self): self.assertEqual(3, 1+2) self.assertEqual(4, 2+2) self.assertNotEqual(3, 1+3) def test_minus(self): self.assertEqual(-1, 1-2) def runTest(self): self.test_add() self.test_minus() suite = unittest.TestSuite() testCase = [TestMathFunc(), TestStringFunc()] suite.addTests(testCase) runner = unittest.TextTestRunner(verbosity = 2) runner.run(suite)
在suite新增多個測試類,即可。
當然還有另外的方式:
... suite = unittest.TestSuite() testCase = [TestMathFunc()] suite.addTests(testCase) testCase2 = TestStringFunc() suite.addTest(testCase2) runner = unittest.TextTestRunner(verbosity = 2) runner.run(suite)
通過以上程式碼片段,即可實現,自主地控制多個測試類,自主地控制多個函式執行測試,十分方便。
4,有時候我們不想每個測試函式都顯示呼叫,而是載入所有test_開頭的測試函式,怎麼做?
構建兩個檔案:t3.py,main.py
main檔案存放執行程式碼,t3檔案僅存放測試類,不存放任何執行程式碼
main.py
#!/bin/python
#main.py
import unittest from t3 import TestMathFunc, TestStringFunc suite2 = unittest.TestLoader().discover('.', 't3.py') runner = unittest.TextTestRunner(verbosity = 2) runner.run(suite2)
t3.py
#!/bin/python #t3.py import unittest class TestStringFunc(unittest.TestCase): def test_str_concat(self): self.assertEqual("abcabc", "abc" + "abc") # def runTest(self): # self.test_str_concat() class TestMathFunc(unittest.TestCase): def test_add(self): self.assertEqual(3, 1+2) self.assertEqual(4, 2+2) self.assertNotEqual(3, 1+3) def test_minus(self): self.assertEqual(-1, 1-2) # def runTest(self): # self.test_add() # self.test_minus()
執行main.py,輸出結果:
test_add (t3.TestMathFunc) ... ok test_minus (t3.TestMathFunc) ... ok test_str_concat (t3.TestStringFunc) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.001s
通過 unittest.TestLoader().discover('.', 't3.py') 將t3檔案中包含的所有測試類匯入到suite中。
依賴這個功能,我們可以將所有的需要測試的檔案,匯入到main主函式中,進行集中管理和測試。注意:這裡不再依賴runTest函式,只要函式名中包含test字首就會被包含進來。
5,有時候測試用例需要提供上下文環境,怎麼做?
我們針對例子4,僅修改t3.py測試類。
class TestMathFunc(unittest.TestCase): def setUp(self): print("\nTestMathFunc:setup") self.a = 1 self.b = 2 def test_add(self): self.assertEqual(3, 1+2) self.assertEqual(4, 2+2) self.assertNotEqual(3, 1+3) self.assertEqual(3, self.a + self.b) def test_minus(self): self.assertEqual(-1, 1-2)
這裡我們準備了環境資訊(準備兩個變數a和b),使用這兩個變數進行單元測試。
test_add (t3.TestMathFunc) ... TestMathFunc:setup ok test_minus (t3.TestMathFunc) ... TestMathFunc:setup ok test_str_concat (t3.TestStringFunc) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.002s OK
函式的輸出如上。
類的單元測試,每個函式執行之前都會執行setUp函式。
對應的是tearDown,用來銷燬構建的環境資訊。可以自己嘗試下。
參考網站:
更詳細的解釋:https://www.jianshu.com/p/38948d0d73f5
最詳細的官方文件:https://docs.python.org/3/library/unittest.html#module-unittest