【问题标题】:nose2 vs nose test discovery (nose2 not finding tests)鼻子 2 与鼻子测试发现(鼻子 2 没有找到测试)
【发布时间】:2013-05-14 14:37:09
【问题描述】:

我刚刚开始了一个 python 项目,我正在尝试不同的测试框架。 我遇到的问题是nose2 没有找到我的测试:

$nose2 --verbose


在 0.000 秒内运行 0 次测试

好的

当鼻子测试找到它们时

$ nosetests --collect-only

..................................


在 0.004 秒内运行 33 次测试

好的

否则,我可以使用相同目录中的 nose2 执行单个测试:

$nose2 myproj.client.test.mypkg.mymodule_test

.


在 0.007 秒内运行 1 次测试

好的

myproj.client.test.mypkg.mymodule_test 是这样的:

'''
Created on 18/04/2013

@author: julia
'''
from unittest import TestCase, main
import os
from myproj.client.mymodule import SUT
from mock import Mock
import tempfile

class SUTTest(TestCase):
    def setUp(self):
        self.folder = tempfile.mkdtemp(suffix='myproj')
        self.sut = SUT(self.folder, Mock())
        self.sut.init()

    def test_wsName(self):
        myfolder = os.path.join(self.folder, 'myfolder')
        os.mkdir(myfolder)
        self.sut.change_dir(myfolder)
        self.assertEquals(self.SUT.name, 'myfolder')

if __name__ == "__main__":
    main()

我一直在查看文档,但找不到可能的原因。

在 MacOs 10.8.3 上运行 python 2.7.3

【问题讨论】:

  • 尝试使用--verbose 选项运行nose2 - 你应该知道它为什么会跳过你的测试。
  • 相同结果:/(无详细输出)
  • 你能列出一些你的测试代码吗?
  • @MichaelJCox,好的,已编辑

标签: python-2.7 nose nosetests


【解决方案1】:

除了 MichaelJCox 的回答之外,另一个问题是,默认情况下,nose2 正在寻找以“test”开头的测试文件名。换句话说,'testFilePattern == test*.py'(您可以在nose2/session.py 中找到它)。

您可以通过两种方式解决此问题:

在配置文件中指定不同的测试文件模式:

在项目的某处创建一个配置文件(基本目录是一个好地方,或者你将运行nose2的任何地方)。 nose2 将查找并加载任何名为 nose2.cfgunittest.cfg 的文件。

将此添加到该配置文件中。

[unittest]
test-file-pattern=*.py

现在再次运行nose2,它会找到那些旧的测试用例。我不确定这是否会对nose2的性能产生不利影响或什么,但到目前为止对我来说还不错。

重命名您的测试文件,使其以 test 开头。

例如,如果您有这样的项目:

/tests/
      __init__.py
      fluxcapacitor.py

/tests/fluxcapacitor.py 重命名为/tests/test_fluxcapacitor.py,现在nose2 将再次在fluxcapacitor.py 中找到测试。

更详细的输出

最后,这与您的问题无关,但将来可能会有所帮助:如果-verbose 没有输出足够的信息,您还可以传递以下附加参数--log-level debug 以获得更多输出。

【讨论】:

    【解决方案2】:

    看起来nose2 需要三件事中的一件事才能找到测试:

    1. 您的测试需要在包中(只需在测试结构的每个目录中创建 __init__.py 文件)
    2. 您需要一个名为“test”的目录,该目录位于运行nose2 的同一目录中
    3. 需要在同一目录下

    nose2 的 _discovery 方法(在nose2.plugins.loader.discovery.py 中)显式查找名为“test”的目录或作为包的目录(如果它不只是从同一目录中获取您的测试文件):

                if ('test' in path.lower()
                    or util.ispackage(entry_path)
                    or path in self.session.libDirs):
                    for test in self._find_tests(event, entry_path, top_level):
                        yield test
    

    如果我设置一个类似的测试文件(称为tests.py)并在同一目录中运行nose2,它会给我1个测试OK。

    如果我创建一个名为“test”的目录,将文件移动到该目录,然后从顶层目录运行 nose2,我会收到一条错误消息,指出它无法导入我的 py 文件。在该目录中创建 __init__.py 可修复该错误。

    如果我创建一个目录“blah”并将文件移到那里,那么我会看到您在上面列出的问题:

    Ran 0 tests in 0.000s
    
    OK
    

    但是,如果我随后在目录 'blah' 中创建一个 __init__.py,则测试会运行,我会找到我的 1 个测试并确定。

    【讨论】:

    • 我的所有目录中都有 init .py 文件,但是是的,测试文件夹不在顶级目录中,而是在每个包中。但是,如果我进入 myproj/client(其中包含一个测试包)并在那里执行nose2,我仍然会得到 0 个测试,但无论如何谢谢,我会坚持使用nosetest
    • init.py 是我的解决方案
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多