Python單元測試unittest - 單元測試框架

1、unittest簡介

  unitest單元測試框架最初是有JUnit的啓發,它支持測試自動化,共享測試的設置和關閉代碼,將測試聚合到集合中,以及測試與報告框架的獨立性。html

2、unittest相關概念

TestFixture:表示測試一個或多個測試的時候,須要的一些相關動做,好比,建立臨時或代理數據庫,目錄或啓動服務器進程。測試代碼的這種工做環境稱爲夾具。
TestCase(測試用例):就是測試的各個單元,他檢查對特定輸入集的特定響應,unitest提供了一個基類,TestCase用於建立新的測試用例。
TestSuite(測試套件):多個測試用例集合在一塊兒。測試用例實例根據他們測試的功能組合在一塊兒,unittest爲此提供了一個機制:測試套件。
TestRunner:執行測試用例的,測試的結果會保存至TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息。
TestLoader():可用於自動建立測試套件並使用單個測試填充它的過程。
運行各類測試用例的順序是經過根據字符串的內置順序對測試函數名稱進行排序調用。

3、斷言方法表

檢查並報告故障 assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIs(a, b) a is b                    3.1 assertIsNot(a, b) a is not b                3.1 assertIsNone(x) x is None                3.1 assertIsNotNone(x) x is not None            3.1 assertIn(a, b) a in b                    3.1 assertNotIn(a, b) a not in b                3.1 assertIsInstance(a, b) isinstance(a, b) 3.2 assertNotIsInstance(a, b) not isinstance(a, b)    3.2
檢查異常、警告、日誌消息生成 assertRaises(exc, fun, *args, **kwds)    fun(*args, **kwds)提升EXC assertRaisesRegex(exc, r, fun, *args, **kwds)    fun(*args, **kwds)提出exc 而且消息匹配正則表達式r    3.1 assertWarns(warn, fun, *args, **kwds)    fun(*args, **kwds)提出警告    3.2 assertWarnsRegex(warn, r, fun, *args, **kwds)    fun(*args, **kwds)提出警告 和消息的正則表達式匹配ř    3.2 assertLogs(logger, level) 該with塊 以最低級別登陸記錄器 3.4

4、示例

import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('FOO'.islower()) def test_split(self): s = "Hello World" self.assertEqual(s.split(), ['Hello', 'World']) with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
首先經過unittest.TestCase子類建立測試用例
經過以test開頭的三個方法
assertEqual()檢查預期結果
assertTrue()或assertFalse()覈實狀況
assertRaises()驗證是否引起了特定異常
使用這些方法代替assert語句,以便測試運行器能夠累積全部測試結果並生成報告
setUp():在每一個測試用例執行以前執行
tearDown():在每一個測試用例執行以後執行

5、運行測試用例

unittest.main()提供了測試腳本的命令行界面
python BaseExample.py -v 傳入-v標誌來運行具備更多詳細信息的測試用例
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method

 6、生成測試報告

# coding=utf-8
import unittest import HtmlTestRunner class TestSuiteExample(unittest.TestCase): def test_equal(self): s = "Hello" self.assertEqual(s, "Hello") def test_upper(self): s = "FOO" self.assertEqual('FOO', s) def test_lower(self): s = "foo" self.assertTrue(s.islower()) if __name__ == '__main__': # 建立一個測試集合
    f = open('./test_suite_example.html') test_suite = unittest.TestSuite() loader = unittest.TestLoader() # 向測試套件中添加測試用例
    # test_suite.addTest(test=TestSuiteExample("test_equal"))

    # 使用loader添加全部的測試方法
    tests = loader.loadTestsFromTestCase(TestSuiteExample) test_suite.addTests(tests=tests) # 打開文件,用於生成html
 runner = HtmlTestRunner.HTMLTestRunner(output="D:/python/") runner.run(test_suite)

HtmlTestRunner 須要單獨安裝python

pip install html-testRunner==1.0.3

向套件中添加測試用例使用addTest()和addTests()正則表達式

addTest(test) Add a TestCase or TestSuite to the suite. addTests(tests) Add all the tests from an iterable of TestCase and TestSuite instances to this test suite. This is equivalent to iterating over tests, calling addTest() for each element.

 7、跳過測試和預期的失敗

unittest支持跳過單個測試甚至整個測試類,它支持將測試標記爲"預期失敗",但不該該視爲TestResult失敗數據庫

import sys import unittest class MyTestCase(unittest.TestCase): @unittest.skip("跳過測試") def test_nothing(self): self.fail("沒有發生") @unittest.skipIf(1 > 0, "若是真,則跳過") def test_format(self): self.assertTrue(1 < 0) @unittest.skipUnless(sys.platform.startswith("win"),"requires Windows") def test_upper(self): s = "hh" self.assertEqual('HH',s.upper()) if __name__ == '__main__': unittest.main()

8、TestCase(測試用例)

TestCase類的實例表示unittest中最小的測試單元,此類旨在用做基類,具體的測試有氣子類實現,此類實現測試運行期所需的接口以容許其驅動測試服務器

  • setUp():調用準備測試夾具的方法,在調用測試方法以前當即調用它。
  • tearDown(): 調用測試方法後當即調用此方法並記錄結果。即便測試方法引起了異常,也會調用此方法。
  • setUpClass():運行測試類中全部測試方法以前調用,必須裝飾爲@classmethod
  • tearDownClass():已經運行測試類中全部的測試方法纔會調用,必須裝飾@classmethod
  • run():運行測試,將結果收集到結果對象中,結果對象不會返回給run()調用者
  • skipTest():跳過此測試方法

9、TestSuite(分組測試)

此類表示各個測試用例和測試套件的集合,該類提供了測試運行器所需的接口,以容許他像其餘任何測試用例同樣運行框架

  • addTest():添加一個TestCase或TestSuite到套件
  • addTests():將可迭代的TestCase或TestSuite實例中全部測試添加到測試套件中
  • run():運行與此套件關聯的測試

10、TestLoader(加載和運行測試)

TestLoader類被用於建立TestSuite從模塊或類中。一般,不須要建立此類的實例,unittest模塊提供了一個能夠共享的實例unittest.defaultTestLoader()less

  • loadTestsFromTestCase(testCaseClass):從testCaseClase中返回一個包含全部測試用例的suite
  • loadTestsFromModule(module):從提供的module中返回一個包含全部測試用例的suite,此方法在模塊中全部派生來自TestCase的類,併爲每一個TestCase子類建立實例
  • loadTestsFromName(namemodule=None)
  • loadTestFromNames(namesmodule=None)

11、TestResult

此類用於編譯有關哪些測試成功以及哪些測試失敗的信息函數

一個TestResult對象存儲一組測試結果,有如下屬性:單元測試

  • errors:包含2元組TestCase實例和包含格式化回溯的字符串的列表每一個元組表明一個引起意外異常的測試。
  • failures:包含2元組TestCase實例和包含格式化回溯的字符串的列表
  • skipped:包含2元組TestCase實例和字符串的列表,其中包含跳過測試的緣由。

12、其餘

unittest.defaultTestLoader:TestLoader要共享類的實例若是不須要自定義,TestLoader則可使用此實例而不是重複建立新實例。測試

unittest.main:一個命令行程序,它從模塊加載一組測試並運行它們; 這主要是爲了使測試模塊能夠方便地執行

相關文章
相關標籤/搜索