引导测试与使用Python测试发现
我一直在遇到一个问题,就是“引导”我的测试。
我遇到的问题正是这个人所说的。
最好的解决方案提到了创建一个“引导”脚本。我想我需要列出所有要运行的测试,或者在__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 个回答
我来分享一下我的做法,我觉得效果挺不错的。假设你有一个像这样的文件/目录结构:
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
我明白了!
我写了一个脚本,叫做“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)