16

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

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相关模块的 s。

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

$ 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

谢谢

4

5 回答 5

15

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

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

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,否则所有测试都将由于缺少导入而失败。

于 2008-12-14T18:41:31.313 回答
8

如果他们都开始,test那么就nosetest应该工作。Nose 会自动搜索以“test”开头的任何文件。

于 2008-12-16T23:28:39.533 回答
6

我不知道鼻子测试,但你可以用标准的单元测试模块来实现。你只需要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())
于 2008-12-15T08:15:09.767 回答
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
于 2008-12-14T17:37:18.680 回答
0

我会给出一个Testoob的答案。

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

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

我没有尝试过你的具体情况。

于 2008-12-14T18:32:47.073 回答