如何以一种我可以在一个命令中运行所有测试的方式组织python测试?

时间:2008-12-14 16:52:51

标签: python unit-testing python-nose

目前我的代码按以下树结构组织:

src/
    module1.py
    module2.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
        test_moduleA.py
        test_moduleB.py

module*.py个文件包含源代码且test_module*.py包含相关模块的TestCase

使用以下命令,我可以运行单个文件中包含的测试,例如:

$ cd src
$ nosetests test_filesystem.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.390s

OK

如何运行所有测试?我尝试使用nosetests -m 'test_.*',但它不起作用。

$cd src
$ nosetests -m 'test_.*'

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

由于

5 个答案:

答案 0 :(得分:12)

无论你是分开还是混合测试和模块都可能是一个品味问题,尽管我强烈建议将它们分开(设置原因,代码统计等)。

当您使用nosetests时,请确保所有带有测试的目录都是真正的包:

src/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
tests/
    __init__.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        test_moduleA.py
        test_moduleB.py

这样,您只需在顶级目录中运行nosetests,即可找到所有测试。您需要确保src/上有PYTHONPATH,否则所有测试都会因缺少导入而失败。

答案 1 :(得分:8)

如果它们都以test开头,则nosetest应该有效。 Nose会自动搜索以'test'开头的所有文件。

答案 2 :(得分:4)

我不知道测试,但您可以使用标准的unittest模块实现这一目标。您只需在根目录下创建一个test_all.py文件,然后导入所有测试模块。在你的情况下:

import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
    allsuites = unittest.TestSuite([test_module1.suite(), \
                                test_module2.suite(), \
                                subpackage1.test_moduleA.suite(), \
                                subpackage1.test_moduleB.suite()])

每个模块应该提供以下功能(例如,模块包含两个单元测试:Class1Class2):

def suite():
    """ This defines all the tests of a module"""
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Class1))
    suite.addTest(unittest.makeSuite(Class2))
    return suite
if __name__ == '__main__':
   unittest.TextTestRunner(verbosity=2).run(suite())

答案 3 :(得分:2)

这可能是一个备受争议的主题,但我建议您将测试与模块分开。设置这样的东西......

使用setup.py将这些安装到系统路径中(或者您可以修改环境变量以避免需要“安装”步骤。)

foo/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py

现在任何地方的任何python脚本都可以访问这些模块,而不是依赖于在本地目录中查找它们。把你的测试全部放在这边:

tests/
    test_module1.py
    test_module2.py
    test_subpackage1_moduleA,py
    test_subpackage2_moduleB.py

我不确定你的nosetests命令,但是现在你的测试都在同一个目录中,编写一个简单地导入同一目录中所有其他测试的包装脚本变得容易得多。或者如果那是不可能的,你至少可以通过一个简单的bash循环来逐个获取测试文件:

#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
    nosetests -m $TEST_SCRIPT
done

答案 4 :(得分:0)

我会给Testoob个答案。

在单个文件中运行测试就像Nose:

testoob test_foo.py

要在许多文件中运行测试,您可以使用Testoob收集器创建套件(在每个子包中)

# src/subpackage?/__init__.py
def suite():
  import testoob
  return testoob.collecting.collect_from_files("test_*.py")

# src/alltests.py
test_modules = [
    'subpackage1.suite',
    'subpackage2.suite',
]

def suite():
    import unittest
    return unittest.TestLoader().loadTestsFromNames(test_modules)

if __name__ == "__main__":
    import testoob
    testoob.main(defaultTest="suite")

我没有尝试过您的特定情况。