【问题标题】:Is it possible to run all unit test?是否可以运行所有单元测试?
【发布时间】:2015-07-22 07:37:03
【问题描述】:

我有两个具有两个不同类的模块及其对应的测试类。

 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 发行版。

【问题讨论】:

  • 我会将测试文件重命名为“test_foo.py”格式,并在测试目录中运行nosetestsnose 将自动发现所有测试文件和测试类。

标签: python unit-testing python-unittest


【解决方案1】:

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

python -m unittest discover <module_name>

上面的具体例子,运行就够了

python -m unittest discover .

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

【讨论】:

  • 迄今为止最好、最简洁的方法在这里。好提示,@mcguip
【解决方案2】:

您可以创建一个 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 选项..

【讨论】:

    【解决方案3】:

    我认为您正在寻找的是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. 否则,逐一加载请求的测试

    【讨论】:

      【解决方案4】:

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

      python -m unittest
      

      正如doc 中提到的,“当不带参数执行时,测试发现将启动”

      【讨论】:

        【解决方案5】:

        使用PyDev 右键单击​​Eclipse 中的文件夹并选择“运行方式-> Python 单元测试”。这将运行该文件夹中的所有测试(测试文件和方法的名称必须以“test_”开头。)

        【讨论】:

          【解决方案6】:

          您正在寻找nosetests

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

          您还需要遵循PEP 328 约定来使用鼻子。我不将 IDE 与 Python 一起使用,但您的 IDE 可能已经遵循它——只需阅读 PEP 并检查即可。

          使用 PEP 328 目录/包结构,您可以运行单个测试

          nosetests path.to.class_test
          

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

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

          【讨论】:

            猜你喜欢
            • 2017-07-07
            • 1970-01-01
            • 1970-01-01
            • 2013-07-29
            • 2017-12-19
            • 1970-01-01
            • 1970-01-01
            • 2017-09-27
            • 2013-07-08
            相关资源
            最近更新 更多