2017-02-01 13 views
12

Niektóre projekty obejmują wiele skrzynek, co sprawia, że ​​ręczne przeprowadzanie wszystkich testów w każdym z nich jest kłopotliwe.Jak rekurencyjnie przetestować wszystkie skrzynie w katalogu?

Czy istnieje wygodny sposób rekursywnie uruchomić cargo test?

+0

Cieszę się, że nie jestem jedynym, chcąc pakiet wielu skrzynek w tym samym repozytorium. Jestem zaskoczony, że ładunek nie ma na to lepszego wsparcia. –

Odpowiedz

6

Można użyć skryptu powłoki. Według this answer, to

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

wypisze katalogów zawierających Cargo.toml, tak, komponując to z resztą standardowych utils powłoki daje nam

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

Który będzie iteracyjne nad wszystkie katalogi zawierające Cargo.toml (dobry zakład dla skrzynek) i uruchomić w nich cargo test.

6

Aktualizacja: od dodania tej odpowiedzi wydano wersję 1.15, a dodanie cargo test --all spowoduje porównanie tego z niestandardowym skryptem.


Ten skrypt powłoki przeprowadza testy rekurencyjnie na repozytorium git do wszystkich katalogów zawierających Cargo.toml plik (dość łatwe do edycji dla innych VCS).

  • Wyjścia przy pierwszym błędzie.
  • Używa nocapture, więc stdout jest wyświetlany
    (w zależności od osobistych preferencji, łatwe do dostosowania).
  • Przeprowadza testy z zestawem RUST_BACKTRACE, aby uzyskać bardziej przydatne dane wyjściowe.
  • Buduje i uruchamia w dwóch osobnych krokach
    (obejście dla this bug w 1,14 stabilnej).
  • Opcjonalnie zmienna CARGO_BIN środowisko zastąpić komendę ciężarowy
    (przydatne, jeśli chcemy korzystać z cargo-wrapper takich jak cargo-out-of-source builder).

Scenariusz:

#!/bin/bash 

# exit on 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 

Dzięki użytkownika @ набиячлэвэли odpowiedź, że jest to wersja rozszerzona.

4

Nie mogę tego przetestować teraz, ale wierzę, że można to zrobić za pomocą cargo test --all.

+0

Ta opcja faktycznie wylądowała w stabilnym Rustie właśnie dzisiaj, w wersji 1.15! – barjak

+0

Dobre rzeczy przychodzą do tych, którzy czekają. – Shepmaster

1

Można użyć funkcji przestrzeni ładunkowej. This crate kolekcja używa go w połączeniu z Makefile, który może być użyty do samodzielnego skompilowania każdej skrzyni.

(funkcja robocza pomaga nie skompilować typowe zależności wielokrotnie)

Powiązane problemy