Python单元测试与发现

55 投票
3 回答
60693 浏览
提问于 2025-04-16 01: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 这个变量,我能看到我的测试案例,但从文档上我搞不清楚一旦有了加载器对象该怎么处理。

3 个回答

27

根据你在命令行中使用 unittest2 的方式,特别是在 Python < 2.7 的情况下,我觉得你可能错过了 unittest2 在 PyPI 页面上的说明

注意

命令行使用

在 Python 2.7 中,你可以通过 python -m unittest <args> 来使用 unittest 的命令行功能(包括测试发现)。因为 unittest 是一个包,而在 Python 2.7 中可以用 python -m ... 来调用包的功能是新加入的,所以我们不能用这个方式来调用 unittest2。

相反,unittest2 提供了一个叫做 unit2 的脚本。命令行使用方法:

unit2 discover unit2 -v test_module

还有一个这个脚本的副本叫 unit2.py,它对 Windows 用户很有用,因为它是通过文件扩展名来判断用哪个程序来执行文件,而不是通过 shebang 行。以上这两个脚本都是通过 distutils 安装的。

试试这个 unit2 脚本吧,它是这个说明推荐给旧版 Python 的替代方案,用来替代 Python 2.7 的“将包作为主脚本运行”功能。如果你想从自己的代码中发现并运行测试,或许它的源代码也会对你有帮助。

60

一旦你找到了测试,你就可以用一个测试运行器来执行它们。

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

运行上面的代码会把测试结果显示在屏幕上。

91

我在运行 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):
    

撰写回答