コンパイラのテスト
Rust プロジェクトでは、ビルドシステム(./x test)によって統括される、さまざまな種類のテストが実行されます。このセクションでは、各種テストツールの概要を簡単に説明します。以降の章では、テストの実行と新しいテストの追加について詳しく説明します。
テストの種類
Rust ディストリビューション内のものを検証するために、いくつかの種類のテストがあります。ほぼすべては ./x test によって駆動されますが、以下で述べるように例外もあります。
Compiletest
コンパイラ自体をテストするための主要なテストハーネスは、compiletest というツールです。
compiletest は、テストスイートとして整理された、さまざまなスタイルのテストの実行をサポートします。テストモードは、一連のテストスイートに対して共通のプリセット/動作を提供する場合があります。compiletest がサポートするテストは tests ディレクトリにあります。
Compiletest の章では、このツールの使い方について詳しく説明しています。
例:
./x test tests/ui
パッケージテスト
標準ライブラリと多くのコンパイラパッケージには、典型的な Rust の #[test] ユニットテスト、統合テスト、ドキュメンテーションテストが含まれています。library/ または compiler/ ディレクトリ内のほぼ任意のパッケージについて、./x test にパスを渡すことができ、x は基本的にそのパッケージに対して cargo test を実行します。
例:
| コマンド | 説明 |
|---|---|
./x test library/std | std のテストのみを実行します |
./x test library/core | core のテストのみを実行します |
./x test compiler/rustc_data_structures | rustc_data_structures のテストを実行します |
標準ライブラリは、その機能をカバーするためにドキュメンテーションテストに大きく依存しています。ただし、必要に応じてユニットテストや統合テストも使用できます。ほぼすべてのコンパイラパッケージでは、doctest が無効化されています。
すべての標準ライブラリおよびコンパイラのユニットテストは、別個の tests ファイルに配置されます(これは tidy によって強制されます)。これにより、テストファイルが変更された場合でも、クレートを再コンパイルする必要がなくなります。例:
#[cfg(test)]
mod tests;
この方法で行わず、core のようなものに取り組んでいる場合、標準ライブラリ全体と rustc 全体を再コンパイルする必要があります。
./x test には、これらのパッケージテストの動作を制御するための CLI オプションがいくつか含まれています。
--doc— パッケージ内のドキュメンテーションテストのみを実行します。--all-targets— ドキュメンテーションテストを除くすべてのテストを実行します。--tests— ユニットテストと統合テストのみを実行します
Tidy
Tidy は、長い行を拒否するなど、ソースコードのスタイルとフォーマット規約を検証するために使用されるカスタムツールです。詳細については、コーディング規約に関するセクションまたは Tidy Readme を参照してください。
例:
./x test tidy
フォーマット
Rustfmt は、コンパイラ全体で一貫したスタイルを強制するためにビルドシステムに統合されています。フォーマットチェックは、前述の Tidy ツールによって自動的に実行されます。
例:
| コマンド | 説明 |
|---|---|
./x fmt --check | フォーマットをチェックし、フォーマットが必要な場合はエラーで終了します。 |
./x fmt | コードベース全体に対して rustfmt を実行します。 |
./x test tidy --bless | 最初に rustfmt を実行してコードベースをフォーマットし、その後 tidy チェックを実行します。 |
Book ドキュメントテスト
公開されているすべての book には、それぞれ独自のテストがあり、主に Rust コード例が通ることを検証するためのものです。内部的には、これらは基本的に markdown ファイルに対して rustdoc --test を使用しています。./x test に book へのパスを渡すことで、テストを実行できます。
例:
./x test src/doc/book
ドキュメントリンクチェッカー
すべてのドキュメントにわたるリンクはリンクチェッカーツールで検証され、次のように呼び出すことができます。
./x test linkchecker
これにはすべてのドキュメントをビルドする必要があり、しばらく時間がかかる場合があります。
distcheck
distcheck は、ビルドシステムによって作成されたソースディストリビューション tarball が展開され、ビルドされ、すべてのテストを実行できることを検証します。
./x test distcheck
ツールテスト
Rust に含まれているパッケージについても、すべてのテストが実行されます。これには cargo、clippy、rustfmt、miri、bootstrap(Rust ビルドシステム自体のテスト)などが含まれます。
ほとんどのツールは src/tools ディレクトリにあります。ツールのテストを実行するには、そのパスを ./x test に渡すだけです。
例:
./x test src/tools/cargo
通常、これらのツールでは、ツールのディレクトリ内で cargo test を実行します。
指定した一連のテストのみを実行したい場合は、コマンドに --test-args FILTER_NAME を追加します。
例:
./x test src/tools/miri --test-args padding
CI では、一部のツールは失敗が許容されています。失敗すると対応するチームに通知が送信され、toolstate Web サイトで追跡されます。詳細については、toolstate ドキュメントを参照してください。
エコシステムテスト
Rust は、回帰を検出し、言語の進化について情報に基づいた判断を行うために、実世界のコードとの統合をテストします。エコシステムテストには、Crater を含むいくつかの種類があります。詳細については、エコシステムテストの章を参照してください。
パフォーマンステスト
コンパイラのパフォーマンスのテストと追跡には、別のインフラストラクチャが使用されます。詳細については、パフォーマンステストの章を参照してください。
コード生成バックエンドテスト
コード生成バックエンドテストを参照してください。
その他の情報
その他の有用なテスト関連情報は、その他の情報にあります。
参考資料
次のブログ記事も参考になる場合があります。
- brson の古典的な “How Rust is tested”