rust 如何递归测试一个目录下的所有crate?

cyvaqqii  于 2023-05-22  发布在  其他
关注(0)|答案(4)|浏览(290)

有些项目包括多个板条箱,这使得在每个板条箱中手动运行所有测试变得很麻烦。
有没有一种方便的方法来递归地运行cargo test

jecbmhm3

jecbmhm31#

更新:由于添加此答案1.15已发布,添加cargo test --all,将与自定义脚本进行比较。
这个shell脚本在git存储库上递归地运行包含Cargo.toml文件的所有目录的测试(对于其他VCS来说很容易编辑)。

  • 第一个错误时退出。
  • 使用nocapture以显示标准输出
  • (视个人喜好而定,易于调整)*。
  • 使用RUST_BACKTRACE集运行测试,以获得更有用的输出。
  • 在两个单独的步骤中构建和运行
  • (1.14稳定版中this bug的解决方法)。*
  • 可选的CARGO_BIN环境变量,用于覆盖cargo命令
  • (如果您想使用货物 Package 器,如cargo-out-of-source builder,则很方便)。*

脚本:

#!/bin/bash

# exit on the first error, see: http://stackoverflow.com/a/185900/432509
error() {
    local parent_lineno="$1"
    local message="$2"
    local code="${3:-1}"
    if [[ -n "$message" ]] ; then
        echo "Error on or near line ${parent_lineno}: ${message}; exiting with status ${code}"
    else
        echo "Error on or near line ${parent_lineno}; exiting with status ${code}"
    fi
    exit "${code}"
}
trap 'error ${LINENO}' ERR
# done with trap

# Support cargo command override.
if [[ -z $CARGO_BIN ]]; then
    CARGO_BIN=cargo
fi

# toplevel git repo
ROOT=$(git rev-parse --show-toplevel)

for cargo_dir in $(find "$ROOT" -name Cargo.toml -printf '%h\n'); do
    echo "Running tests in: $cargo_dir"
    pushd "$cargo_dir"
    RUST_BACKTRACE=0 $CARGO_BIN test --no-run
    RUST_BACKTRACE=1 $CARGO_BIN test -- --nocapture
    popd
done
  • 感谢@набиячл е в е л и的回答,这是一个扩展版本。*
dtcbnfnu

dtcbnfnu2#

您可以使用shell脚本。根据this answer,这

find . -name Cargo.toml -printf '%h\n'

将打印出包含Cargo.toml的目录,因此,将其与其余的标准shell utils组合在一起将产生

for f in $(find . -name Cargo.toml -printf '%h\n' | sort -u); do
  pushd $f > /dev/null;
  cargo test;
  popd > /dev/null;
done

它将遍历所有包含Cargo.toml(对于crates来说是个不错的选择)的目录,并在其中运行cargo test

lnvxswe2

lnvxswe23#

我现在不能测试它,但我相信你可以用cargo test --all来做。

f2uvfpb9

f2uvfpb94#

您可以使用货物工作区功能。This crate集合将其与Makefile结合使用,Makefile可用于独立编译每个crate。
(The工作区功能有助于避免多次编译公共依赖项)

相关问题