【发布时间】:2012-08-27 16:17:38
【问题描述】:
我正在为大型项目使用金字塔框架,我发现将所有测试都放在一个 tests.py 文件中很麻烦。所以我决定创建一个包含我的测试文件的目录。问题是,我不知道如何告诉金字塔从这个目录运行我的测试。
我正在使用 python setup.py test -q 运行测试。
但是,在我将测试移动到测试目录之后,这当然不起作用。怎么做才能让它发挥作用?
【问题讨论】:
我正在为大型项目使用金字塔框架,我发现将所有测试都放在一个 tests.py 文件中很麻烦。所以我决定创建一个包含我的测试文件的目录。问题是,我不知道如何告诉金字塔从这个目录运行我的测试。
我正在使用 python setup.py test -q 运行测试。
但是,在我将测试移动到测试目录之后,这当然不起作用。怎么做才能让它发挥作用?
【问题讨论】:
首先,您需要通过在其中创建__init__.py 来确保tests 不仅仅是一个目录,而是一个Python 包。
您还需要确保将 tests 包中的模块命名为 test_something.py。
大多数测试运行者,作为他们测试发现的一部分,寻找一个名为 tests 的模块或包,该包中的模块以 test_ 开头,并期望测试方法的方法名称(在 TestCase 子类上)开始test_。
unittest 模块将测试运行器描述为:
测试运行器是一个编排测试执行的组件 并将结果提供给用户。跑步者可以使用图形 接口,文本接口,或返回一个特殊值来表示 执行测试的结果。
有很多不同的测试框架和测试运行器,大多数以某种方式扩展unittest 并寻找unittest.TestCase 子类。他们可能会做不同类型的test discovery,以不同的方式呈现结果,或者在运行测试时收集code coverage。
至于相对导入:你真的应该尽量避免这些。它们使移动代码变得更加困难(正如您刚刚注意到的)并降低了导入的可读性(从哪里导入什么代码?)。只需使用from myproject.views import my_view - 事情的位置就更清楚了
【讨论】:
我终于找到了方法。我刚刚创建了名为测试的目录,将我的测试放入其中并创建了空文件__init__.py。我需要修复相对导入,否则会出现奇怪的错误,例如:
AttributeError: 'module' object has no attribute 'tests'
我不太明白发生了什么,这里的nosetest 角色是什么,但它确实有效。
如果有人能够更深入地解释这个问题,那就太好了。
【讨论】:
尝试使用nose
http://nose.readthedocs.org/en/latest/
如果您的所有测试文件都以“Test”开头,nosetests 应该将它们全部提取并运行它们。
【讨论】: