4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FileMakerAdvent Calendar 2022

Day 4

トランザクション処理でテストが容易になる?

Posted at

ver19.6でトランザクション処理ステップが実装されましたね。これでテストコードがある程度書けるかな? と思った人多いと思うので、ちょっとそれっぽい事をやってみました。まだ1日しか触ってないので十分理解してない部分もありますが。

流れとして、テストしたいスクリプトをトランザクションで囲み、スクリプトの結果でテストメッセージを作成するという感じでそれっぽくなるかなと。

例えば、引数で受け取った値を使って新規レコードを作成するスクリプトがあるとします。

テスト対象のスクリプト
変数を設定[$name; 値: Get(スクリプト引数)]
新規レコード/検索条件
フィールド設定[名前 ; $name]
レコード/検索条件確定

#エラーをJSONに
変数を設定[$lastError; 値 : Get(最終エラー)]
変数を設定[$lastErrorLocation; 値 : Get(最終エラー位置)]
変数を設定[$errorJson; 値 : 
JSONSetElement ( "";
["errorCode";$lastError;JSONString];
["lastErrorLocation";$lastErrorLocation;JSONString]
 )]

#テストしたいフィールドの値
変数を設定[$nameFieldValue;  値: 名前フィールド]
変数を設定[$testField ; 値 : JSONSetElement ( "";"name";$nameFieldValue;JSONString)
変数を設定[result ; 値 : 
JSONSetElement ( "";
["testField";$testField;JSONObject];
["error";$errorJson;JSONObject]
)

現在のスクリプト終了[テキスト結果: $result]

このスクリプトの結果として、名前フィールドの値が引数で受け取った値と一致するかどうかのテストコードを書くとすると、

テストスクリプト
トランザクションを開く[]

    スクリプト実行[テストしたいスクリプト ; 引数: "田中"]
    変数を設定[$scriptResult ; 値: Get(スクリプトの結果 )]
    変数を設定[$error ; 値 : JSONGetElement($scriptResult; "error"]
    トランザクションの復帰[エラーコード: 5001 ; エラーメッセージ: $error]

トランザクションの確定

#この時点でレコード作成はキャンセルされているので、スクリプトの結果を使ってテストができる。

============
#名前フィールドの値は"田中"でなければならない。
============
#テストしたいフィールドの値
変数を設定[$nameFieldValue ; 値 : JSONGetElement($scriptResult; "testField.name")]

#スクリプトの結果として受けとった$nameFieldValueが、"田中"だったら、テストは合格となる
If [$nameFieldValue = "田中"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "failed"]
End If

現在のスクリプト終了[テキスト結果: $message]

以上はごく簡単なやつですが、
例えばフィールドに計算式を使っていて、その値が正しくセットされているか?というテストの場合。
一例として電話番号を入力すると、先頭に国番号を付与して最初の0を取るという計算式がフィールドに仕込みまれているとします。
08011112222なら、
計算式 "+81" & Right ( Self; Length ( Self )-1 )
が適用されて、
+8111112222
となるフィールドがあるとします。

これも引数で電話番号を受け取るとして、上記と同じようなスクリプト(名前フィールドの部分を電話番号に置き換えて下さい)があった場合、

テストスクリプト
#引数として"08011112222"という番号をテスト対象のスクリプトに渡し、そのスクリプト結果を受け取り、
\\\\\\
以下省略
\\\\\\

============
#phoneNumberフィールドの値は""+811111222"でなければならない。
============
#テストしたいフィールドの値
変数を設定[$phoneNumberFieldValue ; 値 : JSONGetElement($scriptResult; "testField.phoneNumber")]

#スクリプトの結果として受けとった$phoneNumberFieldValueが、"+811111222"だったら、テストは合格となる
If [$phoneNumberFieldValue = "+811111222"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "phone field is wrong: expected = " & "+811111222" & "  received = " & $phoneNumberFieldValue]
End If

#わざとテストを失敗させる場合、
変数を設定[$phoneNumberFieldValue ; 値 : "11122223333"]
If [$phoneNumberFieldValue = "+811111222"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "phone field is wrong: expected = " & "+811111222" & "  received = " & $phoneNumberFieldValue]
End If

現在のスクリプト終了[テキスト結果: $message]

というふうにテストを故意に失敗させるケースも記述でき、そのテスト判定を返せます。

もちろん全てのテストをカバーできるとは思いませんが、テストを意識してスクリプトを細かく分割しておくと、かなりの部分がテストできる気がします。何より、このテストスクリプトにテスト意図をコメントで書いておけば、それがそのままドキュメントになります。

まとめ

FileMaker = データベースですので、どうしてもレコード作成が発生するケースが多く、テストをしても、それを元に戻す処理って本当に面倒でした。結局面倒なので手動で元に戻すという危ない事をよくやってました。
一番助かるのが外部webアプリからdataAPIを使ってFileMakerのレコードを作成するようなケースで、web側のテストコードの中にレコード作成系のテストを安全に組み込めるようになる事です。
いきなりこんな画期的ステップがアップデートで用意されて驚きです。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?