Python單元測試利器之unittest

Python單元測試利器之unittest

單元測試作為開發者分內事情,這也是對自己工作的負責。在編碼時,測試驅動可以作為一種不錯的開發思想。對於python開發而言, unittest是輔助測試既有力的工具。

1. unitteset核心模塊包括:TestCase, TestSuite, TestLoader TextTestRunner,TestFixture

(1)TestCase是測試用例。它是一個完整的測試單元,其中可能包括環境準備(setUp), 執行測試(run),以及環境清理(tearDown)

(2)TestSuite是用例集合。將一個功能模塊多個測試用例彙集一起執行。

(3)TestLoader是用例將用例加載到TestSuite中,可以將一個文件目錄下所有python的所有測試用例提取出來。

(4)TextTestRunner是用來執行測試用例,可執行TestCase/TestSuite

(5)TextTestResult 是作為保存測試結果的對象

執行流程:TestCase生成測試用例,而TestLoader將測試用例加載到TestSuite中,TextTestRunner負責執行TestSuite,運行結果保存在TextTestResult.

測試示例:

1.簡單測試

測試函數:

def add(x, y):

return x + y

測試用例:

class MyTestCase(unittest.TestCase):

def test_add(self):

x = 1

y = 2

self.assertEqual(3, my_func.add(x, y)) #判斷預測結果和運算結果之間是否相同

def test_add2(self):

x = '1'

y = '2'

self.assertEqual(3, my_func.add(x, y)) #判斷預測結果和運算結果之間是否相同

if __name__ == '__main__':

unittest.main()

測試結果

.F

======================================================================

FAIL: test_add2 (__main__.MyTestCase)

----------------------------------------------------------------------

Traceback (most recent call last):

File "test/my_func_test.py", line 13, in test_add2

self.assertEqual(3, my_func.add(x, y)) #判斷預測結果和運算結果之間是否相同

AssertionError: 3 != '12'

----------------------------------------------------------------------

Ran 2 tests in 0.001s

FAILED (failures=1)

測試用例要說明的:

(1). 測試用例繼承了TestCase類,

(2)每個測試方法均以test開頭,否則不能被unittest識別

(2).skip 裝飾器表示跳過測試用例。skip裝飾器一共有三個:unittest,skip(reason):無條件跳過

unittest.skipIf(condition, reason):當condition為True時跳過

unittest.skipUnless(condition, reason):當condition為False時跳過

整個過程集成在unittest.main模塊中。測試結果中

(1)在第一行給出了每一個用例執行的結果的標識,成功是.,失敗是F,出錯是E,跳過是S。從上面可以看出,測試的執行跟方法的順序沒有關係,divide方法寫在了第4個,但是卻在第2個執行。

(2)在uniitest.main()中加verbosity參數可以控制輸出的錯誤報告的詳細程度,默認是1,如果設為0, 則不輸出每一用例的執行結果,即沒有上面的結果中的第1行,如果設為2,則輸出詳細的執行結果

2. TestSuite使用

TestSuite使用可以指定測試用例的執行順序,可以組織多個模塊中的測試用例,使用示例如下:

if __name__ == '__main__':

# 以下等同於

# unittest.main()

tests = [MyTestCase('test_add'), MyTestCase('test_add2'), MyTestCase('test_add3')]

suite = unittest.TestSuite()

suite.addTests(tests)

runner = unittest.TextTestRunner(verbosity=1)

runner.run(suite)

3. 使用skip跳過case

如果想跳過某個case不進行執行,可以用unit.skip裝飾器實現。kip裝飾器一共有三個:unittest,skip(reason):無條件跳過

unittest.skipIf(condition, reason):當condition為True時跳過

unittest.skipUnless(condition, reason):當condition為False時跳過

@unittest.skip("do not test this case")

def test_add3(self):

x = '1'

y = '2'

self.assertEqual('12', my_func.add(x, y)) #判斷預測結果和運算結果之間是否相同

執行結果中多的s標識。

.Fs

======================================================================

FAIL: test_add2 (__main__.MyTestCase)

----------------------------------------------------------------------

Traceback (most recent call last):

File "test/my_func_test.py", line 13, in test_add2

self.assertEqual(3, my_func.add(x, y)) #判斷預測結果和運算結果之間是否相同

AssertionError: 3 != '12'

----------------------------------------------------------------------

Ran 3 tests in 0.001s

FAILED (failures=1, skipped=1)

4. 環境搭建(setUp) 和環境清理(tearDown)

@classmethod

def setUpClass(cls):

print('set up!')

@classmethod

def tearDownClass(cls):

print('tear down!')

5.測試結果輸出文件

if __name__ == '__main__':

tests = [MyTestCase('test_add'), MyTestCase('test_add2'), MyTestCase('test_add3')]

suite = unittest.TestSuite()

suite.addTests(tests)

with open('UnittestTextReport.txt', 'a') as f:

runner = unittest.TextTestRunner(stream=f, verbosity=1)

runner.run(suite)

6. unittest參數化

所謂的測試參數化就是讓測試的樣例參數化。

@parameterized.parameterized.expand(

[[1, 2, 3],

[4, 5, 6]]

)

總結:

1、unittest是python自帶的單元測試框架,我們可以用其來作為我們自動化測試框架的用例組織執行框架。

2、unittest的流程:寫好TestCase,然後由TestLoader加載TestCase到TestSuite,然後由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中,我們通過命令行或者unittest.main()執行時,main會調用TextTestRunner中的run來執行,或者我們可以直接通過TextTestRunner來執行用例。

3、一個class繼承unittest.TestCase即是一個TestCase,其中以 test 開頭的方法在load時被加載為一個真正的TestCase。

4、verbosity參數可以控制執行結果的輸出,0 是簡單報告、1 是一般報告、2 是詳細報告。

5、可以通過addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。

6、用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例執行前佈置環境,以及在用例執行後清理環境

7、我們可以通過skip,skipIf,skipUnless裝飾器跳過某個case,或者用TestCase.skipTest方法。

8、參數中加stream,可以將報告輸出到文件:可以用TextTestRunner輸出txt報告,以及可以用HTMLTestRunner輸出html報告。


分享到:


相關文章: