自動テスト文化のあった部署からない部署に異動したので、さてここにも新しい文化を根付かせるかと意気込んでいたのですが、なかなかうまくいかなかったのでメモとして投稿します。
開発環境
異動後のプロジェクトは以下の開発環境で開発をしていました。
- Windows10 Pro
- VB.NET Framework 4.8
- ASP.NET Webアプリケーション
- Microsoft Visual Studio Ultimate 2013
本当はGitではなくvssを使っていたりとびっくり仰天な状況だったのですが、それはまた別の話。
方針
何が難しいかというと、今回の対象はASP.NET Webアプリケーションだということです。単体テストプロジェクトを追加しても、Webアプリケーションの各ページの.aspx.vbを対象にすることができません。
じゃあどうするかというと、.aspxの各ページをdll化してやります。
導入手順
苦労の末、先駆者様の記事を見つけて安心していたのですが、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
上の画像では途中で警告が表示されていますが、問題なく完了しました。各ページのコンパイル後のdll名が毎回変わって面倒なので、-fixednamesオプションをつけて同じ名前で出力させるようにします。-vオプションについてはリサーチ不足で何物なのか不明ですが、必要です。
完了後、(出力先フォルダのパス)\bin
内にたくさんファイルが出力されていると思いますが、各ページの.dllがApp_Web_xxx.aspx.hogehoge.dll
という名前のファイルを使います。
テストコードプロジェクトを準備する
同じソリューション内にテストコード用のプロジェクトを追加してください。先述したとおり、単体テストプロジェクトは使えませんので、テストコードは通常のクラスライブラリに書きます。
NUnitをインストールする
NUnitを使ってテストしたいので、NuGetパッケージマネージャーから追加していくのですが、パッケージの情報が取得できない場合があるので、先にパッケージマネージャーコンソールを起動しておきます。visual studioのメニュー>ツール>NuGetパッケージマネージャー>パッケージマネージャーコンソール
で起動します。
対象プロジェクトにNUnitおよびNUnit3 Test Adapterをインストールします。
対象のプロジェクトを右クリック>NuGetパッケージの管理…
で管理画面が表示されます。
「nunit」と検索して出てくる「NUnit」と「NUnit3 Test Adapter」をそれぞれインストールしてください。
テストコードを書く
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
今後
ひとまずテストコードが書けることがわかったので、これをどうにかして運用できないか考えます。既存のプロジェクトを使って試運転したのもあって、プリコンパイルに時間が掛かったのですが、手順がえらい面倒なのでテスト駆動開発にはあまり向いてないかもしれません……。