高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

Lazarusでテストを書く

このブログはLazarus(FreePascal)アドベントカレンダー5日目の記事です。

qiita.com

5日目はおまちかね(?)テストについて。

コンパイルして動かすLazarusのプログラムはとくに、メソッドを作ったときのテストがないのは不安です。

なのでとりあえず、Lazarusでテストプロジェクトをつくって、それを実行してみます。

Lazarus(というかFreePascal)のテストフレームワーク:FPCUnit

FreePascalのテストフレームワークとしては、FPCUnitというものがあります。

LazarusにはこのFPCUnitを使ったテストプロジェクトを作成するためのテンプレートが装備されているため、これを使うのが便利です。

f:id:TakamiChie:20211203182319p:plain
テストプロジェクトの作成

ファイルメニューの「新規…」より、FPCUnit Test Applicationを選択します。

なお、GUIを操作するのは地味に面倒くさいのでFPCUnit Console Test Applicationを使えば良いじゃん という風には思ったのですが、ちょっと使ってみた感じ使い方がよくわかりませんでした…。

そのため、今回はとりあえずGUIのあるほうを選びます。

プロジェクトグループを作る

上記の通りですが、Lazarusのテストはテストプロジェクトという形で作成していきます。

アプリ開発の最中にメインのプロジェクトとテストプロジェクトを行ったり来たりするのは面倒なので、プロジェクトグループを作っておくと良いでしょう。

プロジェクトグループの作り方については、二日目の記事にも書いたので、そちらを参照。

devblog.onpu-tamago.net

メインプロジェクトとは別に、テストプロジェクトを作り、テスト対象となるユニットファイルをプロジェクトエクスプローラの「追加」ボタンより追加していきます。

f:id:TakamiChie:20211203182232p:plain
プロジェクトエクスプローラ

Lazarusはユニットファイルが構築パスに入っていればどこに置いていてもファイル名で参照できるので、ファイルの置き場は特に気にする必要はありません。

テストユニットを作る

テストユニットファイルは、同じく新規ダイアログより、FPCUnit Test Caseを使います。

f:id:TakamiChie:20211203182855p:plain
FPC Unit 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;

使用したクラスの解放は… まあ、忘れたところでどうせテストなのでそんなに問題になることもないかと思いますが、いちおうクセをつけておくと良いかと。

いざ実行

いざいくつかテストを作って実行すると次のようなアプリが起動します。

f:id:TakamiChie:20211203183906p:plain
テストアプリ実行環境

使い方に迷うことはまあないと思いますが、ツールバーの▶ボタンを押すとテストが実行されます。結果はXMLで出力することもできるようです。

スクリプトファイルの読み込みやリソースなどは、なるべく本プロジェクトと共有しない

またここからは一般的なテスト作成の方針になるとは思いますが、プログラムの中でスクリプトファイルの読み込みやリソースファイルを使用する際は、本プロジェクトとは別のものを使うと良いでしょう。

あとあと本プロジェクトの側で修正が必要になった場合、テストの書き換えが必要になる場合があります。

面倒でも同じようなリソースファイルをテスト用に作っておくと良いでしょう。