VB.NET WebFormで自動テストやってみた

自動テスト文化のあった部署からない部署に異動したので、さてここにも新しい文化を根付かせるかと意気込んでいたのですが、なかなかうまくいかなかったのでメモとして投稿します。

# 開発環境
異動後のプロジェクトは以下の開発環境で開発をしていました。
- Windows10 Pro
- VB.NET Framework 4.8
- ASP.NET Webアプリケーション
- Microsoft Visual Studio Ultimate 2013

本当はGitではなくvssを使っていたりとびっくり仰天な状況だったのですが、それはまた別の話。

# 方針
何が難しいかというと、今回の対象はASP.NET Webアプリケーションだということです。単体テストプロジェクトを追加しても、Webアプリケーションの各ページの.aspx.vbを対象にすることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/c058ffea-b573-3d4f-84da-85ba775baf4a.png)
じゃあどうするかというと、.aspxの各ページをdll化してやります。


# 導入手順

苦労の末、[先駆者様][ref-1]の記事を見つけて安心していたのですが、10年前の記事の上に、

> ASP.NET WebFormはUnitTestにすばらしく向いていないため、

といきなり書いてあったので「やめちゃおっかな……」とか心が折れかけてました。


## テスト対象のコードをプリコンパイルする
今回これは既存プロジェクトに存在する.aspx.vbを対象としました。これをaspnet_compiler.exeを使ってプリコンパイルしてdllを生成します。在り処は`C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe`でした。.NETには詳しくないので、環境に合わせて探してください。

それを使って、コマンドプロンプトから以下のコマンドを叩きます（今回は10～20秒程度掛かりました）。
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe
-p C:\～～(Webサイトのあるパス) -v -f C:\～～(出力先フォルダのパス) -fixednames
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/37d3e5b5-c0aa-f13d-cf7d-961c9d3d2dbc.png)

上の画像では途中で警告が表示されていますが、問題なく完了しました。各ページのコンパイル後のdll名が毎回変わって面倒なので、-fixednamesオプションをつけて同じ名前で出力させるようにします。-vオプションについてはリサーチ不足で何物なのか不明ですが、必要です。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/0eb3d525-03fc-90b8-d056-f862cf2b2435.png)
完了後、`(出力先フォルダのパス)\bin`内にたくさんファイルが出力されていると思いますが、各ページの.dllが`App_Web_xxx.aspx.hogehoge.dll`という名前のファイルを使います。


## テストコードプロジェクトを準備する
同じソリューション内にテストコード用のプロジェクトを追加してください。先述したとおり、単体テストプロジェクトは使えませんので、テストコードは通常のクラスライブラリに書きます。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/00ecb1a0-864a-5c0e-10b8-806834d27552.png)

参照に、先程出力したdllを追加してください。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/51eb0959-5265-18fe-1e1c-c8a6ec22c3d6.png)


## NUnitをインストールする
NUnitを使ってテストしたいので、NuGetパッケージマネージャーから追加していくのですが、パッケージの情報が取得できない場合があるので、先にパッケージマネージャーコンソールを起動しておきます。`visual studioのメニュー＞ツール＞NuGetパッケージマネージャー＞パッケージマネージャーコンソール`で起動します。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/5353e809-77c9-7cc0-9cef-8212c73fbf4b.png)

コンソールが起動していればOKです！
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/ef0d4e3d-f2c3-a92d-be3c-4ba7de0f4314.png)

対象プロジェクトにNUnitおよびNUnit3 Test Adapterをインストールします。
`対象のプロジェクトを右クリック＞NuGetパッケージの管理…`で管理画面が表示されます。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/a232a3ae-93bd-7bf0-6571-9adb6de9ec73.png)
「nunit」と検索して出てくる「NUnit」と「NUnit3 Test Adapter」をそれぞれインストールしてください。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555280/ea01c489-a82d-ee42-f214-dcaf59e36aa7.png)


## テストコードを書く
NUnit.Frameworkとテストしたい画面をimportsして、あとは普段どおりテストコードを書けばOKです。テストコードの書き方はググればわかりますのでそちらを参照されたし。

```
Imports NUnit.Framework
Imports hogepage(テスト対象にしたい画面)

Namespace hogehogenamespace
    <TestFixture>
    Public Class SampleTest

        <TestCase>
        Public Sub TestSampleTestCode()
            Dim page = New Global.hogepage()

            Assert.AreEqual(0, page.somefunction())

        End Sub

    End Class

End Namespace
```


# 今後
ひとまずテストコードが書けることがわかったので、これをどうにかして運用できないか考えます。既存のプロジェクトを使って試運転したのもあって、プリコンパイルに時間が掛かったのですが、手順がえらい面倒なのでテスト駆動開発にはあまり向いてないかもしれません……。

[ref-1]: http://sctfarch.blogspot.com/2012/01/aspnet-webformnunitunittest.html