このブログはLazarus(FreePascal)アドベントカレンダー5日目の記事です。
5日目はおまちかね(?)テストについて。
コンパイルして動かすLazarusのプログラムはとくに、メソッドを作ったときのテストがないのは不安です。
なのでとりあえず、Lazarusでテストプロジェクトをつくって、それを実行してみます。
Lazarus(というかFreePascal)のテストフレームワーク:FPCUnit
FreePascalのテストフレームワークとしては、FPCUnitというものがあります。
LazarusにはこのFPCUnitを使ったテストプロジェクトを作成するためのテンプレートが装備されているため、これを使うのが便利です。
ファイルメニューの「新規…」より、FPCUnit Test Applicationを選択します。
なお、GUIを操作するのは地味に面倒くさいのでFPCUnit Console Test Applicationを使えば良いじゃん という風には思ったのですが、ちょっと使ってみた感じ使い方がよくわかりませんでした…。
そのため、今回はとりあえずGUIのあるほうを選びます。
プロジェクトグループを作る
上記の通りですが、Lazarusのテストはテストプロジェクトという形で作成していきます。
アプリ開発の最中にメインのプロジェクトとテストプロジェクトを行ったり来たりするのは面倒なので、プロジェクトグループを作っておくと良いでしょう。
プロジェクトグループの作り方については、二日目の記事にも書いたので、そちらを参照。
メインプロジェクトとは別に、テストプロジェクトを作り、テスト対象となるユニットファイルをプロジェクトエクスプローラの「追加」ボタンより追加していきます。
Lazarusはユニットファイルが構築パスに入っていればどこに置いていてもファイル名で参照できるので、ファイルの置き場は特に気にする必要はありません。
テストユニットを作る
テストユニットファイルは、同じく新規ダイアログより、FPCUnit Test Caseを使います。
テストケース名と'Setup'メソッド等を作成するかどうか聞かれますので、適当な値を設定してOK。
テストのやり方は、ほかの一般的な○○○Unitと同様、処理対象のメソッドを呼んだあと、その戻り値を期待値とAssertEqualsメソッドで照合します。
procedure TScriptProcessTestCase.TestLaunchProgram; var Proc : TScriptProcess; StdOut, StdErr: String; begin Proc := TScriptProcess.Create(); try Proc.Execute('scripts\\SPTEST_TestScript.py', StdOut, StdErr); AssertEquals(StdOut, 'Hello This Is a TEST' + #13#10); finally Proc.Free; end; end;
使用したクラスの解放は… まあ、忘れたところでどうせテストなのでそんなに問題になることもないかと思いますが、いちおうクセをつけておくと良いかと。
いざ実行
いざいくつかテストを作って実行すると次のようなアプリが起動します。
使い方に迷うことはまあないと思いますが、ツールバーの▶ボタンを押すとテストが実行されます。結果はXMLで出力することもできるようです。
スクリプトファイルの読み込みやリソースなどは、なるべく本プロジェクトと共有しない
またここからは一般的なテスト作成の方針になるとは思いますが、プログラムの中でスクリプトファイルの読み込みやリソースファイルを使用する際は、本プロジェクトとは別のものを使うと良いでしょう。
あとあと本プロジェクトの側で修正が必要になった場合、テストの書き換えが必要になる場合があります。
面倒でも同じようなリソースファイルをテスト用に作っておくと良いでしょう。