4

自分のタイプのインスタンスを生成するランダムジェネレーターをテストしています。そのために、私は次のカスタムインスタンスを持っていますArbitrary

complexGenerator :: (RandomGen g) => g -> (MyType, g)

instance Arbitrary MyType where
    arbitrary = liftM (fst . complexGenerator . mkStdGen) arbitrary

これは、生成された値が特定のプロパティを保持していることをテストするためTest.QuickCheckに(実際には)とうまく機能します。Test.Frameworkただし、確認したいプロパティはかなりあります。追加するほど、すべてのプロパティを確認するのに時間がかかります。

毎回新しく生成するのではなく、すべてのプロパティをテストするために同じ生成値を使用する方法はありますか?私は明らかに、失敗時にどのプロパティが保持されなかったかを確認したいので、1つの巨大なプロパティを作成することandは最適ではありません。

4

2 に答える 2

3

私は明らかに、失敗時にどのプロパティが保持されなかったかを確認したいので、1つの巨大なプロパティを作成することandは最適ではありません。

printTestCaseを使用して巨大なプロパティを作成する前に、を使用して各プロパティにラベルを付けることができますconjoin

たとえば、これは悪い考えだと思っていました。

prop_giant :: MyType -> Bool
prop_giant x = and [prop_one x, prop_two x, prop_three x]

これは効率的ですが、より良い出力が得られます。

prop_giant :: MyType -> Property
prop_giant x = conjoin [printTestCase "one" $ prop_one x,
                        printTestCase "two" $ prop_two x,
                        printTestCase "three" $ prop_three x]

(とは言っても、私はこの方法を自分で使用したことはなく、機能すると想定しているだけです。conjoinおそらく、ドキュメントで実験的なものとしてマークされています。)

于 2013-03-10T10:36:49.867 に答える