2013-10-29 69 views
2

我在使用其他SO推荐导入simplejson /测试夹具测试,其内容如下:Python的单元测试,如果模块被加载

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.failUnlessunittest.assertTrue(我曾经尝试都),它会引发故障,并停止测试(它的失败,因为我对造成该故障只加载json而不是simplejson)...

我的目标是我希望我的单元测试能够确认是否加载了任何json或simplejson。我该怎么办?

我曾经想过在声明之前捕获“真实性”,然后只通过“True”或“False”,但这不适合单元测试,因为我认为这应该是单元测试的一部分而不是解决方法(这是我的观点,也许你感觉不一样)。例如,我曾想过做这样的事情(蟒式的pseduoish代码):

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

self.assertTrue(_simplejsonLoaded or _jsonLoaded) 

(我是新来的正式单元测试 - 所以,如果事情太疯狂了这里请让我知道)。

其他信息:

  • 即时通讯使用Python 2.6(因工作原因 - 不能更改)
  • Windows和Linux

+0

给予好评只是使用'圆形的噩梦,因为这是我自己设计的' – jramirez

+1

顺便说一句,你为什么就不能说assertTrue('simplejson 'in modules或'json'in modules)? – Himanshu

+0

@Himanshu,工作!我没有想到要那样做。 –

回答

0

我不t认为你需要在TestCase中尝试/除了东西

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() 
+0

这也适用!我知道这会是非常简单的事情,但我只是被抓住了,看起来不同,这显然不起作用。为什么使用'self.assert_'而不是'self.failUnless'或其他变体?而且,带有断言的消息增加了什么样的附加值?这是用于'鼻子'还是类似的应用程序? –

+0

我正在使用assert_,因为我为python 2.5编写测试,2.6它只是一种习惯,failUnless听起来不错。这些消息为测试添加值的方式与评论为源代码添加值的方式相同,更多信息位于需要的地方 – Vorsprung

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")