我正在使用 Hudson 来不断构建 Python 项目。单元测试和代码覆盖率工作得很好,但是在 Cobertura覆盖率报告中钻取不单元测试的文件时会出现此消息:
Source code is unavailable.Some possible reasons are:
* This is not the most recent build (to save on disk space, this plugin only keeps the most recent builds source code).
* Cobertura found the source code but did not provide enough information to locate the source code.
* Cobertura could not find the source code, so this plugin has no hope of finding it.
奇怪的是找到并显示单元测试的源代码。我试图手动将其他.py文件的源文件复制到~/.hudson/jobs/<projectname>/cobertura
(单元测试被复制的地方),但它没有用。
有什么建议吗?
答案 0 :(得分:7)
Cobertura报告文件(此时位于$HUDSON/jobs/foo/workspace
中的某个位置)需要在开头包含类似的内容:
<sources>
<source>/path/to/source</source>
<source>/another/path</source>
</sources>
有吗?路径是否指向正确的位置?
另一个问题:当它说“最近的构建”时,它实际上意味着“最近的稳定构建”(即状态球是蓝色,而不是黄色)。
答案 1 :(得分:6)
这是一个丑陋的黑客的地狱,但它是我唯一可以想出的最终使它工作......并且经过数小时的谷歌搜索和黑客攻击试图获得结果,这是我唯一的事情想出来了。
coverage run manage.py test
coverage xml
sed 's/filename="/filename="my\/path\//g' coverage.xml > coverage2.xml
这只是重新扩展类xml标记的filename属性,并在开头添加源文件的完整路径。只需确保将Cobertura xml报告模式更新为coverage2.xml(如果这是您将sed的输出路由到的地方)。
如果Cobertura插件允许您输入类似于Violations插件的源路径,那将是很好的 - 不幸的是,据我所知,它没有。
我希望这有帮助!
答案 2 :(得分:5)
对我来说,其他两个解决方案并不是独立的,但两者的结合确实是:
...
coverage xml
sed 's/<!-- Generated by coverage.py: http:\/\/nedbatchelder.com\/code\/coverage -->/<sources><source>\/path\/to\/sourcefolder<\/source><\/sources>/g'
这只是将coverage.py插入的注释替换为有关源位置的信息。
答案 3 :(得分:1)
我们的解决方案是改变我们对cobertura-report ant任务的使用,以包括源目录的完整路径而不是相对路径。
<cobertura-report format="xml" destdir="${coverage.dir}" srcdir="${basedir}/${src.dir}"/>
基本上,cobertura xml报告中包含的相对路径跨越了Hudson,因此Cobertura插件无法使用它来查找源代码。在我们的案例中,这是Hudson如何处理单个模块项目和多模块项目之间的差异的表现。
答案 4 :(得分:-1)
解决此问题的“正确”方法是将您的项目置于PYTHONPATH并从您的仓库外部运行测试/覆盖。因为看起来你正在使用Django,所以django-admin.py test --settings = myproject.settings会让你这样做。
- 最初由Pete发表在评论中,转而回答。