Python unittest 簡單實(shí)現(xiàn)參數(shù)化的方法
Python unittest 理論上是不建議參數(shù)驅(qū)動的,其用例應(yīng)該專注單元測試,確保每個method的邏輯正確。
引用Stack Overflow的一個答案,
“單元測試應(yīng)該是獨(dú)立的,沒有依賴項(xiàng)的。這確保了每個用例都有非常具體而專一的測試反應(yīng)。傳入?yún)?shù)會破壞單元測試的這個屬性,從而使它們在某種意義上無效。使用測試配置是最簡單的方法,也是更合適的方法,因?yàn)閱卧獪y試不應(yīng)該依賴外部信息來執(zhí)行測試。那應(yīng)該集成測試要做的?!?/p>
但是實(shí)際操作過程中,時不時還是有控制入?yún)⒌男枨蟮?。比如,我想簡單?shí)現(xiàn)一個web功能的cross-browser測試……
下面列出一些學(xué)習(xí)到的解決方案 (ENV: WIN 10, python36)。
利用類的屬性
這種方法可以不依賴其他第三方庫,而且可以將參數(shù)化應(yīng)用到setUpClass 和setUp方法中。
即可以順利解決一個web 測試腳本cross-browser的驗(yàn)證的問題。
class TestOdd1(unittest.TestCase): NUMBER=1 def runTest(self): """Assert that the item is odd""" self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd") class TestOdd2(TestOdd1): NUMBER=2 if __name__ == '__main__': unittest.main()
nose + ddt
用nose和ddt可以簡單的完成參數(shù)控制的test case,實(shí)際應(yīng)用的是python的裝飾器(decorator)。
寫出來有些類似cucumber gherkin當(dāng)中的scenario outline。
在實(shí)驗(yàn)中,這個方法不適用于setUpClass。
pip install nose pip install ddt
import unittest from ddt import ddt, data @ddt class TestOdd(unittest.TestCase): @data(3, 4, 12, 23) def runTest(self, value): self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")
執(zhí)行 nosetests my_test.py ,4個test case被執(zhí)行。
這個方案還支持從外部文件中加載參數(shù)。具體可以參考DDT 官方文檔。
重寫unittest.TestCase的構(gòu)造函數(shù)
定義類ParametrizedTestCase,使之集成unittest.TestCase并重寫其構(gòu)造函數(shù),增加param這個參數(shù)。
import unittest class ParametrizedTestCase(unittest.TestCase): """ TestCase classes that want to be parametrized should inherit from this class. """ def __init__(self, methodName='runTest', param=None): super(ParametrizedTestCase, self).__init__(methodName) self.param = param @staticmethod def parametrize(testcase_klass, param=None): """ Create a suite containing all tests taken from the given subclass, passing them the parameter 'param'. """ testloader = unittest.TestLoader() testnames = testloader.getTestCaseNames(testcase_klass) suite = unittest.TestSuite() for name in testnames: suite.addTest(testcase_klass(name, param=param)) return suite
下面是一個包含我們用例的測試腳本,繼承了ParametrizedTestCase,
class TestOne(ParametrizedTestCase): def test_something(self): print 'param =', self.param self.assertEqual(1, 1) def test_something_else(self): self.assertEqual(2, 2)
以參數(shù)驅(qū)動的方式執(zhí)行用例
uite = unittest.TestSuite() suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=42)) suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=13)) unittest.TextTestRunner(verbosity=2).run(suite)
將得到如下輸出,
test_something (__main__.TestOne) ... param = 42 ok test_something_else (__main__.TestOne) ... ok test_something (__main__.TestOne) ... param = 13 ok test_something_else (__main__.TestOne) ... ok ----------------------------------------------- Ran 4 tests in 0.000s OK
以上這篇Python unittest 簡單實(shí)現(xiàn)參數(shù)化的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python處理圖像并生成JSONL元數(shù)據(jù)文件
JSONL是一種輕量級的數(shù)據(jù)序列化格式,由一系列獨(dú)立的?JSON?對象組成,本文主要為大家介紹了Python如何處理圖像并生成JSONL元數(shù)據(jù)文件,感興趣的可以了解下2025-05-05
Python 讀取xml數(shù)據(jù),cv2裁剪圖片實(shí)例
這篇文章主要介紹了Python 讀取xml數(shù)據(jù),cv2裁剪圖片實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python學(xué)習(xí)之matplotlib繪制散點(diǎn)圖實(shí)例
這篇文章主要介紹了python學(xué)習(xí)之matplotlib繪制散點(diǎn)圖實(shí)例,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法
本篇文章主要介紹了python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Python報錯TypeError: ‘dict‘ object is not&
在Python開發(fā)的旅程中,報錯信息就像是一個個路障,阻礙著我們前進(jìn)的步伐,而“TypeError: ‘dict’ object is not iterable”這個報錯,常常讓開發(fā)者們陷入困惑,那么,這個報錯究竟是怎么產(chǎn)生的呢?又該如何有效地解決它呢?讓我們一起深入探討,找到解決問題的方法2024-10-10

