关于单元测试:引导测试和使用Python测试发现

Bootstrapping tests and using Python test discovery

一个问题,我继续让它"引导"我的测试。

我的问题正是这个人的问题。

最重要的解决方案是创建一个"boostrap"脚本。我假定随后必须枚举所有要运行的测试,或者使用__all__关键字在__init__.py文件中使用测试清单。但是,我注意到最近的关于UnitTest的python文档不再讨论__all__

在2.7中,我们使用了名为"discovery"的python命令

1
python -m unittest discover

效果更好。因为:1)不需要鼻子2)不需要测试清单

但它似乎没有办法"引导"

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

我需要做PY测试吗?网址:http://pytest.org/

我需要自举的原因是这个家伙有问题。基本上,如果我直接运行测试,我的import语句就不能正常工作。我想从我的项目顶部执行我的测试套件,就像程序正常运行时一样。

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

定义:什么是引导?引导意味着在整个项目中运行任何测试之前,我想做一些设置。这有点像我在整个项目级别要求一个"测试设置"。

更新这是关于同一件事的另一个帖子。使用这个2.7命令,我们可以避开鼻子。但是如何添加引导呢?


我得到了它!

使用我编写并称之为"runtests.py"并放置在项目根目录中的这一个脚本,我能够"引导"运行一些初始化代码并使用发现。呜呜!

在我的例子中,"bootstrap"代码是两行代码,它们表示:

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

谢谢!

1
2
3
4
5
6
7
8
9
#!/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)

这就是我所做的,我认为它工作得很好。对于类似的文件/目录结构:

1
2
3
4
5
6
7
8
9
10
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等)都应该实现一个生成测试套件的函数。类似:

1
2
3
4
5
def suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Test_Length))
    suite.addTest(unittest.makeSuite(Test_Sum))
    return suite

在测试代码的末尾。然后,在run_tests.py文件中,将这些集合到一个额外的test_套件中,并运行:

1
2
3
4
5
6
7
8
9
10
11
12
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

然后从命令行运行所有这些测试,只需运行

1
python run_tests.py