簡體   English   中英

Python unittest /測試裝置測試是否已加載模塊

[英]Python unittest/test fixture testing if module is loaded

我正在使用另一個SO推薦來導入simplejson ,內容如下:

try:
    import simplejson as json
except ImportError:
    import json

但是,在編寫單元測試以查看是否實際上已導入“ json模塊之一”時,我陷入了自己設計的循環夢night! /嘆。

class AreAllModulesLoaded(unit.TestCase):
    """Test to make sure all modules are loaded"""
    def test_json(self):
        try:
            self.assertTrue("simplejson" in sys.modules)
        except:
            try:
                self.assertTrue("json" in sys.modules)
            except AssertionError:
                raise

我以為這樣的事情本來可以工作,但是,在檢查unittest.failUnlessunittest.assertTrue (我都嘗試過)時,它會引發失敗並停止測試(失敗了,因為我僅通過加載json導致失敗而不是simplejson )...

我的預期目標是我希望我的單元測試確認已加載EITHER json或simplejson。 我該怎么辦?

我曾考慮過在斷言之前捕獲“真實性”,然后僅通過“ True”或“ False”,但這不適用於單元測試,因為我認為這應該是單元測試的一部分,而不是一項工作。周圍(這是我的觀點,也許您有不同的看法)。 例如,我曾考慮過要做類似的事情(python-esque pseduoish代碼):

_simplejsonLoaded = "simplejson" in sys.modules
_jsonLoaded = "json" in sys.modules

self.assertTrue(_simplejsonLoaded or _jsonLoaded)

(我是正式進行單元測試的新手-因此,如果這里有些瘋狂的地方,請告訴我)。

其他信息:

  • 我正在使用Python 2.6(出於工作原因-無法更改)
  • Windows和Linux

我是

我認為您不需要TestCase中的try / except東西

import sys
import unittest
try:
    import simplejson as json
except ImportError:
    import json

class TestSomething(unittest.TestCase):
    def test_json(self):
        if ('json' in sys.modules or 'simplejson' in sys.modules):
            self.assert_(True, "some kind of json loaded")
        else:
            self.fail()

if __name__ == "__main__":
    unittest.main()

好吧,問題是您是否真的關心導入的是哪個特定庫。 當您將simplejson as json導入時,您也將sys.modules json符號也添加進來,那sys.modules真正重要的,對嗎? 當然,您可以然后檢查導入的json庫是否具有您自己的程序所需的所有方法和屬性,但這是另一個問題。 因此,測試的正確定義不僅是:

import sys
import my_own_module

class TestSomething(unittest.TestCase):
    def test_json(self):
        self.assertIn('json', sys.modules,
                      "json API not loaded")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM