開発

[rust] examplesフォルダにあるテストコードを実行しないようにする

DDDの考えを取り入れることでテストコードが書きやすくなりました。

以前はほとんどテストコードを書いてなかったので気づかなかったのですが、コマンドラインで

cargo test

と実行すると、rustは基本的にプロジェクトフォルダ下の全てのテストを実行します。

そのため、examplesフォルダ下にあるテストコードも対象に加わってしまいます。

私のexamplesフォルダの使い方は

examplesフォルダ下にあるコードは基本的に変更はしないので一旦テストをパスすればエラーが報告されないので実害があまりないはずなのですが、examples下のconvert_to_asciiフォルダではrust-toolchain.tomlを設置してnightlyなrustを対象にテストコードを書いていました。

そのため、普段使うstableなrust環境で上記のcargoコマンドを実行すると、環境差分によるエラーが報告されてしまいます。

Cargo Bookによると、どうやらこれはautomatic target discoveryという機能によってexamplesフォルダも対象に含まれてしまっているようです。

この機能をオフにすることでconvert_to_asciiフォルダを対象にしないこともできますが他の実行してほしいテストコードも実行しなくなりそうです。

個別にテストを指定して実行しても良いのですが、全テストを実行したいときには非常に不便です。

こういうことはAIに相談だ!、ということでChatGPTさんに聞いてみるといくつか方法があり、そのうちの一つをここに紹介します。

[features]セクションにfeatureを追加

Cargo.tomlに新たにfeatureを追加して、convert_to_asciiフォルダのテスト実行にはこの追加したfeatureを指定した場合のみテストを実行するようにします。

そのためにまずfeatureを追加します。

Cargo.tomlを開いて下記のように追加しました。

[features]
default = []
nightly = []Code language: TOML, also INI (ini)

nightlyなfeatureは既定値として既にありますが、重ねて書いても問題ないようです。

これでdefaultとnightlyの2つの区別がつくようになりました。

[[example]]を追加

convert_to_asciiフォルダはnightlyなfeatureが必要であることを認識させるため、その設定も追加します。

[[example]]
name = "convert_to_ascii"
path = "examples/convert_to_ascii/main.rs"
required-features = ["nightly"]Code language: TOML, also INI (ini)

これでこのフォルダのコードの実行はnightlyなfeatureが前提条件として求められるのでcargo コマンドの通常実行時には対象になりません。

このフォルダのコードを実行する場合は、

cargo test --example convert_to_ascii --features nightly

のようにfeatureを指定して実行する必要があります。(実際にはrust-toolchain.tomlが設置されているので、このフォルダに移動してから上記コマンドを実行する)

GitHubにコードをアップロードしています。0.1.1バージョン

コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。

# Example
$ cargo run --example first_step
Code language: Bash (bash)
管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago

Affinity by Canvaがついに基本無料

Canvaに買収されたSeri…

7か月 ago