cargo-nextest vs cargo test: Rust のテストランナー
doctest を含むすべてのテストタイプをカバーする、インストール不要の組み込みランナーが欲しいなら cargo test を、より高速な並列実行、テストごとのプロセス分離、リトライ、優れた CI レポートが欲しいなら cargo-nextest を選びましょう。
cargo test は Rust の組み込みテストランナーです。追加ツールなしで、ユニットテスト、統合テスト、ドキュメントテストをコンパイルして実行します。cargo-nextest はテスト実行を再設計したサードパーティのランナーで、分離のために各テストを独自のプロセスで実行し、積極的に並列化し、リトライ、パーティショニング、より明確な出力といった CI に適した機能を追加します。nextest は doctest を実行しないため、両者は補完的です。
| cargo-nextest | cargo test | |
|---|---|---|
| インストール | 別途(cargo install/binstall) | Cargo に組み込み |
| 実行 | テストごとに1プロセス | バイナリ内のスレッド |
| 速度 | 大規模スイートでは多くの場合より高速 | ベースライン |
| Doctest | 実行されない(cargo test を使用) | 対応 |
| CI 機能 | リトライ、パーティショニング、JUnit 出力 | 基本的な出力 |
| 出力 | 簡潔、テストごとのステータス | 標準的な libtest 出力 |
それぞれが本当に優れている点
cargo test はセットアップ不要で完全性に優れています。常に利用可能で、doctest を実行できる唯一のものです。cargo-nextest は大規模スイートと CI で優れています。テストごとのプロセス分離により、あるテストが別のテストの状態を汚染するのを防ぎ、うまく並列化し、既知の不安定なテストへの自動リトライ、runner 間でのテストパーティショニング、JUnit XML 出力といった機能が CI を高速化し読みやすくします。
CI での活用
大規模なテストスイートでは、nextest の並列性とパーティショニングによって複数の runner にテストをシャーディングして実時間を短縮でき、その JUnit 出力は CI のテストレポートに組み込めます。一般的なパターンは、ユニット/統合テストには cargo nextest run を、doctest には別途 cargo test --doc を実行し、doctest のカバレッジを失わずに nextest の速度を得ることです。
正直な注意点
nextest はインストールとバージョン固定が必要な追加の依存関係であり、doctest をスキップするため、それらには依然として cargo test が必要です。テストごとのプロセス分離は正確性には優れていますが、プロセス生成のオーバーヘッドがあるため、非常に小さなスイートでは組み込みランナーの方が同じくらい速いかもしれません。ほとんどの大規模プロジェクトでは、nextest の利点がこれを上回ります。
結論
小規模プロジェクトや doctest の実行には cargo test を使いましょう。並列性、分離、リトライ、JUnit レポートが役立つ CI での大規模スイートには cargo-nextest を使い、doctest は別ステップとして残しましょう。