1. 程式人生 > >25 【python入門指南】如何編寫測試程式碼

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)

    def
runTest(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