クイックチェックを使用してモナドコードとモナド以外のコードをテストする方法を見てきましたが、エラーを処理するコードをテストするためにどうすればよいですか?exitWith
?QuickCheckを使用して意図的なエラー状態をテストする
5
A
答えて
4
私はQuickCheckの専門家ではありません。質問前にモナディックチェックの経験はありませんでしたが、新しいことを学ぶ機会としてstackoverflowが表示されています。これがうまくいっているというエキスパートの回答がある場合は、私を削除します。
test
は、exitWith
を使用して例外をスローする可能性があるとします。ここで私はあなたがそれをテストできると思います。キー機能はprotect
で、例外をキャッチしてテストすることができます。
import System.Exit
import Test.QuickCheck
import Test.QuickCheck.Property
import Test.QuickCheck.Monadic
test :: Int -> IO Int
test n | n > 100 = do exitWith $ ExitFailure 1
| otherwise = do print n
return n
purifyException :: (a -> IO b) -> a -> IO (Maybe b)
purifyException f x = protect (const Nothing) $ return . Just =<< f x
testProp :: Property
testProp = monadicIO $ do
input <- pick arbitrary
result <- run $ purifyException test $ input
assert $ if input <= 100 then result == Just input
else result == Nothing
これには2つの欠点がありますが、私には分かりますが、それ以上の方法はありません。
私は
protect
が扱うことができるAnException
からExitCode
例外を抽出する方法を発見しました。したがって、すべての終了コードはここで同じ扱いになります(これらはNothing
にマップされています)。私は持っていただろう:purifyException :: (a -> IO b) -> a -> IO (Either a ExitCode)
私はテストのI/O動作をテストする方法が見つかりませんでした。
test :: IO() test = do n <- readLn if n > 100 then exitWith $ ExitFailure 1 else print n
次に、どのようにあなたはそれをテストします:
test
だったと仮定?
私はさらに専門家の回答に感謝します。
2
QuickCheck expectFailure
機能を使用して、このタイプのものを処理できます。今、私たちは、エラー処理のいくつかのプロパティをテストすることができ
positive :: Int -> Either String Int
positive x | x > 0 = Right x
| otherwise = Left "not positive"
negative :: Int -> Either String Int
negative x | x < 0 = Right x
| otherwise = Left "not negative"
:
import System.Exit
import Test.QuickCheck
import Test.QuickCheck.Monadic
handle :: Either a b -> IO b
handle (Left _) = putStrLn "exception!" >> exitWith (ExitFailure 1)
handle (Right x) = return x
とダミー機能のカップルをかき立てる:この単純な(と-推奨されません)エラー処理フレームワークを取ります。まず、Right
値は、例外が発生してはならない。
prop_returnsHandledProperly (Positive x) = monadicIO $ do
noErr <- run $ handle (positive x)
assert $ noErr == x
-- Main*> quickCheck prop_returnsHandledProperly
-- +++ OK, passed 100 tests.
Lefts
は例外が発生しなければなりません。 expectFailure
が最初に付いていることに注意してください。
prop_handlesExitProperly (Positive x) = expectFailure . monadicIO $
run $ handle (negative x)
-- Main*> quickCheck prop_handlesExitProperly
-- +++ OK, failed as expected. Exception: 'exitWith: invalid argument (ExitFailure 0)' (after 1 test):
関連する問題
- 1. QuickCheckを使用したHaskell行列テスト
- 2. enum値を状態図の状態として使用するにはどうすればよいですか?
- 3. チェックボックスを使用して状態を動的に更新する
- 4. uncaught_exceptionを使用してエラー状態を処理する
- 5. 明示的な意図を持ったアンドロイドカメラを使用する
- 6. 意図的なアクションを使用してAndroidスタジオでKotlinクラスを作成する
- 7. #[テスト] sの間で動的な状態を共有する
- 8. 状態のモナドを使って明示的な状態を隠す
- 9. CabalでquickCheckテストを使用しますか?
- 10. Python 3の意図的なエラー
- 11. すべての意図的なエラーを素早く修正
- 12. 並行状態図
- 13. BPMN図の状態
- 14. オペレーティングシステムの状態図
- 15. Capybara AutomationとFactoryGirlを使用してテスト状態を中断する
- 16. C#Fitnesse + Slimを使用してFitnesseテストの状態を維持する方法
- 17. 状態図を作成するドラッグ/ドロップ
- 18. quickcheckの使用
- 19. QuickCheckで入力を生成してパーセルパーサーをテストする
- 20. Googleマップサポートフラグメントを使用したエラー状態エラー
- 21. 私的な状態を維持する
- 22. テストの目的でJS Alt Store状態を設定する
- 23. 遷移状態図Rは
- 24. オペレーティングシステム:プロセス状態遷移図
- 25. 視覚状態図エディタ
- 26. この関数のエラー状態をテストする方法は?
- 27. システムアイドル状態をチェックし、5分後にシステムをログアウト状態にする(使用していない場合)
- 28. ユーザサービスを使用して角度状態を動的にロードする方法
- 29. setTimeoutを連続的に使用して状態をreactjsで変更する
- 30. テスト用のJavaサーブレットの応答時間を意図的に遅くする
しかし、これはすべての種類の障害が予想されるようです。 'exitWith'呼び出しで生成されたものを分離できますか?私たちは失敗のコードが何であるかを主張することができますか? – nickie
@nickie終了コードに関するプロパティをテストする場合は、エラー処理自体に配管を追加することができます。私。 exitWithが呼び出す 'determineCode :: Aither a b - > ExitCode'関数を持ち、その動作についてアサーションを行います。さらに進むことができるかどうかは分かりません。 – jtobin
'expectFailure'は、すべてのテストが失敗した場合とは対照的に、テストが失敗した場合のように見えます。 – Dan