引导测试与使用Python测试发现

3 投票
2 回答
2204 浏览
提问于 2025-04-17 02:22

我一直在遇到一个问题,就是“引导”我的测试。

我遇到的问题正是这个人所说的

最好的解决方案提到了创建一个“引导”脚本。我想我需要列出所有要运行的测试,或者在__init__.py文件中使用__all__关键字来使用测试清单。不过,我注意到最新的Python文档中不再提到__all__了。

在2.7版本中,我们有一个叫“发现”的python命令。

python -m unittest discover

这个方法效果更好。因为: 1) 不需要Nose 2) 不需要测试清单

但似乎没有办法进行“引导”。

我需要使用另一个测试运行器吗?一个既支持引导又支持发现的?

我需要用py.test吗?
http://pytest.org/

我需要引导的原因是因为这个人遇到的问题。基本上,如果我直接运行测试,我的导入语句就无法正常工作。我想从项目的顶层执行我的测试套件,就像应用程序正常运行时那样。

毕竟,导入语句总是相对于它们的物理位置。(顺便说一下,我觉得这在Python中是个障碍)

定义:什么是引导? 引导意味着我想在整个项目中运行任何测试之前做一些设置。这就像我在请求一个“项目级别的测试设置”。

更新 这里还有一个关于同样问题的帖子。使用这个2.7命令,我们可以避免使用Nose。但是,如何添加引导呢?

2 个回答

0

我来分享一下我的做法,我觉得效果挺不错的。假设你有一个像这样的文件/目录结构:

main_code.py
run_tests.py
    /Modules
        __init__.py
        some_module1.py
        some_module2.py
    /Tests
        __init__.py
        test_module1.py
        test_module2.py

你可以很容易地组织你的 run_tests.py 文件来启动测试。首先,每个包含测试的文件(比如 test_module1.py 等)都应该实现一个函数,这个函数用来生成测试套件。大概是这样的:

def suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Test_Length))
    suite.addTest(unittest.makeSuite(Test_Sum))
    return suite

放在你的测试代码的最后面。然后,在 run_tests.py 文件中,你把这些测试套件聚合到一个额外的测试套件中,并运行它:

import unittest
import Tests.test_module1 as test_module1
import Tests.test_module2 as test_module2

module1_test_suite = test_module1.suite()
module2_test_suite = test_module2.suite()

aggregate_suite = unittest.TestSuite()
aggregate_suite.addTest(module1_test_suite)
aggregate_suite.addTest(module2_test_suite)

unittest.TextTestsRunner(verbosity = 2).run(aggregate_suite

最后,要运行所有这些测试,只需在命令行中输入:

python run_tests.py
4

我明白了!

我写了一个脚本,叫做“runtests.py”,把它放在我的项目根目录下。这样我就能“引导”一些初始化代码,并且使用发现功能。太棒了!

在我的情况下,“引导”代码就是下面这两行:

import sys
sys.path.insert(0, 'lib.zip')

谢谢!

#!/usr/bin/python

import unittest
import sys
sys.path.insert(0, 'lib.zip')

if __name__ == "__main__":
    all_tests = unittest.TestLoader().discover('.')
    unittest.TextTestRunner().run(all_tests)

撰写回答