【问题标题】:Python unittest and discoveryPython 单元测试和发现
【发布时间】:2011-03-18 17:54:36
【问题描述】:

我有目录,其中包含命名如下的文件: test_foo.py

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

我愿意

  1. 从命令行运行目录中的所有测试。我正在使用unittest2,因为我们正在运行 Python 2.5.1。从这些目录之一,我尝试在命令行中输入:

     python -m unittest2 discover -p 'test_*.py'
    

    和几个不同的变体。我没有错误,但没有任何反应。我希望该目录中所有测试用例中的所有测试都能运行并获得结果。

  2. 我还尝试在执行此操作的目录中添加一个脚本:

     loader = unittest2.TestLoader()
     t = loader.discover('.')
    

    如果我打印 t 变量,我可以看到我的测试用例,但从文档中我无法弄清楚一旦我拥有加载器对象该怎么做。

【问题讨论】:

    标签: python unit-testing discovery


    【解决方案1】:

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

    1. 确保所有文件/目录都以test 开头。请不要使用test-something.py,因为那不是有效的 Python 模块名称。使用test_something.py

    2. 如果您将测试放在子目录中(例如test/),请确保创建一个test/__init__.py 文件,以便python 将该目录视为一个包。

    3. 所有类测试用例定义必须扩展unittest.TestCase。例如,

      class DataFormatTests(unittest.TestCase)
      
    4. 所有测试用例方法定义必须以test_开头

       def test_data_format(self):
      

    【讨论】:

    • 有没有办法通过 unittest discover 添加引导脚本?
    • 也是方法名,即test_does_something(self):
    • 对我来说,创建tests/__init__.py 可以解决问题。
    【解决方案2】:

    一旦您发现了测试,您就可以使用测试运行器来运行它们。

    对于 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)
    

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

    【讨论】:

    • 这是我一直在寻找的,也是对原始问题最直接的答案。不过在 2.7 中看起来略有不同; test_loader = unittest.defaultTestLoader.discover( '.' );然后test_runner = unittest.TextTestRunner();然后test_runner.run( test_loader ) 你很好。
    • 如果您需要以编程方式调用测试运行程序,例如从自定义脚本或Command 实例,这是推荐的方法。
    【解决方案3】:

    鉴于您尝试在 Python < 2.7 的命令行中使用 unittest2,我认为您可能错过了 the note on the unittest2 PyPI page

    注意

    命令行使用

    在 Python 2.7 中,您调用 unittest 命令行功能(包括测试 发现)与python -m unittest <args>。由于 unittest 是一个包,并且 调用包的能力 python -m ... 在 Python 2.7 中是新的,我们 不能为 unittest2 执行此操作。

    取而代之的是 unittest2 带有一个脚本 单元2。命令行用法:

    unit2 discover unit2 -v test_module
    

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

    尝试使用unit2 脚本,该脚本推荐作为旧版 Python 的替代方案,以替代 Python 2.7 的“将包作为主脚本运行”功能。如果您愿意的话,也许它的来源也可以帮助您准确了解如何从您自己的代码中发现和运行测试。

    【讨论】:

    • 谢谢亚历克斯!我错过了那张纸条。现在它可以工作了。你用过鼻子吗?你推荐它吗?顺便说一句,很棒的书,谢谢你写它们。
    • @Aaron,不客气!是的,我过去很高兴地使用过鼻子(我还不知道我是用新的单元测试功能替换还是补充它——我是对后者还不是很熟悉!)。
    猜你喜欢
    • 2011-12-05
    • 2020-09-05
    • 2018-06-06
    • 2011-08-23
    • 2015-06-25
    • 2019-07-17
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多