2011-09-15 33 views
2

一个问题我继续“引导”我的测试。我的问题是what this guy has引导测试和使用Python测试发现

最上面的解决方案是关于创建“boostrap”脚本的。我认为我必须枚举所有要运行的测试,或者使用__all__关键字在__init__.py文件中使用测试清单。但是,我注意到most recent Python documentation on unittest不再谈论__all__了。

在2.7中,我们有一个名为 “发现”

python -m unittest discover 

python命令这工作,甚至更好。这是因为: 1)没有必要对鼻 2)没有必要进行测试表现

但它似乎并不有一种方法来“引导”

我需要使用另一个测试运行?一个允许引导和发现?

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

我需要引导的原因是this guy has。基本上,如果我直接运行测试,我的导入语句不能正常工作。我想从我的项目顶部执行我的测试套件,就像应用程序运行正常时一样。

毕竟,导入语句总是相对于它们的物理位置。 (顺便说一句,我认为这是Python的障碍)

定义:什么是Bootstrapping? Bootstrapping意味着我想在整个项目中运行任何测试之前进行一些设置。这就像我在整个项目级要求“测试设置”一样。

更新 Here is another posting about the same thing。使用这个2.7命令,我们可以避免鼻子。但是,如何添加引导?

+0

所以问题是,当你不在项目的顶部时,你想用某种方式来做发现+自举?这似乎是一个非常有限的用例,我只从我的项目顶部运行测试。 – djc

+0

我想我可能输错了。我想从我的项目顶部开始它 - 就像我正常运行我的应用程序一样。 – 010110110101

回答

3

我知道了!

使用我编写的一个脚本并将其命名为“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) 
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文件,这些聚合成一个额外test_suite,并运行:

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 
+0

您的回答描述了使用“全部”关键字“创建清单”的变体。我试图避免所有这些工作。我认为Python 2.7中新的“发现”功能是为了避免所有这些额外的工作。 – 010110110101

+0

我试图在Python 2.7中使用自动发现功能。 – 010110110101

+0

这很公平。我想我不明白你的问题是因为你想要单独运行每个测试而发生的。仅供参考,我通过将标志作为命令行参数传递,然后将它们从'sys.argv'中拉出来,以便可以选择性地导入测试。这允许一些像“不运行任何集成测试”这样的爱好者行为。 – Wilduck