スポンサーリンク

Visual Studio CodeでF#のUnitテストの実行環境を整える

最近はVisual Studio CodeでF#を書いているのですが、Unitテストの実行環境を整えるのに地味に苦戦したので、備忘も含めて記事にしました。

今回は実際の運用とかも考えてソリューションの作成から実施しますが、既存のプロジェクトやソリューションに対してテストを実行する場合は後半の拡張機能の設定の箇所のみを参考にしていただけたらと思います。

VS Codeの設定に関してはF#だけでなく、C#でもほぼ同じ手順で設定ができるので、C#で開発をしている方は適宜読み替えて設定してください。

VS CodeでF#のテスト実行環境を整える

テスト環境を整える前提としてF#の開発環境が整っている必要があります。

VS Codeでの開発環境の構築がまだの人は下記を参考に先に環境構築を実施してください。

ソリューションを作成する

ソリューションとは簡単に説明すると、複数のプロジェクトをまとめて管理、ビルドするための設定ファイルです。

今回はアプリ本体となるプロジェクト(TestingTargetApp)とテストコードを実装するプロジェクト(TestingSampleTests)の2つのプロジェクトを作成する予定なので、それらを管理するためのソリューションを作成します。

ソリューションを作成するには、まず任意のディレクトリに移動して下記のコマンドを実行します。

dotnet new sln -o TestingSampleProject

するとTestingSampleProjectというディレクトリが作成され、その中にTestingSampleProject.slnというファイルが作成されると思います。

% ls -Rl TestingSampleProject
-rw-r--r--  1 ibukish  staff  442  3 13 12:20 TestingSampleProject.sln

これでソリューションの作成は完了です。

プロジェクトを作成する

続いてプロジェクトを作成していきます。

今回はアプリ本体となるプロジェクト(TestingTargetApp)とテストコードを実装するプロジェクト(TestingSampleTests)の2つのプロジェクトを作成します。

アプリケーションのプロジェクトを作成する

今回はシンプルにコンソールアプリを作成しようと思います。

まず、先ほど作成したソリューションファイルがあるディレクトリに移動します。

cd TestingSampleProject

移動したら下記のコマンドを実行します。

dotnet new console -lang "F#" -o src/App/TestingTargetApp

これでTestingTargetAppという名前でコンソールアプリのプロジェクトが作成されました。

ディレクトリ構成的には下記のようになっていると思います。
※obj以下は省略

TestingSampleProject
  ├── TestingSampleProject.sln
  └── src
      └── App
          └── TestingTargetApp
              ├── Program.fs
              ├── TestingTargetApp.fsproj
              └── obj
                  ├── ...

テストのプロジェクトを作成する

続いてテストを実装するテスト用のプロジェクトを作成します。

テスト用のプロジェクトを作成する場合はプロジェクト名には注意をした方がいいです。

理由としては、後々テストプロジェクトのパスを正規表現を使って設定するのですが、一定の規則がないと設定がものすごくめんどくさくなるからです。

今回はテストプロジェクトの命名規則は{任意の文字列}Testsにしようと思います。ですので今後はテストプロジェクトの作成時はプロジェクト名の最後にTestsをつけるように命名していきます。

ではテスト用のプロジェクトの作成をしていきます。

まず、先ほど作成したソリューションファイルがあるディレクトリに移動します。
※すでにいる場合は移動不要です。

cd TestingSampleProject

dotnet newで選択できるテストプロジェクトのテンプレートはmstestnunitxunitの3種類がありますが、今回の目的は環境構築なのでそれぞれのテストのメリデメはこの場では考えずmstestを使って作成します。

移動したら下記のコマンドを実行します。

dotnet new mstest -lang F# -o src/Test/TestingSampleTests

これでテスト用のプロジェクトの作成は完了です。

1つ前の手順で作成したアプリケーションも含めてディレクトリ構成は下記のようになっていると思います。
※obj以下は省略

TestingSampleProject
  ├── TestingSampleProject.sln
  └── src
      ├── App
      │   └── TestingTargetApp
      │       ├── Program.fs
      │       ├── TestingTargetApp.fsproj
      │       └── obj/...
      └── Test
          └── TestingSampleTests
              ├── Program.fs
              ├── TestingSampleTests.fsproj
              ├── Tests.fs
              └── obj/...

プロジェクトの紐付けを実施する

プロジェクトを作成したら紐付け(ソリューションに追加する)が必要になります。

紐付けには下記のコマンドを実行します。
コマンドを実行する場所はTestingSampleProjectディレクトリ(TestingSampleProject.slnがある場所)です。

dotnet sln add src/App/TestingTargetApp/TestingTargetApp.fsproj
dotnet sln add src/Test/TestingSampleTests/TestingSampleTests.fsproj

これでアプリケーションとテストプロジェクトの追加が完了しました。

テストプロジェクトに参照を追加する

今回の場合だとTestingSampleTestsTestingTargetAppの実装をテストするためのテストコードを実装していくプロジェクトです。

ですのでTestingSampleTestsTestingTargetAppを参照することができる必要があるので参照の追加を実施します。

参照を追加するコマンドは下記です。

dotnet add src/Test/TestingSampleTests/TestingSampleTests.fsproj reference src/App/TestingTargetApp/TestingTargetApp.fsproj

これで必要なものの作成と設定は完了したので次はVisual Studio Codeの設定をしていきます。

