Coverage.py中的“无源代码”消息
我昨晚成功地运行了一次构建。今天早上,我又运行了一次,但没有更改任何配置或修改任何源代码。现在我的构建失败了,出现了“没有代码源”的提示,当我用nosetests和coverage运行时。
NoSource: No source for code: '/home/matthew/.hudson/jobs/myproject/workspace/tests/unit/util.py'
. . .
No source for code: '/home/matthew/.hudson/jobs/myproject/workspace/__init__.py'
我唯一的线索是,它说找不到的文件其实根本就不存在,而且它们本来就不应该存在。 比如,在后面的例子中,Hudson的工作空间并不是一个Python模块,所以__init__.py
文件不会存在。
更新:我确认这不是Hudson的问题。当我在目录中直接运行nosetests和coverage时,我也看到了类似的提示。同样,coverage要找的文件一开始就不存在,这让我感到很困惑。
12 个回答
总结: 在运行 nosetests --with-coverage
时,旧的 .coverage 数据会被保留,所以要先把它删掉。
详细信息: 我也在使用 Hudson 和 nosetests 时遇到了这个问题。这个错误来自 coverage/results.py:18
(使用的是 coverage 3.3.1 - 这里有三个地方抛出了这个错误,但这个是最相关的)。它试图打开与实际被追踪的模块对应的 .py 文件。下面是一个简单的演示:
$ echo print > hello.py
$ echo import hello > main.py
$ coverage run main.py
$ rm hello.py
$ coverage xml
No source for code: '/tmp/aoeu/hello.py'
显然,我有一个执行过的 stopwords.pyc 文件,但没有 stopwords.py 文件。然而在我的代码中并没有导入 stopwords,即使删除了 .pyc 文件,我仍然收到了这个错误。
简单地运行 strings .coverage
后发现,stopwords.py 的引用依然存在。nosetests --with-coverage
使用了 coverage 的追加或合并功能,这意味着旧的 .coverage 数据仍然存在。确实,删除 .coverage 文件解决了这个问题。
确保那里没有 .pyc 文件,这个文件可能之前存在过。
我不太明白为什么它会认为那个文件存在,不过你可以通过加一个 coverage xml -i
的选项来让 coverage.py 忽略这些问题。
如果你想找出错误的原因,可以给我发个消息(ned at ned batchelder com)。