如何使用Behave从Python BDD功能测试获取代码覆盖率数据?

11 投票
4 回答
4136 浏览
提问于 2025-04-18 02:23

我没有找到这个具体问题的答案(Behave测试框架的测试覆盖工具),而且在谷歌搜索中也没有找到足够的答案。所以……

我该如何从Behave获取代码覆盖报告呢?我很难相信没有Python开发者在使用BDD方法论,更难相信那些使用BDD的Python开发者在进行功能测试时没有代码覆盖的统计数据。Coverage.py可以用来驱动Behave生成代码覆盖吗?怎么做呢?

4 个回答

0

还有一个选择,就是用覆盖率工具来运行behave的主脚本:

coverage run /path/to/lib/python2.7/site-packages/behave/__main__.py

当然,你需要在你的.coveragerc文件中指定你想要包含哪些源文件。

2

接着David上面的建议。

假设你要测试的代码在一个应用程序的文件夹里,你需要在你的.coveragerc文件中添加以下内容:

[run]
source=app/

在终端中输入:

coverage run $(which behave);

然后你可以像平常一样使用coverage report或者coverage html。如果你在.coveragerc文件中没有指定应用程序的文件夹,coverage就会测试你安装的behave相关的所有Python库。

2

Behave可以生成JUnit的覆盖率数据,而coverage包可以把多次测试运行产生的数据合并起来,并生成一个HTML报告,你可以查看这个报告,或者在你的持续集成(CI)环境中自动发布。

下面是我目前用来生成、合并和报告覆盖率的命令:

cd your/repo/tests  # <-- Make sure you're inside your tests dir!
rm -rf behave-reports/*
behave --junit --junit-directory behave-reports
coverage combine
coverage html

命令rm -rf behave-reports/*会强制删除behave-reports/目录下的所有内容,这样我就能确保得到一个全新的覆盖率报告,或者什么都没有(在我的情况下,这会导致CI失败)。注意,如果你在本地运行测试,最好在你的.gitignore文件中添加一条规则,这样就不会把测试结果添加到版本控制中。

使用--junit选项运行behave会生成JUnit格式的输出,而--junit-directory这个选项则告诉behave把这些JUnit数据存储到哪个地方。

运行coverage combine命令会把所有的代码覆盖率数据合并成一个文件。

最后,运行coverage html会生成一个漂亮的HTML报告,里面包含了所有合并后的覆盖率数据。

3

我不知道怎么用behave,但我用过Cucumber来做行为驱动开发(BDD),我觉得这两个应该差不多。所以我认为你应该可以在behave中使用覆盖率功能。你需要指定要包含哪个文件……(我在用Cucumber的时候是这样做的)。看看这个链接,也许对你有帮助。

希望这个能回答你的问题 :)

# .coveragerc to control coverage.py
[run]
parallel = True

# if you want to include tests append tests/*
include =
    src/*
    *src*

[paths]
source =
    src/
    */src

tests =
    tests/
    */tests

撰写回答