Python单元测试和发现

Python单元测试和发现,python,unit-testing,discovery,Python,Unit Testing,Discovery,我有目录,其中包含的文件名如下: test\u foo.py 每个文件都是一个测试用例 我想 从命令行运行目录中的所有测试。我使用的是unittest2,因为我们运行的是Python 2.5.1。从其中一个目录中,我尝试在命令行中键入: python -m unittest2 discover -p 'test_*.py' 还有几个不同的变种。我没有出错,但什么也没发生。我希望该目录中所有测试用例中的所有测试都能运行并获得结果 我还尝试在执行此操作的目录中使用脚本: loader = u

我有目录,其中包含的文件名如下:
test\u foo.py

每个文件都是一个测试用例

我想

  • 从命令行运行目录中的所有测试。我使用的是
    unittest2
    ,因为我们运行的是Python 2.5.1。从其中一个目录中,我尝试在命令行中键入:

     python -m unittest2 discover -p 'test_*.py'
    
    还有几个不同的变种。我没有出错,但什么也没发生。我希望该目录中所有测试用例中的所有测试都能运行并获得结果

  • 我还尝试在执行此操作的目录中使用脚本:

     loader = unittest2.TestLoader()
     t = loader.discover('.')
    
    如果我打印
    t
    变量,我可以看到我的测试用例,但是从文档中,我不知道一旦我有了它,该如何处理loader对象


  • 鉴于您试图在Python
    <2.7
    上从命令行使用
    unittest2
    ,我认为您可能错过了:

    命令行使用

    在Python2.7中,调用unittest 命令行功能(包括测试) 使用
    python-m unittest
    发现。因为unittest是一个包 使用
    python-m…
    在python2.7中是新的,我们 无法为unittest2执行此操作

    相反,unittest2附带了一个脚本 第二单元。命令行用法:

    unit2 discover unit2 -v test_module
    
    还有这个脚本的副本 名为
    unit2.py
    ,对Windows很有用 它使用文件扩展名而不是 射棒线要确定什么 用于执行文件的程序。两者 这些脚本由安装 distutils


    尝试一下
    unit2
    脚本,本说明建议将其作为Python 2.7的“以主脚本形式运行包”功能的替代方案。如果您愿意这样做的话,那么它的源代码也可能有助于了解如何从自己的代码中发现和运行测试。

    我在运行
    python-m unittest discover
    时遇到了同样的问题。这里有一个很好的清单来验证您的设置
    Nose
    对于允许的配置更灵活,但不一定更好

  • 确保所有文件/目录都以
    test
    开头。不要使用
    test something.py
    ,因为这不是有效的Python模块名称。使用
    测试某物.py

  • 如果要将测试放在子目录中(例如,
    test/
    ),请确保创建一个
    test/\uuuu init\uuuuu.py
    文件,以便python将该目录视为一个包

  • 所有类测试用例定义必须是extend
    unittest.TestCase
    。比如说,

    class DataFormatTests(unittest.TestCase)
    

  • 一旦发现测试,就可以使用测试运行程序运行它们

    对于Python 2:

    import unittest2
    loader = unittest2.TestLoader()
    tests = loader.discover('.')
    testRunner = unittest2.runner.TextTestRunner()
    testRunner.run(tests)
    
    对于Python 3:

    import unittest
    loader = unittest.TestLoader()
    tests = loader.discover('.')
    testRunner = unittest.runner.TextTestRunner()
    testRunner.run(tests)
    

    运行上述代码将把测试结果打印到标准输出。

    谢谢Alex!我错过了那张纸条。现在它开始工作了。你用过鼻子吗?你推荐它吗?非常好的书,顺便说一句,谢谢你写这些书。@Aaron,不客气!是的,我过去很高兴使用过nose(我还不知道我是否会用新的unittest功能替换或补充它——我还不太熟悉后者!)。有没有办法用unittest discover添加引导脚本?还有方法名,即
    test\u做些什么(自己):
    为我,创建
    tests/\uuuuu init\uuuuu.py
    解决了这个问题。这是我一直在寻找的问题,也是对原始问题最直接的答案。但在2.7版本中看起来略有不同
    test_loader=unittest.defaultTestLoader.discover('.')
    ;然后
    test\u runner=unittest.TextTestRunner()
    ;然后
    test\u runner.run(test\u loader)
    就可以了。如果您需要以编程方式调用测试运行程序,例如从自定义脚本或
    命令
    实例调用测试运行程序,建议使用这种方法。