スポンサーリンク
スポンサーリンク

C#によるスタブ(Stub)の作り方

.NET CoreC#Visual StudioWindowsフォームアプリスタブ開発方式

数千万円以上する他社製品を操作するアプリの開発を行う場合、他社製品に接続できるのは現地だけで、開発作業を行うローカルPCからは他社製品に接続できないなど、作業できる環境が限られ、デバッグ作業が思うように進まないということがよく起きます。
その場合、他社製品のI/F仕様と一致するStubを作成し、開発作業を行うローカルPCでは、Stubを使いデバッグや試験を進めることで、開発作業のスピードと精度を上げ、現地で発生する問題は、他社製品側の不具合のみとすることができます。

他社製品とセットで提供される、他社製品を操作する為のI/Fライブラリ(DLL)から、Publicのメソッドだけをピックアップし、I/Fの側(がわ)だけを実装したStubを作れば、他社製品に接続できないローカルでも、デバッグや試験を進めることが出来ます。

数千万円以上する他社製品に接続する為のI/Fライブラリは、DLLで提供されることが多いので、今回、他社から提供されたDLLのStubを、どうやって作るのか纏めました。

モック(Moq)じゃないです、スタブ(Stub)です。
モックとスタブの区別がつかず、スタブを作る話をしていて「それモックだろ!?」と言って来る人、多過ぎ。

ソースコードはGitHubで公開しています。
.Net Coreをベースに作りましたが、.Net Framework でも同じ実装になります。

 

他社製品 I/Fライブラリ(DLL)

他社製品 I/Fライブラリ(DLL)として、ThirdPartyProducts.dll を作成しました。

仕様

  • IsStartedプロパティ:操作対象が起動済みかなどのステータスを返す。
  • Startupメソッド:操作対象を起動する。
  • Transaction1メソッド:最初の処理を実行する。
  • Transaction2メソッド:次の処理を実行する。
  • Shutdownメソッド:操作対象を停止する。

 

Visual Studio プロジェクト

.Net Core 5.0 のクラスライブラリ。

 

ソースコード構成

ビルドすると ThirdPartyProducts.dll が作成される。

 

ソースコード解説

ThirdPartyProducts.sln

他社製品 I/Fライブラリ(DLL)のソリューション。

 

ThirdPartyProducts/ThirdPartyProducts.csproj

ThirdPartyProducts.dll のプロジェクト。

 

ThirdPartyProducts/enums.cs

ThirdPartyProducts.dll が返す、StatusとReturnCodeの、enumを纏めたソースファイル。

 

ThirdPartyProducts/ThirdPartyProductOps.cs

他社製品 I/Fライブラリ(DLL)のビジネスロジック。
他社製品 I/Fライブラリのサンプルなので、エラーチェックや、仕様に合わせた return値を返しているくらいで、内容はとくにないスケルトンになっています。

 

自社製品

他社製品 I/Fライブラリ(DLL)を通して、他社製品を画面から操作するアプリとして、Windows Formアプリを実装しました。
数千万円以上する他社製品を操作する為の業務アプリを開発するような場合、Windowsフォームアプリで実装していることが多い気がします。

下記動画は、他社製品 I/Fライブラリ(DLL)を仕様通り操作、実行していますが、これを現地じゃないと実行できないというのが問題になります。

 

仕様

  • Windows Formアプリの画面から、ThirdPartyProducts.dll の各I/Fを実行する。

 

Visual Studio プロジェクト

今回使った Visual Studio 2019 プロジェクト テンプレートは、.Net Core 5.0 の Windowsフォームアプリ。

 

ソースコード構成

 

ソースコード解説

InHouseProduct.sln

他社製品 I/Fライブラリ(DLL)を、自社製品 Windows Formアプリから実行するソリューション。

 

InHouseProduct/InHouseProduct.csproj

