鼻子无法在ubuntu中找到测试

时间:2009-09-21 21:55:22

标签: python nose

为什么Nose无法在Ubuntu 9.04中找到测试?

我正在使用带有python 2.5.4的鼻子0.11.1 我只有在明确指定文件名时才能运行测试。 如果我没有指定文件名,只需说明 0测试

同一个项目在我的Mac上运行测试很好,所以我很难过!

7 个答案:

答案 0 :(得分:101)

总是让我nose的另一件事是它不会在可执行文件中运行测试。我不确定为什么会在Mac / Ubuntu上产生影响,但值得一试。

确保脚本没有以某种方式在Mac上获得chmod +x d ...如果他们这样做,请使用chmod -x $(find tests/ -name '*.py')修复它们。

答案 1 :(得分:61)

这种行为几乎肯定是因为你的文件没有按照nose的测试匹配行为命名。来自the nose docs

  

nose从其工作目录中找到的python源文件,目录和包中自动收集测试(默认为当前工作目录)。 任何与testMatch正则表达式匹配的python源文件,目录或包(默认情况下:(?:^ | [b _.-])[Tt] \ test)将被收集作为测试(或来源)收集测试。)

重点是我的。

一些匹配的示例名称:

  • TestFoo.py
  • Foo-Test.py
  • Foo_Test.py
  • Foo.Test.py(请注意,这个会尝试导入Foo,如果不能则会引发异常)

看起来像的名称,但它实际上不匹配:

  • FooTest.py

如果你只是重命名你的文件,你应该很高兴。

<小时/> 更新:我无法从您发布的详细信息中判断,但是您的测试目录可能缺少__init__.py个文件?

  

...确保您的“测试”目录实际上是模块(它们有一个空的__init__.py文件)。

答案 2 :(得分:39)

我遇到了同样的问题。我的测试在Windows中运行得很好,但在Ubuntu中没有。

在Ubuntu中,如果你运行:

nosetests -vv --collect-only

你可能会看到它正在跳过你的测试文件,因为它是一个可执行文件: _Tools / LintControlFiles / test_HgLint.py 是可执行的;跳过

为了让人们考虑可执行文件,请按以下方式运行:

nosetests --exe

答案 3 :(得分:17)

我可以确认,正如@ david-wolever所说,他们不能在Ubuntu上可执行。 运行

nosetests -vv --collect-only 

查看有关检查过哪些文件的完整详细信息。

答案 4 :(得分:10)

如果您正在从目录运行测试,那么有些相关的内容,即

nosetests ... tests/

其中tests是我的测试文件夹的名称,并且在其中一个.py模块中有单独的python测试函数...你的函数必须从'test'开始,用于nosetests以识别你想要的测试跑步。

例如:

 def test_something():
    ...

中执行此目录时,

nosetests将运行此函数

 def somethin_to_test():
    ...

不会。

答案 5 :(得分:2)

使用-all-modules,它会找到所有测试。

nosetests --all-modules ./tests

答案 6 :(得分:1)

查看了鼻子的来源,特别是selector.py文件,如果你看看发生了什么,

https://github.com/nose-devs/nose/blob/master/nose/selector.py#L129

在检查我们是否wantFile时,会调用self.matches,然后对regex进行match搜索,这是您传递给testMatch的内容。 1}}。

当您稍后检查(以及整个文件)

时,会出现问题

https://github.com/nose-devs/nose/blob/master/nose/selector.py#L152

它再次针对wantFunction运行相同类型的检查。

这意味着,如果你的包,容器pyfile和实际的测试类/函数有不同的结构,你将不得不创建一个疯狂的复杂正则表达式来匹配每个阶段的结构。

对我来说,当我了解到这一点时,我选择使用一个共同位来为我的包,容器和测试函数添加前缀,即

setests ├── __init__.py ├── setest_area1.py └──── def setest_someblock(): ...

然后我的nose命令就像,

nose --testMatch="setest"

然后按照我期望的方式过滤。