當測試用例寫完後,有些模塊有改動時候,會影響到部分用例的執行,這個時候我們希望暫時跳過這些用例。
或者前面某個功能運行失敗了,後面的幾個用例是依賴於這個功能的用例,如果第一步就失敗了,後面的用例也就沒必要去執行了,直接跳過就行,節省用例執行時間。
一、skip裝飾器
skip裝飾器一共有四個
@
unittest.
skip
(reason)
-
Unconditionally skip the decorated test. reason should describe why the test is being skipped.
翻譯:無條件跳過用例,reason是說明原因
-
@
unittest.
skipIf
(condition, reason) -
Skip the decorated test if condition is true.
翻譯:condition爲true的時候跳過
-
@
unittest.
skipUnless
(condition, reason) -
Skip the decorated test unless condition is true.
翻譯:condition爲False的時候跳過
-
@
unittest.
expectedFailure
-
Mark the test as an expected failure. If the test fails when run, the test is not counted as a failure.
翻譯:斷言的時候跳過(暫時不知道有啥用,沒看懂,貌似斷言失敗,也變成用例pass了。)
二、實例介紹
在默認情況下,unittest 會自動測試每一個測試用例(以 test 開頭的方法),但如果希望臨時跳過某個測試用例,則可以通過如下兩種方式來實現:
- 使用 skipXxx 裝飾器來跳過測試用例。unittest 一共提供了 3 個裝飾器,分別是 @unittest.skip(reason)、@unittest.skipIf(condition, reason) 和 @unittest.skipUnless(condition, reason)。其中 skip 代表無條件跳過,skipIf 代表當 condition 爲 True 時跳過;skipUnless 代表當 condition 爲 False 時跳過。
- 使用TestCase 的 skipTest() 方法來跳過測試用例。
下面程序示範了使用 @unittest.skip 裝飾器來跳過測試用例(skip_test.py):
- import unittest
- from hello import *
- class TestHello(unittest.TestCase):
- # 測試say_hello函數
- def test_say_hello(self):
- self.assertEqual(say_hello() , "Hello World.")
- # 測試add函數
- @unittest.skip('臨時跳過test_add')
- def test_add(self):
- self.assertEqual(add(3, 4) , 7)
- self.assertEqual(add(0, 4) , 4)
- self.assertEqual(add(-3, 0) , -3)
第 10 行代碼使用 @unittest.skip 裝飾器跳過了 test_add() 測試方法。使用如下命令來運行該測試程序:
python -m unittest skip_test.py
可以看到如下輸出結果:
s.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=1)
在上面輸出結果的第一行可以看到 s.,這表明程序運行了兩個測試用例,s 代表跳過了第一個測試用例,點(.)代表第二個測試用例通過。
此外,程序也可以使用 TestCase 的 skipTest() 方法跳過測試用例。例如,如下程序示範了使用 skipTest() 方法來跳過測試用例(skip_test1.py):
- import unittest
- from hello import *
- class TestHello(unittest.TestCase):
- # 測試say_hello函數
- def test_say_hello(self):
- self.assertEqual(say_hello() , "Hello World.")
- # 測試add函數
- def test_add(self):
- self.skipTest('臨時跳過test_add')
- self.assertEqual(add(3, 4) , 7)
- self.assertEqual(add(0, 4) , 4)
- self.assertEqual(add(-3, 0) , -3)
第 11 行代碼使用 self.skipTest() 方法跳過了測試方法(test_add())。使用如下命令來運行該測試程序:
python -m unittest -v skip_test1.py
上面命令使用了 -v 選項來生成更詳細的測試報告。運行上面命令,可以看到如下輸出結果:
test_add (skip_test2.TestHello) ... skipped '臨時跳過test_add'
test_say_hello (skip_test2.TestHello) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=1)
從上面的輸出結果可以看到,unittest 測試跳過了 test_add() 方法,並顯示了跳過的原因:'臨時跳過test_add'(如果不使用 -v 選項,將不會輸出該原因)。