是否可以运行所有单元测试?

时间:2015-07-22 07:37:03

标签: python unit-testing python-unittest

我有两个模块,有两个不同的类及相应的测试类。

 foo.py
 ------
 class foo(object):
     def fooMethod(self):
         // smthg

 bar.py
 ------
 class bar(object):
     def barMethod(self):
         // smthg

 fooTest.py
 ------
 class fooTest(unittest.TestCase):
     def fooMethodTest(self):
         // smthg

 barTest.py
 ------
 class barTest(unittest.TestCase):
     def barMethodTest(self):
         // smthg

在任何测试和源模块,文件中,我删除 if __name__ == "__main__":,因为增加了一致性并遵守面向对象的意识形态。

与Java单元测试一样,我正在寻找创建一个模块来运行所有单元测试。例如,

 runAllTest.py
 -------------
 class runAllTest(unittest.TestCase):
    ?????

 if __name__ == "__main__":
    ?????

我找了搜索引擎,但没有找到任何教程或示例。有可能这样做吗?为什么?或者怎么样?

注意:我在Windows机器上使用eclipse和pydev发布。

6 个答案:

答案 0 :(得分:4)

您可以创建TestSuite并在其if __name__ == '__main__'块中运行所有测试:

import unittest   

def create_suite():
    test_suite = unittest.TestSuite()
    test_suite.addTest(fooTest())
    test_suite.addTest(barTest())
    return test_suite

if __name__ == '__main__':
   suite = create_suite()

   runner=unittest.TextTestRunner()
   runner.run(suite)

如果您不想手动创建测试用例,请查看this quesiton/answer,它基本上会动态创建测试用例,或使用unittest模块的某些功能,如test discovery功能和command line选项..

答案 1 :(得分:3)

在运行基于内置python unittest模块的单元测试时,在项目的根目录下运行

python -m unittest discover <module_name>

对于上面的特定示例,足以运行

python -m unittest discover .

https://docs.python.org/2/library/unittest.html

答案 2 :(得分:1)

我认为你要找的是TestLoader。有了这个,您可以加载特定的测试或模块或加载给定目录下的所有内容。另外,this帖子有一些使用TestSuite实例的有用示例。

编辑:我通常在test.py中的代码:

if not popts.tests:
    suite = unittest.TestLoader().discover(os.path.dirname(__file__)+'/tests')
    #print(suite._tests)

    # Print outline
    lg.info(' * Going for Interactive net tests = '+str(not tvars.NOINTERACTIVE))

    # Run
    unittest.TextTestRunner(verbosity=popts.verbosity).run(suite)
else:
    lg.info(' * Running specific tests')

    suite = unittest.TestSuite()

    # Load standard tests
    for t in popts.tests:
        test = unittest.TestLoader().loadTestsFromName("tests."+t)
        suite.addTest(test)

    # Run
    unittest.TextTestRunner(verbosity=popts.verbosity).run(suite)

有两件事:

  1. 如果-t标志(测试)不存在,请查找并加载目录
  2. 中的所有测试
  3. 否则,逐个加载所请求的测试

答案 3 :(得分:1)

PyDev右键单击Eclipse中的文件夹,然后选择“Run as-&gt; Python unit-test”。这将运行该文件夹中的所有测试(测试文件和方法的名称必须以“test _”开头。)

答案 4 :(得分:1)

我认为您可以在测试文件所在的文件夹下运行以下命令:

python -m unittest

doc中所述,“在没有参数的情况下执行Test Discovery”

答案 5 :(得分:0)

您正在寻找nosetests

可能需要重命名您的文件;我不确定用于查找测试文件的模式鼻子,但我个人使用*_test.py。可以指定项目用于测试文件名的自定义模式,但我记得无法使其工作,所以我最终重命名了我的测试。

您还需要遵循PEP 328惯例才能使用鼻子。我不使用带有Python的IDE,但你的IDE可能已经遵循它了 - 只需阅读PEP并检查。

使用PEP 328目录/包结构,您可以将单个测试作为

运行
nosetests path.to.class_test

请注意,我使用的是点,而不是通常的目录分隔符(/\)。

要运行所有测试,只需在项目的根目录中调用nosetests即可。