Python单元测试/测试夹具测试是否加载模块

时间:2013-10-29 19:45:43

标签: python unit-testing

我正在使用另一个SO建议来导入simplejson,其内容如下:

try:
    import simplejson as json
except ImportError:
    import json

然而,在编写我的unittest以查看“其中一个json模块”实际上是否已被导入时,我陷入了我自己设计的圆形噩梦! /叹息。

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)来导致失败...

我的目标是希望我的unittest确认已加载了EITHER json或simplejson。我怎么能这样做?

我已经考虑过在断言之前捕获“真实性”,然后只传递“真”或“假”,但这对于单元测试感觉不对,因为我认为这应该是单位测试的一部分而不是而不是解决方法(这是我的意见,也许你感觉不同)。例如,我曾想过做类似(python-esque pseduoish code)的事情:

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

self.assertTrue(_simplejsonLoaded or _jsonLoaded)

(我是正式单元测试的新手 - 所以,如果有什么东西看起来很疯狂,请告诉我。)

其他信息:

  • 我正在使用Python 2.6(出于工作原因 - 不能改变它)
  • Windows和Linux

我是

2 个答案:

答案 0 :(得分:0)

我认为你不需要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()

答案 1 :(得分:0)

嗯,问题是你是否真的关心你导入的特定库。当您导入simplejson as json,然后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")