【问题标题】:Bootstrapping tests and using Python test discovery引导测试和使用 Python 测试发现
【发布时间】:2011-11-17 22:37:19
【问题描述】:

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

我遇到的问题正是what this guy has

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

在 2.7 中,我们有名为“discovery”的 python 命令

python -m unittest discover

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

但它似乎没有办法“引导”

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

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

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

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

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

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

【问题讨论】:

  • 所以问题是,当您不在项目的顶端时,您想通过某种方式进行发现 + 引导?这似乎是一个非常有限的用例,我只从我的项目顶部运行测试。
  • 我想我可能打错了。我确实想从我的项目的顶部开始它——就像我正常运行我的应用程序一样。

标签: python unit-testing


【解决方案1】:

我明白了!

使用我编写的这个脚本并将其命名为“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)

【讨论】:

    【解决方案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 文件中,将它们聚合到一个额外的 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
    

    【讨论】:

    • 您的回答描述了使用“all”关键字的“创建清单”的变体。我试图避免所有这些工作。我认为 Python 2.7 中新的“发现”功能是为了让我们避免所有这些额外的工作。
    • 我正在尝试使用 Python 2.7 中的自动发现功能。
    • 这很公平。我想我不明白您的问题是因为您希望能够单独运行每个测试。仅供参考,我通过将标志作为命令行参数传递,然后将它们从sys.argv 中拉出,这样我就可以有选择地导入测试。这允许一些更花哨的行为,例如“不运行任何集成测试”。
    猜你喜欢
    • 2011-12-05
    • 2011-03-18
    • 2020-01-23
    • 1970-01-01
    • 2020-09-05
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多