轶哥

📚 Having fun with AI Agent. Always learning.

Rust单元测试完成后自动执行覆盖率测试
  •   更新:2023-05-25 16:23:34
  •   首发:2023-05-22 16:54:39
  •   教程
  •   1711

在本文将探讨如何在Rust项目中自动完成单元测试并执行覆盖率测试。我们将使用rust-analyzer插件、配置.vscode/settings.json文件以及编写一个Python脚本变相实现cargo命令的hook。最终效果按下“Run Test”按钮后自动完成单元测试及覆盖率测试,实现搭配Coverage Gutters插件实时显示覆盖率结果。

使用 rust-analyzer 插件

要实现在VSCode中开发Rust及执行Rust单元测试,我们需要安装rust-analyzer插件。它可以通过扩展面板搜索并安装。

几乎所有支持Rust开发的编辑器都使用了rust-analyzer

配置 .vscode/settings.json

接下来,在项目目录下创建.vscode/settings.json文件并填入以下内容:

{
    "rust-analyzer.runnables.command": "python3 ${workspaceFolder}/bin/cargo_wrapper.py"
}

这里,我们设置了一个新的运行命令,用于执行我们将要创建的Python脚本。当用户点击#[test]下方的“Run Test”时,会执行该命令。

创建 bin/cargo_wrapper.py 文件

现在,我们将在项目目录下创建一个名为bin/cargo_wrapper.py的新文件。请将以下代码粘贴到文件中:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import subprocess
import re

def main():
    test_name = None
    for idx, arg in enumerate(sys.argv):
        if arg == "--" and len(sys.argv) > idx + 1:
            test_name = sys.argv[idx + 1]
            break

    cmd = ["cargo"] + sys.argv[1:]
    print("Executing command:", " ".join(cmd))
    result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
    print(result.stdout)

    test_result_pattern = re.compile(r"test result: ok.*failed;")

    if test_result_pattern.search(result.stdout):
        coverage_cmd = ["cargo", "xtask", "coverage"]
        if test_name:
            coverage_cmd.extend(["name="+test_name])
        print("Executing command:", " ".join(coverage_cmd))
        coverage_result = subprocess.run(coverage_cmd)
    else:
        print("Failed test cases found. Skipping cargo xtask coverage.")

if __name__ == "__main__":
    main()

这个脚本实现了一个cargo_wrapper,用于在执行cargo test命令后运行覆盖率测试命令(这里使用的是cargo xtask coverage name=单元测试名称)。使用Python脚本的好处是它具有跨平台性。

整合 Coverage Gutters 插件

我们还可以安装和配置Coverage Gutters插件,以便在VSCode中实时查看覆盖率结果。只需在扩展面板中搜索并安装即可。

这样,在点击单元测试方法上方的“Run Test”按钮后,自动完成单元测试并测试其覆盖率。搭配Coverage Gutters插件可以在VSCode中Watch单元覆盖率的变化并实时显示在界面上。

rusttest.png

参考代码

以上涉及的代码已经在开源仓库https://github.com/yi-ge/rust-practice中可以看到 ,您可以尝试修改该项目来适配你的测试需求。

通过本文的方法,咱们可以非常方便的在Rust项目中实现自动执行单元测试并进行覆盖率测试。祝您开发愉快!

打赏
交流区

暂无内容

尚未登陆
发布
  上一篇 (C++ LLVM生成测试覆盖率)
下一篇 (CUDA Toolkit 11.7、11.8与12.1官方下载地址)  

评论回复提醒