55

Nose 是否有任何理由无法在 Ubuntu 9.04 中找到测试?

我将鼻子 0.11.1 与 python 2.5.4 一起使用。
只有当我明确指定文件名时,我才能运行测试。如果我没有指定它刚才说的文件名,0 tests

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

4

7 回答 7

110

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

确保脚本没有以某种方式chmod +x在 Mac 上被 'd... 如果有,请使用chmod -x $(find tests/ -name '*.py').

于 2009-10-16T18:57:16.703 回答
63

这种行为几乎可以肯定是因为您的文件没有按照鼻子的测试匹配行为命名。从鼻子文档

鼻子从其工作目录(默认为当前工作目录)中找到的 python 源文件、目录和包自动收集测试。任何与 testMatch 正则表达式匹配的 python 源文件、目录或包(默认情况下:(?:^|[b_.-])[Tt]est)都将被收集为测试(或用于收集测试的源)。

重点是我的。

一些匹配的示例名称:

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

一个看起来会匹配但实际上不匹配的名称:

  • FooTest.py

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


更新:我无法从您发布的详细信息中看出,但也许您的测试目录缺少它们的__init__.py文件?

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

于 2009-09-22T02:24:24.547 回答
47

我有同样的问题。我的测试在 Windows 中运行良好,但在 Ubuntu 中却不行。

在 Ubuntu 中,如果您运行:

nosetests -vv --collect-only

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

为了让鼻子考虑可执行文件,像这样运行它:

nosetests --exe
于 2011-09-14T01:34:38.120 回答
19

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

nosetests -vv --collect-only 

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

于 2011-04-13T05:22:34.840 回答
11

一些相关的,如果你在一个目录下运行测试,即

nosetests ... tests/

其中 tests 是包含我的测试的文件夹的名称,并且在 .py 模块之一中具有单独的 python 测试函数...您的函数必须以“测试”开头,以便鼻子测试将其识别为您要运行的测试。

例如:

 def test_something():
    ...

在此目录中执行时,nosetests 将运行此函数,而

 def somethin_to_test():
    ...

不会。

于 2013-09-17T21:55:35.817 回答
2

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

nosetests --all-modules ./tests

于 2017-12-20T15:15:28.983 回答
1

在查看了nose的来源之后,特别是selector.py文件,如果你看看发生了什么,

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

当检查 we是否被调用时,它会针对 进行wantFile搜索,这就是您作为 传入的内容。self.matchesregexmatchtestMatch

当您稍后检查(以及整个文件)时,就会出现问题,

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"

然后,这会过滤我期望它的工作方式。

于 2017-01-12T19:51:22.237 回答