- 更新:2023-05-25 16:23:34
- 首发:2023-05-22 16:54:39
- 教程
- 2917
在本文将探讨如何在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单元覆盖率的变化并实时显示在界面上。
参考代码
以上涉及的代码已经在开源仓库https://github.com/yi-ge/rust-practice中可以看到 ,您可以尝试修改该项目来适配你的测试需求。
通过本文的方法,咱们可以非常方便的在Rust项目中实现自动执行单元测试并进行覆盖率测试。祝您开发愉快!
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