Rust とは、高いパフォーマンスと信頼性を実現するために開発された強力なプログラミング言語です。ランタイムやガベージ コレクターはなく、どの環境でも簡単に実行でき、既存のあらゆる言語やフレームワークと統合できます。 WebAssemblyの登場により、Rust は Web 開発分野においてこれまで以上に高い評価を受けています。Node.js からシームレスにやりとり可能な高パフォーマンスの機能を作成できるため、Web 開発者に重宝されています。多くの Web 開発者は、WebAssembly 統合のため、C++ や C を学ぶのではなく Rust を使うことを選んでいます。
このチュートリアルでは、リモート リポジトリに Rust アプリケーションの更新やアップグレードをプッシュしたときに、自動で Rust アプリケーションのテストを行う方法を説明します。
前提条件
このチュートリアルを進めるには、いくつかの準備が必要です。
これらのインストールとセットアップが済んだら、いざチュートリアルを始めましょう。
新しい Rust プロジェクトを作成する
このプロジェクトを開始する前に Rust をインストール済みであった場合は、rustup update
を実行して現在インストールされている Rust の互換性を確保してください。まず、次のコマンドを実行して新しい Rust アプリケーションを作成します。
cargo new rust-testing
このコマンドによって、rust-testing
フォルダー内にシンプルな Rust アプリケーションのスキャフォールドが行われます。これから、ユーザーに名前の入力を求め、CLI にあいさつメッセージを出力するシンプルな CLI アプリケーションを作成します。
ファイル src/main.rs
を開き、その内容を以下のコードで置き替えます。
fn main() {
let mut line = String::new();
println!("Please enter your name: ");
std::io::stdin().read_line(&mut line).unwrap();
println!("{}", build_message(line));
}
fn build_message(name: String) -> String{
let message = "You are welcome ".to_owned() + &name;
return message;
}
上記のコードでは、build_message
関数が定義されています。この関数は String
型の name
引数を受け取り、name
引数に基づいて作成したあいさつメッセージを返します。
main
関数はユーザーに名前の入力を求めます。 入力された名前は、build_message
関数に渡され、その戻り値が CLI 出力に表示されます。
以下のコマンドをこのプロジェクト フォルダーのルートで実行して、プロジェクトを実行します。
cargo run
アプリケーションから名前の入力を求められます。名前を入力して Enter
キーを押すと、以下に示すようなあいさつメッセージが CLI 画面に表示されます。
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/rust-testing`
Please enter your name:
Fikayo Adepoju
You are welcome Fikayo Adepoju
Rust アプリケーションのテストを追加する
Rust の長所の 1 つは、独自のテスト フレームワークがバンドルされており、追加のセットアップが不要なことです。それでは、build_message
関数の単体テストを作成して、出力を確認してみましょう。他の多くの言語やフレームワークではテストを個別のファイルに配置しますが、Rust では単体テストをテスト対象のコードと同じファイル内に配置することが推奨されています。
Rust アプリケーションのテスト実行用コマンドは cargo test
コマンドであり、プロジェクト内の #[test]
属性を持つ関数を見つけて、それをテスト ケースとして実行します。
以下のテストケースを build_message
関数の直下に追加します。
#[test]
fn test_build_message(){
let name = String::from("Fikayo");
assert_eq!(build_message(name), "You are welcome Fikayo")
}
このテストでは、name
変数を宣言し、Fikayo
という String
値を代入しています。次の行で、build_message
関数の出力が渡された変数に応じたメッセージであるか確認します。
次のコマンドを実行して、このテストを実行します。
cargo test
テストは正常に完了するはずです。以下の出力が CLI に表示されます。
Compiling rust-testing v0.1.0 (/Users/stanmd/Projects/CCI/rust-testing)
Finished test [unoptimized + debuginfo] target(s) in 0.63s
Running target/debug/deps/rust_testing-5cffbb684dbc6899
running 1 test
test test_build_message ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Rust アプリケーションを CircleCI に接続する
Rust プロジェクトのテストの自動化プロセスを始めるには、プロジェクトを GitHub にプッシュする必要があります。
次に、CircleCI ダッシュボードの [Projects (プロジェクト)] ページに移動します。該当する GitHub アカウントを選択して、プロジェクトを追加します。
[Set Up Project (プロジェクトをセットアップ)] をクリックします。
セットアップ ページで、表示されたサンプルを無視して設定ファイルを手動でセットアップするため、[Use Existing Config (既存の設定ファイルを使用する)] をクリックします。パイプラインの設定ファイルをダウンロードするのか、ビルドを開始するのかを確認するメッセージが表示されます。
[Start Building(ビルドの開始)] をクリックします。設定ファイルのセットアップがまだのため、このビルドは失敗します。このファイルは、次のステップで作成します。
Rust アプリケーションのテストを自動化する
いよいよ、リモート コード リポジトリへの更新のプッシュ時に自動でプロジェクトのテストを実行する継続的インテグレーション スクリプトを作成します。
プロジェクトのルートに、.circleci
という名前のフォルダーを作成します。このフォルダーの中に、config.yml
という名前のファイルを追加します。config.yml
に、以下のコードを入力します。
version: 2.1
jobs:
build:
docker:
- image: cimg/rust:1.50.0
steps:
- checkout
- run: cargo --version
- run:
name: テストの実行
command: "cargo test"
このコードは CircleCI 製 Rust イメージ cimg/rust:1.50.0
をプルします。このイメージによって、Rust で利用可能なすべての CLI コマンドにアクセスできるようになります。
その後、リモート リポジトリからコードをプルし、テストの実行
ラベルのステップで cargo test
コマンドを使用して、プロジェクトに含まれるテストを実行します。
すべての変更をプロジェクトにコミットして、リモート GitHub リポジトリにプッシュします。インテグレーション パイプラインがトリガーされ、ビルドが成功します。
![CircleCIでビルドが成功]
ビルド ジョブをクリックすると、デプロイの詳細を確認できます。
これで、機能の追加やテストの追加を行ってコードを変更し、変更をリモート リポジトリにプッシュするたびに、テストが自動的に実行されるようになりました。コードに問題があってビルドが失敗した場合には、アラートが通知されます。
これなら開発もスムーズにできますね。
まとめ
このチュートリアルでは、 継続的インテグレーション パイプラインを使用して Rust プロジェクトのテストを自動化する方法について説明しました。知識を広めるために、Rust アプリケーションの継続的デプロイに関する記事もご確認ください。今日から、チームにとっての Rust の価値を高め、今以上に優れたアプリを短時間で開発し続けましょう。
Happy coding!