Python unittest 簡(jiǎn)單實(shí)現(xiàn)參數(shù)化的方法
Python unittest 理論上是不建議參數(shù)驅(qū)動(dòng)的,其用例應(yīng)該專注單元測(cè)試,確保每個(gè)method的邏輯正確。
引用Stack Overflow的一個(gè)答案,
“單元測(cè)試應(yīng)該是獨(dú)立的,沒(méi)有依賴項(xiàng)的。這確保了每個(gè)用例都有非常具體而專一的測(cè)試反應(yīng)。傳入?yún)?shù)會(huì)破壞單元測(cè)試的這個(gè)屬性,從而使它們?cè)谀撤N意義上無(wú)效。使用測(cè)試配置是最簡(jiǎn)單的方法,也是更合適的方法,因?yàn)閱卧獪y(cè)試不應(yīng)該依賴外部信息來(lái)執(zhí)行測(cè)試。那應(yīng)該集成測(cè)試要做的。”
但是實(shí)際操作過(guò)程中,時(shí)不時(shí)還是有控制入?yún)⒌男枨蟮摹1热?,我想?jiǎn)單實(shí)現(xiàn)一個(gè)web功能的cross-browser測(cè)試……
下面列出一些學(xué)習(xí)到的解決方案 (ENV: WIN 10, python36)。
利用類的屬性
這種方法可以不依賴其他第三方庫(kù),而且可以將參數(shù)化應(yīng)用到setUpClass 和setUp方法中。
即可以順利解決一個(gè)web 測(cè)試腳本cross-browser的驗(yàn)證的問(wè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可以簡(jiǎn)單的完成參數(shù)控制的test case,實(shí)際應(yīng)用的是python的裝飾器(decorator)。
寫出來(lái)有些類似cucumber gherkin當(dāng)中的scenario outline。
在實(shí)驗(yàn)中,這個(gè)方法不適用于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個(gè)test case被執(zhí)行。
這個(gè)方案還支持從外部文件中加載參數(shù)。具體可以參考DDT 官方文檔。
重寫unittest.TestCase的構(gòu)造函數(shù)
定義類ParametrizedTestCase,使之集成unittest.TestCase并重寫其構(gòu)造函數(shù),增加param這個(gè)參數(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
下面是一個(gè)包含我們用例的測(cè)試腳本,繼承了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ū)動(dòng)的方式執(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 簡(jiǎn)單實(shí)現(xiàn)參數(shù)化的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python單元測(cè)試unittest實(shí)例詳解
- Python單元測(cè)試框架unittest使用方法講解
- Python中unittest用法實(shí)例
- Python+request+unittest實(shí)現(xiàn)接口測(cè)試框架集成實(shí)例
- Python Unittest自動(dòng)化單元測(cè)試框架詳解
- Python unittest單元測(cè)試框架的使用
- Python中Unittest框架的具體使用
- Python單元測(cè)試框架unittest簡(jiǎn)明使用實(shí)例
- Python Unittest根據(jù)不同測(cè)試環(huán)境跳過(guò)用例的方法
- 一篇文章搞懂Python Unittest測(cè)試方法的執(zhí)行順序
相關(guān)文章
Python接口自動(dòng)化之淺析requests模塊post請(qǐng)求
這篇文章Python接口自動(dòng)化之淺析requests模塊post請(qǐng)求,以下主要介紹requests模塊中的post請(qǐng)求的使用,post源碼,data、json參數(shù)應(yīng)用場(chǎng)景及實(shí)戰(zhàn)2021-08-08python實(shí)現(xiàn)顏色rgb和hex相互轉(zhuǎn)換的函數(shù)
這篇文章主要介紹了python實(shí)現(xiàn)顏色rgb和hex相互轉(zhuǎn)換的函數(shù),可實(shí)現(xiàn)將rgb表示的顏色轉(zhuǎn)換成hex值的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03利用Python的裝飾器解決Bottle框架中用戶驗(yàn)證問(wèn)題
這篇文章主要介紹了Python的Bottle框架中解決用戶驗(yàn)證問(wèn)題,代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04像線程一樣管理進(jìn)程的Python multiprocessing庫(kù)
multiprocessing庫(kù)是基于threading API,它可以把工作劃分為多個(gè)進(jìn)程.有些情況下,multiprocessing可以作為臨時(shí)替換取代threading來(lái)利用多個(gè)CPU內(nèi)核,相應(yīng)地避免Python全局解釋器鎖所帶來(lái)的計(jì)算瓶頸.本文詳細(xì)介紹了Python multiprocessing庫(kù),需要的朋友可以參考下2021-05-05Python接口自動(dòng)化測(cè)試的實(shí)現(xiàn)
這篇文章主要介紹了Python接口自動(dòng)化測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python處理yaml和嵌套數(shù)據(jù)結(jié)構(gòu)技巧示例
這篇文章主要為大家介紹了Python處理yaml和嵌套數(shù)據(jù)結(jié)構(gòu)技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06基于python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于python學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11