Python unittest/测试夹具测试模块是否已加载

4

我正在使用另一个SO推荐的导入simplejson的方法,如下所示:

try:
    import simplejson as json
except ImportError:
    import json

然而,在编写我的单元测试以查看是否已导入“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.failUnless 或者 unittest.assertTrue(我尝试了两种方法),它会引发失败并停止测试(由于我只加载了 json 而不是 simplejson,所以测试失败)...

我的目标是希望我的 unittest 可以确认是否已加载了 json 或 simplejson。我应该如何做?

我考虑过在断言之前捕获“真实性”,然后只传递“True”或“False”,但这在单元测试中感觉不太对,因为我认为这应该是 unittest 的一部分,而不是一个变通方法(这是我的看法,也许您有不同的看法)。例如,我曾考虑过这样做(类似 Python 伪代码):

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

self.assertTrue(_simplejsonLoaded or _jsonLoaded)

我刚开始接触正式的单元测试,如果这里有什么看起来很奇怪的地方,请告诉我。

其他信息:

  • 我使用Python 2.6(因为工作原因,不能更改)
  • 在Windows和Linux上运行

2
因为使用了“我自己设计的循环噩梦”,所以点赞。 - jramirez
2
顺便问一下,为什么你不能说assertTrue('simplejson' in modules or 'json' in modules)? - Himanshu
@Himanshu,太好了!我没想到那样做。 - Justin Carroll
2个回答

1

好的,问题是你是否真的关心你导入了哪个特定的库。当你导入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")

1

我认为在测试用例中不需要使用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()

那也可以!我知道这一定是某些非常简单的东西,但我只是以不同的方式看待它,显然这并不起作用。为什么要使用self.assert_而不是self.failUnless或其他变体?断言中添加消息有什么附加价值?这是用于Nose或类似应用程序吗? - Justin Carroll
我在编写Python 2.5、2.6的测试时使用assert_,这只是一种习惯,failUnless听起来也不错。消息可以增加测试的价值,就像注释可以为源代码增加价值一样,在需要的地方提供更多信息。 - Vorsprung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接