2018年10月27日土曜日

FitSharp を .NET Core で実行してみる手順

Ubuntu上でFitNesseをインストール、.NETCoreのプロジェクトにFitSharpを追加して、テストページを作って、とりあえず実行してみるまでの手順。
(コーディングはWindows環境下でやっていたので、途中にWindowsでの手順含む。スイマヘン;)
前提条件: Java と.NET Core のSDKはインストール済

FitNesseのインストール:


FitNesse は、”fitnesse-standalone.jar” と Javaさえあれば、動作する。配置するフォルダは、任意で問題ない。Windows でも同様。。


実行コマンド:
cd /usr/local/bin
mkdir fitnesse
cd fitnesse
wget "http://fitnesse.org/fitnesse-standalone.jar?responder=releaseDownload&release=20180127" -O fitnesse-standalone.jar

※念のため:fitnesse-standalone.jar を配置するフォルダは上記以外の場所でも問題ないです※


FitNesse起動:

java -jar fitnesse-standalone.jar -p 8989

-p で指定しているポート番号で動作します。上記の番号は適当です。空いてる番号であれば、何でも良い。

アクセス:
http://(貴方のIP):8989

こんな感じに表示されるはず:


FitSharp向けプロジェクトのセットアップ


.NET Core でビルドされているプロジェクトであれば、FitSharp でテストケースを実行できるはず。
(ここだけWindows;)

プロジェクトに必要な設定など


依存関係で、 Nuget パッケージの FitSharp を追加する。
プロジェクトの「依存関係」を右クリック > NuGetパッケージの管理をクリック

開いたウィンドウで参照をクリックして、「FitSharp」と入力して、選択:

右側で「インストール」をクリック

動作確認向けに、テストクラスを作る


fit.XXXXFixture みたいなクラスを必要に応じて継承したクラスを作る。
FitSharp の XXXFixture の説明は以下ページ:

とりあえず、動作確認さえできれば良いという程度のものを。。
例)
    public class Class1 : fit.ColumnFixture

    {

           public int value1;

           public int value2;



       public int Add()

       {

               return value1 + value2;

       }

    }


FitNesse 向けの設定ファイルを作る


プロジェクト直下に、FitSharp実行向けの設定を保持する.xmlファイルを作る。
ここでは適当に「mysuiteconfig.xml」とゆー名前で作ったものと仮定する。。
こんな中身:
<?xml version="1.0" encoding="utf-8" ?>

<suiteConfig>

 <ApplicationUnderTest>

    <AddAssembly>(プロジェクトまでのパス)/bin/Debug/netcoreapp2.1/(プロジェクト名).dll</AddAssembly>

    <AddNamespace>(テスト対象の名前空間名)</AddNamespace>

 </ApplicationUnderTest>

 <Settings>

    <Runner>fitnesse.fitserver.FitServer</Runner>

 </Settings>

</suiteConfig>


ここで、最低限、テスト対象のアセンブリのパスと、FitSharpのテストランナーを指定する必要がある。パスは、FitNesseを実行する環境のパスを記載のこと。

ここまでに作ったプロジェクトを、FitNesse を置いた環境に持っていき、ビルド。
ソリューションを配置しているフォルダまで cd で移動して、dotnet build
 を実行で、ビルドができる。

FitNesseで試験向けのページ追加


FitNesse 上のWikiページで「Add > TestPage」をクリック


ページの内容(作成例):

!define COMMAND_PATTERN {%m (FitSharpの配置されているディレクトリ)/Runner.dll -c (プロジェクトのディレクトリ)/mysuiteconfig.xml %p}
!define TEST_RUNNER {dotnet}

|Class1|
|value1|value2|Add?|
|10    |2     |12  |
|12    |3     |15  |
|100   |4     |104 |

※補足:
FitSharp の dll は、ビルドしたならば以下辺りにあるはず:
Ubuntu:
$HOME/.nuget/packages/fitsharp/2.7.0/lib/netcoreapp2.0/

Win:
%HOMEPATH%\.nuget\packages\fitsharp\2.7.0\lib\netcoreapp2.0



こんなページとして表示されるはず:


全てが正しく設定されていれば、左上の「Test」リンクをクリックで、テストが実行されるはず。。 
なのだが、FitSharp 2.7.0時点で、Ubuntu18.04(Hyper-V上のVM)では正しく動かなかった。"fit.dll"が正しくロードされないとか、そんなエラーが起きている方は、下に記載した蛇足の情報が参考になる…かも。

参考:

FitSharp の設定を説明したページ:



蛇足の情報:UbuntuではFitSharpが簡単には動かなかった


発生した現象:


Windows 環境下では,NET Coreで動作させることが出来たが、 どうも、 Ubuntu18.04(Hyper-V上のVM)環境下では、うまくテストを実行できなかった。(fit.dll のアセンブリを読み込に失敗したようなエラーが起きる) 。多分、FitSharp version2.7.0固有の問題。


とりあえずの対応方法:

FitNesse を起動しているフォルダ配下に FitSharp のdllをコピーして置いてしまう。

簡単な例)
FitSharp のdll が保存されてる場所:
/home/hoge/.nuget/packages/fitsharp/2.7.0/lib/netcoreapp2.0/

FitNesseを実行したフォルダ:
/usr/local/bin/fitnesse

以下にfitSharpのdll(fit, fitSharp, Runner)をコピーする:
/usr/local/bin/fitnesse/home/hoge/.nuget/packages/fitsharp/2.7.0/lib/netcoreapp2.0/

上記のようにFitNesse実行中のフォルダに対応するフォルダを作ってdllをコピーすれば、動くことは動くはず。

原因(多分):


ApplicationUnderTestクラスの内部クラスAssembliesクラスの AddAssembly メソッドで、 Windows 環境専門のロジックになっているから??
この部分:
var assemblyName = name.StartsWith("file:///") ? name.Substring(8) : name;

上記コードの”name”にはアセンブリのCodeBase の中身が設定されるが、自環境ではCodeBaseは以下のように戻ってきた(パスの中身は気にしないで):
Win:
file:///C:/Users/mgggt/sources/fitsharp-master/source/netcore/Runner/bin/Debug/netcoreapp2.0/fit.dll

Ubuntu(Hyper-V上のVM):
file:///var/lib/jenkins/workspace/DotNetCoreWebSample/FTest/fs/fit.dll


0ベースの8文字目スタートだと、Ubuntu側が相対パス扱いになって、正しく読み取れない。で、エラーになる(んだと思う。VMとかその他環境要因があるかは調べてない)。


その他対応案:


エラーの原因(?)になっていると思われる name.substring(8) を new Uri(name).LocalPath に置き換え、ビルドして.dll作り直すのが一番楽と言う気がした。。
(一応動作することは確認)
こうする:
var assemblyName = name.StartsWith("file:///") ? new Uri(name).LocalPath : name;


参考情報:

上記のパス変換方法をこたえていた回答部分: