單元測試作為開發者分內事情,這也是對自己工作的負責。在編碼時,測試驅動可以作為一種不錯的開發思想。對於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報告。
閱讀更多 用數說話 的文章