DelphiにはDUnitが含まれていて、ユニットテストを作成するのに使える。
以前使ったことはあるけど、書いていなかったので書いとく。
DelphiXE3で試した。
テストプロジェクトを作成する
テストを実行するテストランナーは、ビルドして実行ファイルの状態で実行することになるので、テスト用のプロジェクトをまずは作成する。
DUnitの場合、新規作成-その他-テストプロジェクトでウィザードを使って作成できる。
GUIでもCUIでもいいけど、今回はGUI。
MyUnitTest.dpr
program MyUnitTest; {$IFDEF CONSOLE_TESTRUNNER} {$APPTYPE CONSOLE} {$ENDIF} uses DUnitTestRunner, uMyTest in 'uMyTest.pas'; {$R *.RES} begin DUnitTestRunner.RunRegisteredTests; end.
CONSOLE_TESTRUNNERのシンボルを指定するとCUIのテストランナーになる。
テスト対象のユニット
今回テストするユニットは以下のようなAdd関数。
uCalc.pas
unit uCalc; interface function Add(A, B: Integer): Integer; implementation function Add(A, B: Integer): Integer; begin Result := A + B; end; end.
テストケースを作成する
関数が対象の場合、DelphiXE3の新規作成のテストケース作成のウィザードでは作れないっぽい。
なので、ユニットを追加して自分で書く。
uMyTest.pas
unit uMyTest; interface uses TestFramework, uCalc; type TMyTestCase = class(TTestCase) published procedure TestAdd; end; implementation procedure TMyTestCase.TestAdd; begin Check(uCalc.Add(10, 20) = 30); end; initialization RegisterTest(TMyTestCase.Suite); end.
initialization節でRegisterTestを呼び出して、テストケースを登録している。忘れがち。
実行結果
GUIの場合はアプリケーションを起動して、テスト開始のボタンをクリックすればテストが実行される。
感想
DUnitは相変わらずだなーという印象。OSXの場合はCUIのみサポートっぽい。
Jenkinsでテストの結果を集計したい場合はテスト結果のフォーマットを変えないといけないのかな。
SynopseのTSynTestCaseのほうが良さそうに見えるけど、どうだろうか?
2012/11/08追記
DUnitのソースコード読んでみたらいろいろ機能持ってることがわかった。TSynTestCaseより全然いい。なるほどがんばってらっしゃる。