2

この質問Controlling how test data is generated in QuickCheck に似た問題があります。以下に、私の詳細、使用しているコード、および私が持っている特定の質問を明確にします。

フィボナッチ数列を入力として使用する fizz-buzz プログラムを作成しました。2つのことをテストしたいと思います。(1) 特定の条件を満たす Int を指定すると、プログラムは正しい文字列を出力しますか? (2) 私のフィボナッチジェネレーターはフィボナッチ数を生成していますか?

私が抱えている問題は、上記のリンクに似ています。sの範囲Intが大きすぎます。最初の 1000 個のフィボナッチ数と言うようにテストを制限するにはどうすればよいですか?

これは、適切かつ最小限であると私が考えるコードです。詳しく説明する必要がある場合はお知らせください。

import           Data.Numbers.Primes (isPrime)
import           Test.Hspec  (Spec,hspec,describe,it,shouldBe)
import           Test.Hspec.QuickCheck (prop)

qcheck :: Spec
qcheck = do
  describe "QuickCheck test fiz" $
    prop "QuickCheck test" $ modfiz

  describe "QuickCheck test fib" $
    prop "QuickCheck test fib" $ testfib

modfiz int
  | int <= 0                                 = True  -- code smell, should never generate number less than or equal to zero.
  | int == 3                                 = test3
  | int == 5                                 = test5
  | int `mod` 15 == 0                        = testMod35
  | int `mod` 3 == 0                         = testMod3
  | int `mod` 5 == 0                         = testMod5
  | isPrime int == True                      = testPrime
  | otherwise                                = testRest
      where
        test3     =
          Right "Buzz BuzzFizz"     == fizzbuzz 3
        test5     =
          Right "Fizz BuzzFizz"     == fizzbuzz 5
        testMod3  =
          Right "Buzz "             == fizzbuzz int
        testMod5  =
          Right "Fizz "             == fizzbuzz int
        testMod35 =
          Right "Buzz Fizz "        == fizzbuzz int
        testPrime =
          Right "BuzzFizz"          == fizzbuzz int
        testRest  =
          Right (show int)          == fizzbuzz int

testfib :: Integer -> Bool
testfib n =
  case (fibb n) of
    Left _ -> False
    Right n' -> isFib n'

fibbを取り、Intその n 番目のフィボナッチを見つけます。そうfibb 6返しRight 8ます。Left値はこの問題には関係ありません。

私が気づいたのは、 a を記述し、 anewtypeをラップし[Int]て新しいArbitraryインスタンスを作成する必要があるという答えでした。ただし、答えは2012年のものであり、必要なことを実行できるように見えることにも気付きましQuickCheck 2Args datatypeArgsでは、テストの範囲を制限する (最初の 1000 個のフィボナッチ数が必要なだけ)、また実行するテストの数を制限するために、新しい を作成できますか? そうでない場合、上記のリンクの解決策は私が取らなければならないアプローチですか?

プロジェクト全体はこちら

4

1 に答える 1

1

型クラスについて知ることBoundedは別のプロジェクトに役立ちましたが、Haskell Cafe 1メーリング リストの意見に同意しnewtypeたので、次の方法で問題を解決することにしました。

qcheck :: Spec
qcheck = do
  describe "QuickCheck testing fizbuzz"     $
    modifyMaxSuccess (const 1000)           $
    prop  "Lowerbound: 0 Upperbound: 10000" $
    forAll (choose (1, 10000)) modfiz

  describe "QuickCheck test fibonacci generator" $
    modifyMaxSuccess (const 1000)                $
    prop "Lowerbound: 0 Upperbound: 10000"       $
    forAll (choose (1, 10000)) testfib

1 https://groups.google.com/forum/#!topic/haskell-cafe/y81Q5fXil34

于 2016-05-04T05:21:52.993 に答える