C++トラックでのテスト

ExercismでC++の演習をテストする方法を学びます。


各演習には、単体テストとCMakeのビルドレシピが用意されています。実装は自分で書きます。 各テストファイルは、自分の実装とリンクして、テストを実行するコンソール用の実行ファイルを作ることを想定しています。テストの実行ファイルを実行すると、失敗したテストごとにメッセージが表示され、テストが失敗したときは0以外の終了ステータスが報告されます。

補足: プロジェクトをビルドするたびに、コードはテストスイートに対してテストされます。コードが1つ以上のテストに合格しなくても、有効なC++コードであれば、コンパイルは実行されます。

各演習は、次の流れで進めます。

  • CMakeで最初のビルドを作成する
  • 各単体テストについて、次のことを行います。
    • コンパイルエラーを解消して、テストが失敗する状態にする。
    • テストに合格するのに必要な分だけ実装する。
    • 読みやすさを高めたり、重複を減らしたりするために、実装をリファクタリングする。
    • 次のテストのコメントを外す

CMakeで最初のビルドを作成する

各演習には、単体テストと一緒にCMakeLists.txtファイルが付いてきます。このファイルには、ビルドを処理してくれる定型のCMakeレシピが入っています。このファイルを編集する必要はないはずです。用意されているレシピは、実装が演習の名前を付けたヘッダーファイルとソースファイルとして存在することを前提としています。

たとえば、演習bobでは、bob.hとbob.cppに実装があることを前提としています。名前にハイフンを含む演習では、ソースファイルはアンダースコアを使うものとみなされるので、word-countではword_count.hとword_count.cppが想定されます。実装が十分に単純で、ヘッダーだけに収められると判断した場合は、cppファイルを省略できます。

CMakeを実行する前に、実装のファイルを作成しておきましょう。 演習bobでCMakeを実行するときにbob.hとbob.cppがないと、CMakeはファイルが見つからないというエラーを出します。これらのファイルは空でもかまいませんが、存在している必要があります。

このレシピを使うと、適切なジェネレーターと演習のディレクトリーの場所を指定してcmake -Gを実行することで、自分の環境に合ったプロジェクトをCMakeで生成できます。CMakeは、オペレーティングシステムに適したビルドスクリプトを生成します。生成されたファイルを演習のソースコードと分けておくために、生成されたビルドファイルとコンパイル済みのコードを入れるbuildというディレクトリーを作るのが一般的です。こうすると、演習のフォルダーをすっきりと整理された状態に保てます。

CMakeがビルド環境を作成したら、自分の環境に合ったコマンドでコードをビルドできます。

  • Linuxでmakeを使う場合: make
  • WindowsでVisual Studioを使う場合: メニューからBuild / Build Solutionを選択します。
  • MacOSでXcodeを使う場合: ツールバーからBuildを選択します。
  • MacOSで"Unix Makefile"を使う場合: make exercism CLIアプリを使う場合

以下に、さまざまな環境でCMakeを実行する例を示します。

LinuxでMakeを使う場合

CMakeのジェネレーター名はUnix Makefilesです。 現在の演習がbobで、演習のフォルダーにいるとします。

$ touch bob.{h,cpp}
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

この例では、CMakeを実行する前に実装用の空ファイルを作成しています。

テストをコンパイルするには、buildディレクトリーでmakeと入力するだけです。すると、コンパイル時のエラーが出るはずです。エラーを修正したら、makeがテストをビルドして実行します。

WindowsでVisual Studioを使う場合

Visual StudioはCMakeプロジェクトをネイティブにサポートしているので、CMakeを別途インストールしたり、Visual Studioの外で実行したりする必要はないはずです。このガイドに従って、Visual StudioでCMakeプロジェクトをセットアップしてください。

MacOSでXcodeを使う場合

CMakeのジェネレーター名はXcodeです。 現在の演習がbobで、演習のフォルダーにいるとします。

$ touch bob.{h,cpp}
$ mkdir build
$ cd build
$ cmake -G Xcode ..

この例では、XCodeでプロジェクトを開けるようにXCodeのファイルを生成します。 XCodeでプロジェクトを開いたら、別のターゲットを追加する必要があるかもしれません。 新しいターゲットを作るには、メニューからFile -> New -> Targetと進み、OS X \ Application \ Command Line Tool -> Nextで言語として_C++_を選び、ターゲット名を指定します。コードはそのターゲットを使って実行します。

ターミナルでXcode x.x not supportedというエラーが出た場合、Xcodeが自分のマシンにインストールされていないか、バージョンが古い可能性が高いです。 App StoreまたはこちらのリンクからXcodeをダウンロードしてインストールしてください。 The CXX compiler identification is unknownのようなエラーは、GCCのインストール手順に従うか、前述のとおりXcodeに別のターゲットを追加することで解決するはずです。

MacOSでMakeを使う場合 Exercism CLIを使うとき

この例は、C++の演習の設定、テスト、提出にExercism CLIアプリを使いたい人に特に役立ちます。

CMakeのジェネレーター名はUnix Makefilesです。 現在の演習がbobで、演習のフォルダーにいるとします。

$ touch bob.{h,cpp}
$ cmake -G "Unix Makefiles" .
$ exercism test

この例では、CMakeを実行する前に実装用の空ファイルは作成しますが、空のbuildディレクトリーは作成しません。 Exercism CLIが、テストケースを解析するためにルートディレクトリーの.exercism/metadata.jsonファイルを使うからです。

テストをコンパイルするには、ルートディレクトリーでexercism testと入力するだけです。すると、コンパイル時のエラーが出るはずです。 エラーを修正したら、もう一度exercism testを実行すると、Exercism CLIがテストをビルドして実行します。