Unittest組織用例的姿勢
本文我們將會講解Python Unittest 裡組織用例的5種姿勢。
環境準備:
python 3.0以上
python requests庫
小編的環境:
python 3.6.4
一、TestLoader
- 當 import unittest 時 ,會自動匯入TestLoader類
- TestLoader這個類下,封裝了 5 種組織用例的方法
loader.py
class TestLoader(object): """ 該類負責根據各種標準載入測試並將它們包裝在TestSuite中 """ def loadTestsFromTestCase(self, testCaseClass): """ 返回testCaseClass中包含的所有測試用例的套件 """ def loadTestsFromModule(self, module, *args, pattern=None, **kws): """ 返回給定模組中包含的所有測試用例的套件 """ def loadTestsFromName(self, name, module=None): """ 返回給定用例名的測試用例的套件 """ def loadTestsFromNames(self, names, module=None): """ 返回給定的一組用例名的測試用例的套件 """ def discover(self, start_dir, pattern='test*.py', top_level_dir=None): """ 查詢並返回指定的起始目錄中的所有測試模組,遞迴到子目錄中以查詢它們並返回在其 中找到的所有測試。僅載入與模式匹配的測試檔案。 必須可以從專案的頂層匯入測試模組。如果起始目錄不是頂級目錄,則必須單獨指定頂級目錄。 """ defaultTestLoader = TestLoader() """ 當執行import unittest 時 會自動匯入 defaultTestLoader defaultTestLoader是TestLoader()的例項物件 """
二、unittest組織用例方法演示
專案目錄
how_to_run_test_case test_case __init__.py test_add.py test_sub.py run_from_test_case_class.py run_from_test_case_moudle.py run_from_case_name.py run_from_case_names.py run_from_discover.py
test_add.py
# encoding:utf8 import unittest class AddCase(unittest.TestCase): def add_fun(self, a, b): return a + b def test_add_1(self): '''加法冒煙測試''' ret = self.add_fun(1, 2) self.assertEqual(3, ret) def test_add_2(self): ret = self.add_fun(1, 2) self.assertEqual(6, ret)
test_sub.py
# encoding:utf8 import unittest class SubCase(unittest.TestCase): def add_fun(self, a, b): return a - b def test_sub_1(self): '''減法冒煙測試''' ret = self.add_fun(1, 2) self.assertEqual(-1, ret) def test_sub_2(self): ret = self.add_fun(1, 2) self.assertEqual(6, ret)
1、載入測試類中的用例
loadTestsFromTestCase(self, testCaseClass)
- 使用loadTestsFromTestCase這個方法,需傳入unittest測試類的類名
- 以專案為例子,傳入 testCaseClass :AddCase
例子:
run_from_test_case_class.py
# encoding:utf8 import unittest from test_case.test_add import AddCase cases = unittest.TestLoader().loadTestsFromTestCase(AddCase) runner = unittest.TextTestRunner(verbosity=2) runner.run(cases)
1.1 執行 run_from_test_case_class.py
python run_from_test_case_class.py
1.2 執行結果
test_add_1 (test_case.test_add.AddCase) 加法冒煙測試 ... ok test_add_2 (test_case.test_add.AddCase) ... FAIL
2、載入模組中的測試用例
loadTestsFromModule(self, module, *args, pattern=None, **kws)
- 使用loadTestsFromModule這個方法,需傳入被測試模組
- 以專案為例子,傳入引數 module :test_add
例子:
run_from_test_case_moudle.py
# encoding:utf8 import unittest from test_case import test_add cases = unittest.TestLoader().loadTestsFromModule(test_add) runner = unittest.TextTestRunner(verbosity=2) runner.run(cases)
2.1 執行 run_from_test_case_moudle.py
python run_from_test_case_moudle.py
2.2 執行結果
test_add_1 (test_case.test_add.AddCase) 加法冒煙測試 ... ok test_add_2 (test_case.test_add.AddCase) ... FAIL
3、載入指定的單個測試用例
loadTestsFromName(self, name, module=None)
- 使用loadTestsFromTestCase這個方法,需傳入測試用例的方法名
- 傳入測試用例的方法名格式:moudleName.testCaseClassName.testCaseName
- 以專案為例子,我想測試test_add.py 裡面的用例 test_add_1
- 我需要傳入的引數 name:test_add.AddCase.test_add_1
-
loadTestsFromName這個方法是在 sys.path 裡面的路徑去尋找測試模組test_add.py,然後再尋找測試類AddCase
最後再尋找測試用例test_add_1
例子:
run_from_case_name.py
# encoding:utf8 import unittest import os import sys # 獲取 "how_to_run_test_case" 的絕對路徑 dir_run_test_case = os.path.dirname(os.path.abspath(__file__)) # 獲取 "test_case" 的絕對路徑 dir_test_case = dir_run_test_case + '/test_case' # 把 "test_case" 的絕對路徑 加入 sys.path sys.path.insert(0,dir_test_case) case= unittest.TestLoader().loadTestsFromName('test_add.AddCase.test_add_1') runner = unittest.TextTestRunner(verbosity=2) runner.run(cases)
3.1 執行 run_from_case_name.py
python run_from_case_name.py
3.2 執行結果
test_add_1 (test_add.AddCase) 加法冒煙測試 ... ok
4、載入指定的多個測試用例
loadTestsFromNames(self, names, module=None)
- 使用loadTestsFromTestCase這個方法,需要傳入一個數組
- 陣列包含你所想要執行的測試用例的方法名
- 數組裡面裡面的元素必須是字串
- 測試用例的方法名格式:moudleName.testCaseClassName.testCaseName
- 以專案為例,我想測試test_add.py 裡面的用例 test_add_1 ,以及test_sub.py 裡面的用例 test_sub_1
- 我需要傳入的引數 names:['test_sub.SubCase.test_sub_2','test_add.AddCase.test_add_1']
- loadTestsFromNames這個方法是在 sys.path 裡面的路徑去尋找匹配的測試用例
- 執行用例是根據陣列元素的的順序執行
例子:
run_from_case_names.py
# encoding:utf8 import unittest import sys import os # 獲取 "how_to_run_test_case" 的絕對路徑 dir_run_test_case = os.path.dirname(os.path.abspath(__file__)) # 獲取 "test_case" 的絕對路徑 dir_test_case = dir_run_test_case + '/test_case' # 把 "test_case" 的絕對路徑 加入 sys.path sys.path.insert(0,dir_test_case) cases = ['test_sub.SubCase.test_sub_1','test_add.AddCase.test_add_1'] suite = unittest.TestLoader().loadTestsFromNames(cases) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
4.1 執行 run_from_case_names.py
python run_from_case_names.py
4.2 執行結果
test_sub_1 (test_sub.SubCase) 減法冒煙測試 ... ok test_add_1 (test_add.AddCase) 加法冒煙測試 ... ok
5、載入指定目錄下所有的測試用例
discover(self, start_dir, pattern='test*.py', top_level_dir=None)
- start_dir : 查詢用例的起始目錄
- pattern='test*py' : 查詢模組名為test開頭的python檔案
- top_level_dir=None :測試模組頂級目錄
例子:
run_from_discover.py
# encoding:utf8 import unittest import os dir_how_to_run_test_case = os.path.dirname(os.path.abspath(__file__)) dir_test_case = dir_how_to_run_test_case + '/test_case' cases = unittest.defaultTestLoader.discover(dir_test_case) runner = unittest.TextTestRunner(verbosity=2) runner.run(cases)
5.1 執行 run_from_discover.py
python run_from_discover.py
5.2 執行結果
test_add_1 (test_add.AddCase) 加法冒煙測試 ... ok test_add_2 (test_add.AddCase) ... FAIL test_sub_1 (test_sub.SubCase) 減法冒煙測試 ... ok test_sub_2 (test_sub.SubCase) ... FAIL