自社製品 Windows Formアプリのプロジェクト。
ThirdPartyProducts.dll を参照先に追加し使えるようにしている。

 

InHouseProduct/ThirdPartyProductsLib/ThirdPartyProducts.dll

ThirdPartyProducts.csproj のビルド結果DLLを配置し、InHouseProduct.csprojで参照設定している。

 

InHouseProduct/Form1.resx Form1.Designer.cs

他社製品 I/Fライブラリ(DLL)を操作する Windows Formアプリ画面の定義。
詳細は割愛します。

 

InHouseProduct/Form1.cs

他社製品 I/Fライブラリ(DLL)を操作する Windows Formアプリ画面のイベントハンドラ。
他社製品 I/Fライブラリの仕様通り、I/Fを順番に実行しています。
Debug.WriteLine()でイベントが実行されたことと実行結果が、分かるようにしています。

 

InHouseProduct/Program.cs

Visual Studioプロジェクトを新規作成してから変更はありません。

 

自社製品(Stub)

他社製品 I/Fライブラリ(DLL)のStubを作成し、自社製品の InHouseProductから、他社製品 I/Fライブラリ(DLL)ではなく、Stubを操作できるソリューションを新たに作成。

InHouseProduct.csproj は別のファイルですが、それ以外のファイルはリンクとして追加します。
InHouseProduct.csproj は、他社製品 I/Fライブラリ(DLL)ではなく、他社製品 I/Fライブラリ(DLL)のStubを参照させます。

他社製品 I/Fライブラリ(DLL)の仕様通りの順番で、処理が実行されていることをローカルでデバッグ、試験できます。

 

Visual Studio プロジェクト

InHouseProductは、.Net Core 5.0 の Windowsフォームアプリ。
ThirdPartyProducts_Strubは、.Net Core 5.0 のクラスライブラリ。

 

ソースコード構成

 

ソースコード解説

InHouseProduct_onStub.sln

他社製品 I/Fライブラリ(DLL)の Stubを、自社製品 Windows Formアプリから実行するソリューション。

 

ThirdPartyProducts_Strub/ThirdPartyProducts.csproj

他社製品 I/Fライブラリ(ThirdPartyProducts.dll)のStubプロジェクト。

 

ThirdPartyProducts_Strub/enums.cs

enums.csは、他社製品 I/Fライブラリ(DLL)の外部公開されている仕様書を元に作るか、ソースコードが提供されていればソースファイルからコピーするか、dotPeekで他社製品 I/Fライブラリ(DLL)を逆コンパイルするか、いくつかの方法で作ることができる。

 

ThirdPartyProducts_Strub/ThirdPartyProductOps.cs

他社製品 I/Fライブラリ(ThirdPartyProducts.dll)のStubプロジェクトのロジック。
ThirdPartyProducts.dllの I/Fは完全に合わせていますが、内部ロジックは何もないです。
Debug.WriteLine()をそれぞれのプロパティ/メソッドに追加し、プロパティ/メソッドが呼ばれたログとして使えるようにしています。
プロパティ/メソッドが呼ばれたログは、他社製品の仕様に沿って実行しているか、試験結果のエビデンスとして使えます。
Debug.WriteLine()だけではなく、ログファイルへ出力するのもお勧め。
作り方は enums.cs と同じ。

 

InHouseProduct/InHouseProduct.csproj

Stubプロジェクト(ThirdPartyProducts.csproj)を対象に、自社製品 Windows Formアプリを実行できるようにした、別の InHouseProduct.csprojプロジェクト。
InHouseProduct.csprojを分けて、他社製品 I/Fライブラリ(DLL)の参照先を、ThirdPartyProducts.dll ではなく、ThirdPartyProducts_Strubプロジェクトに変えています。

InHouseProduct.csprojファイル以外のオブジェクトは全て、自社製品側のオブジェクトに対するリンクとして追加している。

 

最新版ではより進化しています => スタブ(Stub)の作り方 v2

コメント