私は を使った最初の実際の作業を行っていsmallcheck
ますが、パラメーターの使用方法について少し混乱していDepth
ます。その前に、私が何smallcheck
のために使っているかを述べさせてください。
仕事では、社内データベースの前に単純な Web サービスを構築しています。Web サービスはいくつかのクエリを実行し、JSON にシリアル化されたクエリ結果で応答します。私が現在取り組んでいるのは、クエリの結果を表すオブジェクトが与えられた場合、このオブジェクトが期待される JSON を生成するという保証です。例えば:
data Action
= Action { actionType :: !ActionType
, actionDescription :: !Text
, actionPerformedAt :: !UTCTime
, actionAgentName :: !Text
}
次のような JSON を生成する必要があります。
{
"type": "Booking",
"description": "Whatever",
"performedAt": "2012-01-04",
"agent": "Tom"
}
これは にとって理想的なタスクのように見えましたsmallcheck
。私はこれを次のように定式化しました。
testAction :: Tasty.TestTree
testAction = Tasty.testGroup "Action"
[ SmallCheck.testProperty "type" $
SmallCheck.over actions $ match $
Aeson.key "type" --> Aeson.toJSON . actionType
, SmallCheck.testProperty "dateActioned" $
SmallCheck.over actions $ match $
Aeson.key "dateActioned" --> expectedUTCTimeEncoding . actionPerformedAt
-- and so on
]
-- (-->) :: Eq a => lens-aeson traversal a -> (b -> a) -> b -> Bool
-- actions :: Monad m => SmallCheck.Series m Action
フレームワークのデフォルトのsmallcheck
深さtasty
は 5 です。これにより、まだ終了していないテスト実行が行われます。smallcheck
にはchangeDepth
とchangeDepth1
関数があるため、これらを使用して、テストが常に適切な時間内に実行されるようにすることができます。changeDepth (const 3)
だけど、こうするとどこかズレてる気がして仕方ないのでは?たとえば、コマンド ライン オプションを変更してテストを実行するだけでは、より長いテスト (おそらく一晩中) を実行することはできなくなりました。一方、 を使用changeDepth (- 2)
した場合でも、テストがどのように実行されるかを仮定しているように感じます! おそらく、5 のグローバル テスト深さはn秒で実行され、適切と思われる深さを調整するのは各プロパティ次第であると仮定するのが最善でしょうか?
のこのより実用的な側面について、フィードバックをお待ちしておりますsmallcheck
。