国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python unittest 簡單實現參數化的方法

2020-01-04 13:57:44
字體:
來源:轉載
供稿:網友

Python unittest 理論上是不建議參數驅動的,其用例應該專注單元測試,確保每個method的邏輯正確。

引用Stack Overflow的一個答案,

“單元測試應該是獨立的,沒有依賴項的。這確保了每個用例都有非常具體而專一的測試反應。傳入參數會破壞單元測試的這個屬性,從而使它們在某種意義上無效。使用測試配置是最簡單的方法,也是更合適的方法,因為單元測試不應該依賴外部信息來執行測試。那應該集成測試要做的。”

但是實際操作過程中,時不時還是有控制入參的需求的。比如,我想簡單實現一個web功能的cross-browser測試……

下面列出一些學習到的解決方案 (ENV: WIN 10, python36)。

利用類的屬性

這種方法可以不依賴其他第三方庫,而且可以將參數化應用到setUpClass 和setUp方法中。

即可以順利解決一個web 測試腳本cross-browser的驗證的問題。

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可以簡單的完成參數控制的test case,實際應用的是python的裝飾器(decorator)。

寫出來有些類似cucumber gherkin當中的scenario outline。

在實驗中,這個方法不適用于setUpClass。

pip install nosepip install ddt
import unittestfrom ddt import ddt, data @ddtclass TestOdd(unittest.TestCase):  @data(3, 4, 12, 23) def runTest(self, value):  self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

執行 nosetests my_test.py ,4個test case被執行。

這個方案還支持從外部文件中加載參數。具體可以參考DDT 官方文檔

重寫unittest.TestCase的構造函數

出處:Eli Bendersky的博客

定義類ParametrizedTestCase,使之集成unittest.TestCase并重寫其構造函數,增加param這個參數。

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)

以參數驅動的方式執行用例

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 = 42oktest_something_else (__main__.TestOne) ... oktest_something (__main__.TestOne) ... param = 13oktest_something_else (__main__.TestOne) ... ok -----------------------------------------------Ran 4 tests in 0.000s OK

以上這篇Python unittest 簡單實現參數化的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都安| 凤庆县| 庆城县| 蓬安县| 阿合奇县| 普兰县| 枣强县| 讷河市| 石楼县| 泰顺县| 东辽县| 枣阳市| 如东县| 仪陇县| 鸡泽县| 枝江市| 宾川县| 社会| 苍山县| 东乌珠穆沁旗| 客服| 黄梅县| 弥渡县| 黄龙县| 临城县| 新沂市| 吴忠市| 永登县| 德兴市| 池州市| 玉环县| 营口市| 忻城县| 郎溪县| 苏尼特左旗| 临沧市| 边坝县| 三原县| 英山县| 平利县| 红原县|