Rust とは?

Rust とは、高いパフォーマンスと信頼性を実現するために開発された強力なプログラミング言語です。ランタイムやガベージ コレクターはなく、どの環境でも簡単に実行でき、既存のあらゆる言語やフレームワークと統合できます。 WebAssemblyの登場により、Rust は Web 開発分野においてこれまで以上に高い評価を受けています。Node.js からシームレスにやりとり可能な高パフォーマンスの機能を作成できるため、Web 開発者に重宝されています。多くの Web 開発者は、WebAssembly 統合のため、C++ や C を学ぶのではなく Rust を使うことを選んでいます。

このチュートリアルでは、リモート リポジトリに Rust アプリケーションの更新やアップグレードをプッシュしたときに、自動で Rust アプリケーションのテストを行う方法を説明します。

前提条件

このチュートリアルを進めるには、いくつかの準備が必要です。

  1. Rust の基礎を理解する
  2. Rust をローカル システムにインストールする (インストール ガイドは こちら)
  3. CircleCIアカウントを用意する
  4. GitHub アカウントを用意する

これらのインストールとセットアップが済んだら、いざチュートリアルを始めましょう。

新しい 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 アカウントを選択して、プロジェクトを追加します。

CircleCIでプロジェクトの追加

[Set Up Project (プロジェクトをセットアップ)] をクリックします。

CircleCIでコンフィグの追加

セットアップ ページで、表示されたサンプルを無視して設定ファイルを手動でセットアップするため、[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!


Fikayo Adepoju は、Web とモバイル テクノロジー、DevOps に精通したフルスタック開発者、テクニカル ライター、テクニカル コンテンツ クリエイターです。スケーラブルな分散アプリケーション開発については 10 年以上の経験を持っています。CircleCI、Twilio、Auth0、The New Stack のブログで 40 以上の記事を執筆するほか、個人の Medium ページでも情報を発信しており、役立つ知識を多くの開発者に広めることに専心しています。 また、Udemyで動画形式のコース(英語)も開講しています。ぜひご覧ください。