Visual Studio Codeの設定をする

VS Codeでする設定は拡張機能のインストールとその拡張機能の設定です。

.NET Core Test Explorerをインストールする

.NET Core Test Explorerは簡単に言うとテストを視覚化してくれる拡張機能です。

.NET Core Test Explorer - Visual Studio Marketplace
Extension for Visual Studio Code - Test Explorer for .NET Core (MSTest, xUnit, NUnit)

まずVS Codeを起動します。

起動したらサイドバーの拡張機能を選択して、.NET Core Test Explorerで検索します。

.NET Core Test Explorerを検索する

見つかったらインストールをクリックしインストールします。

これで拡張機能.NET Core Test Explorerのインストールは完了です。

テストプロジェクトのパスを設定する

続いて先ほどインストールした.NET Core Test Explorerにテストプロジェクトのパスを設定していきます。

VS Codeを起動して、設定画面を開きます。

設定画面の開き方はCommand + ,(カンマ)です。
※WindowsやUbuntuの場合はCtrl + ,(カンマ)になります。

設定画面を開いたら.NET Core Test Explorerで検索します。

すると.NET Core Test Explorerに関する設定の一覧が見えると思います。

今回必須となる設定はTest Project Pathです。

Test Project Pathには下記の設定を入力します。

**/*Tests.fsproj

これを設定することによって、~Tests.fsprojで終わるプロジェクトファイルを持つプロジェクトのテストを認識してくれるようになります。

設定が完了したら左側のサイドバーにあるフラスコのマークをクリックします。

すると認識されたテストが表示されると思います。

テストプロジェクトのパスを設定して実行する

VS Codeで先ほど作成したプロジェクトを開いていない場合は何も表示されません。その場合はTestingSampleProjectディレクトリをVS Codeで開いてください。

テストを実行するには▶︎マークのボタンをクリックします。

するとテストプロジェクト作成時に初期実装されてるテストが実行されると思います。

そしてテストが成功したら左側に緑色の✔︎が付くと思います。

ちなみに失敗した場合は赤色で×がつきます。

無事にテストが通れば実行環境の構築は完了です。

【任意】.NET Core Test Explorerのその他の設定

ここに記載する設定は必須ではありませんが、個人的には便利だったので設定しているものを紹介します。

ここに関しては使いながら都度更新を加えていく予定です。

Tree Modeの設定

Tree Modeとはテストケースの表示の方法(どれだけ詳細に表示するか)です。デフォルトではmergedになっており、これは複数のnamespaceを1つのノードとしてまとめて表示するものです。

それでも問題はないのですが、テストケースが増えていくとnamespace単位での細かいテストの実行が難しくなることを懸念し、自分はfullを選択しました。

fullの場合は複数のnamespaceをまとめることなく表示するので、namespace単位でのテストの実行が可能になります。

Tree Modeの設定を変更する

今のところは他の設定はそのままでも問題なく使うことができているので紹介はTree Modeだけになります。

おまけ

せっかくプロジェクトを作成したので試しにテストを実装してみます。

TDD的な流れて実装していこうと思います。

まずはTestingTargetApp/src/Test/TestingSampleTests/Tests.fsにテストコードを実装します。

実装は下記のようにしました。

namespace TestingSampleTests

open Microsoft.VisualStudio.TestTools.UnitTesting
open TestingSample

[<TestClass>]
type TestClass() =

    [<TestMethod>]
    member this.TestMethodPassing() = Assert.IsTrue(true)

    [<TestMethod>]
    member this.``success test``() =
        CalcSampleCls.add (1, 2)
        |> (fun res -> Assert.AreEqual(res, 3.0))

    [<TestMethod>]
    member this.``failed test``() =
        CalcSampleCls.add (10, 20)
        |> (fun res -> Assert.AreEqual(res, 30))

既存のコードに成功するケースと失敗するケースのテストコードを追加しました。

追加したのは3行目と12行目以降です。

当然ながらこのままではテストがテストが落ちるので実装していきます。

テストコードから読み取れる期待される関数としては、intを渡して足し算をしてdoubleで返却する関数です。

本来であればAreNotEqualを使ったりして期待値ではない値が返ってくることを検証すべきですが、今回は失敗したらどのようになるのかを見てみたいのであえて失敗ケースでテストが失敗するように実装してます。

実装を書くのはTestingSampleProject/src/App/TestingTargetApp/Program.fsです。

実装としては下記のようになりました。

module TestingSample

// For more information see https://aka.ms/fsharp-console-apps
printfn "Hello from F#"

type CalcSampleCls() =
    static member add(a: int, b: int) = a + b |> double

こちらも既存のコードに実装を追加しています。

追加したのは1行目のモジュール名の設定と6行目以降のクラスと関数です。

実装は完了したので、実際にテストを動かしてみます。

テストを実行すると期待通りに成功と失敗をしました。

失敗した箇所はハイライトされるのでわかりやすいですね。

テスト実行する

無事にテストが実行できたので満足です!

まとめ

今回はとりあえずテストが実行できる環境を整えました!

今後は3つあるテストのテンプレートがそれぞれどんな特徴があるのか調査していきたいと思います。

F#環境構築
スポンサーリンク
ibukishをフォローする
スポンサーリンク
ibukish Lab+

コメント

タイトルとURLをコピーしました