第二種方式,修改python unittest的執行順序,使用猴子補丁
阿新 • • 發佈:2018-07-25
super 之前 ima out teardown 驗證 不同的 執行順序 鏈接
1、按照測試用例的上下順序,而不是按方法的名稱的字母順序來執行測試用例。
之前的文章鏈接
之前寫的,不是猴子補丁,而是要把Test用例的類名傳到run裏面去執行,與原生的使用有一點區別。現在修改成,用的時候代碼與原生unittest完全一模一樣,但運行時候使用與原生不同的邏輯。
import time import unittest from unittest.main import TestProgram from app.utils.utils_ydf import LogManager class CustomTestCase(unittest.TestCase): @classmethoddef setUpClass(cls): cls.logger = LogManager(‘unittest用例的日誌‘).get_logger_without_handlers() @classmethod def tearDownClass(cls): time.sleep(1) cls.logger.debug(‘---------------------------------所有用例完成-----------------------------‘) time.sleep(200000) deftearDown(self): time.sleep(0.1) def setUp(self): time.sleep(0.1) class CustomLoader(unittest.TestLoader): def getTestCaseNames(self, testCaseClass): """Return a sorted sequence of method names found within testCaseClass """ def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix): return attrname.startswith(prefix) and callable(getattr(testCaseClass, attrname)) testFnNames = list(filter(isTestMethod, dir(testCaseClass))) if self.sortTestMethodsUsing: testFnNames.sort(key=lambda fun_name: getattr(testCaseClass, fun_name).__code__.co_firstlineno) return testFnNames custom_loader = CustomLoader() class CustomTestTestProgram(TestProgram): def __init__(self, *args, testLoader=custom_loader, **kwargs): super().__init__(*args, testLoader=testLoader, **kwargs) def patch_unittest(): unittest.TestCase = CustomTestCase unittest.defaultTestLoader = custom_loader unittest.main = CustomTestTestProgram if __name__ == ‘__main__‘: patch_unittest() class _Test(unittest.TestCase): def test_3(self): print(1) def test_2(self): print(2) def test_1(self): print(3) unittest.main()
這次的unitetest測試用例寫法還是繼承原生的Testcase類,執行生成測試用例也是原生的方法。
可以看到,正常情況下應該打印3 2 1 ,但使用了猴子技術後打印是 1 2 3。
運行結果是:
2、可以把調用patch_unittest函數寫在最常用的工具包裏面,就不用親自去調用他了。
之前上篇驗證過,python的模塊只會導入一次,不管你在不同的文件中不同地方import 幾百次,都是只會導入一次的。別的地方import 的unitetest的行為都會發生變化。
第二種方式,修改python unittest的執行順序,使用猴子補丁