如何在另一台没有Rust编译器的机器上运行cargo测试?

7
我知道编译器可以直接在 arm-linux-androideabi 上运行,但 Android 模拟器(我指的是在 x86/amd64 上模拟 ARM)很慢,所以我不想在模拟器上使用 cargorustc,我只想在其上运行测试。
我想要在我的电脑上进行交叉编译测试(cargo test --target=arm-linux-androideabi --no-run?),然后将它们上传并在模拟器上运行,希望能像这个问题一样捕捉到错误。
如何在不运行 cargo test 的情况下运行 cargo test?是否只需运行使用 cargo test --no-run 构建的所有二进制文件即可?

你想指定 rustc 的目标吗? - Stargateur
@Stargateur 不,我想在机器上不使用 cargorustc 运行测试。 - fghj
3个回答

8

cargo test支持两种测试,一种是普通测试(#[test] fntests/目录下的文件),另一种是文档测试。

普通测试就像运行所有二进制文件一样简单。如果测试以错误代码0退出,则认为测试成功。

文档测试不能进行交叉测试。文档测试由rustdoc直接使用编译器库编译和执行,因此必须在ARM机器上安装编译器才能运行文档测试。实际上,当HOST ≠ TARGET时运行cargo test --doc将不起作用。

因此,对于您的最后一个问题,只要您不依赖文档测试来进行覆盖测试,答案就是是的


从Rust 1.19开始,cargo支持针对特定运行者,这允许您指定一个脚本在ARM机器上上传和执行测试程序。
#!/bin/sh
set -e
adb push "$1" "/sdcard/somewhere/$1"
adb shell "chmod 755 /sdcard/somewhere/$1 && /sdcard/somewhere/$1" 
# ^ note: may need to change this line, see https://dev59.com/K2ox5IYBdhLWcg3wLhYA

将此代码添加到您的.cargo/config文件中:
[target.arm-linux-androideabi]
runner = ["/path/to/your/run/script.sh"]

然后运行cargo test --target=arm-linux-androideabi,应该就可以顺利工作了。


如果你的项目托管在GitHub上并使用Travis CI,你可能还想查看trust。它提供了一个预打包解决方案,可用于在CI上测试许多架构,包括ARMv7 Linux(不幸的是没有Android)。

太好了,这正是我想要实现的方式。 - fghj
你好,我该如何编译适用于Arm架构的程序?我原本使用 cargo ndk 但似乎并不支持此类测试;如果我直接使用 cargo build 命令进行编译,则在编译到Arm时会出错。 - ch271828n

2

我建议在Android上进行测试时使用dinghy,它提供了方便的包装命令,可用于在Android/iOS设备/模拟器上构建和测试。


0

对于仍然感兴趣的人:

使用-v运行cargo -v test

然后查找此输出

 Finished release [optimized] target(s) in 21.31s
     Running `/my-dir/target/release/deps/my-binary-29b03924d05690f1`  

然后只需将测试二进制文件 /my-dir/target/release/deps/my-binary-29b03924d05690f1 复制到没有安装 Rustc 的机器上即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接