事实证明这是可能的。有两个主要的集成任务:测试运行结果和代码覆盖率结果。我假设正常的Python 3代码库和标准的unittest
测试套件。
测试运行器
Bamboo希望测试运行结果采用JUnit XML格式。Cheese Shop上有单独的测试运行器能够生成这样的输出,但它需要你编写一些代码来运行它,这并不好。更好的方法是使用pytest的功能,这可以保持代码库完整。
代码覆盖率
Bamboo仅支持Atlassian Clover的XML格式。重要的是,你不需要启用Atlassian Clover插件(以及需要花费一些钱的许可证)。Bamboo可以自己工作。
Python事实上的标准代码覆盖工具coverage,生成了某种程度上的Cobertura XML格式,但有一个转换器。有一个pytest插件可与覆盖工具集成。
解决方案
这是我使用pytest创建Tox环境,使两个Bamboo集成都能正常运行的解决方案。
[tox]
envlist = py34
skipsdist = True
[testenv]
setenv = LANG=C.UTF-8
basepython = python3.4
deps = -r{toxinidir}/requirements.txt
[testenv:bamboo]
commands =
py.test --junitxml=results.xml \
--cov=project_name --cov-config=tox.ini --cov-report=xml \
--cov-report=html project_name/test
coverage2clover -i coverage.xml -o clover.xml
deps =
{[testenv]deps}
pytest
pytest-cov
coverage2clover
[pytest]
python_files = *.py
[run]
omit=project_name/test/*,project_name/__main__.py
请注意,pytest 和 pytest-cov 都使用
tox.ini
进行配置,这种配置不支持命令行。它可以帮助你避免在库的根目录中添加额外的杂乱文件。pytest 尝试自动读取
tox.ini
,pytest-cov 则会绕过该文件并转向
.coveragerc
,但由于它也是一个 INI 文件,所以
tox.ini
也能适用。
在 Bamboo 中添加一个
脚本任务,运行
tox -e bamboo
。然后在作业中添加
JUnit 解析任务。在对话框中,在“指定自定义结果目录”下输入
results.xml
。
覆盖率配置是通过其他方式完成的。
- 打开您的作业的杂项选项卡
- 勾选“使用Clover收集此构建的代码覆盖率”
- 选择“Clover已经集成到此构建中,将生成clover.xml文件”
- 在“Clover XML位置”中输入
clover.xml
![enter image description here](https://istack.dev59.com/aSymz.webp)
在下一次构建中,您将看到总覆盖率和两个图表:
覆盖率历史和
代码行数历史。拥有交互式的HTML由覆盖工具生成也很不错,这样您可以深入挖掘某些代码行。
上述设置(至少在Bamboo 5.7中)已在
Artifact作业选项卡中创建了
Clover Report(System)。打开它并将
htmlcov
设置为
位置字段,将
*.*
设置为
复制模式。Bamboo现在将收集HTML报告。您可以在计划的
Clover选项卡中查看它。
py.test --junit-xml results.xml
,然后再加上if [ $? -ne 0 ]; then echo "Test Failed"; fi
来消耗返回代码。否则,Bamboo将不允许你隔离单个测试结果,并将标记整个作业为失败。 - Samuel O'Malley