Подтвердить что ты не робот

Тестирование операций ввода-вывода с помощью Monadic QuickCheck

Может ли кто-нибудь дать мне краткий пример тестирования операций ввода-вывода с использованием Monadic QuickCheck?

4b9b3361

Ответ 1

Модуль Test.QuickCheck.Monadic позволяет протестировать монадический код, даже те, что работают в IO.

Тест монадического свойства имеет тип PropertyM m a, где m - это монада, в которой проходит тест, и a в конечном счете игнорируется. В случае PropertyM IO a вы конвертируете монадический тест в Property с помощью monadicIO; для всех других монадов вместо этого вы используете monadic (который принимает функцию для запуска монады, что-то IO не имеет).

В монадическом тесте значение return ed из монады игнорируется. Чтобы проверить выражение, используйте assert; assert ложное значение завершит тест. Используйте run для выполнения кода в проверяемой монаде.

В вашем распоряжении другие монадические действия. Например, pick будет генерировать новые тестовые входы из Gen a, а pre будет проверять предварительные условия теста. Они полезны, если сами тестовые входы или предусловия зависят от значений, вычисленных через проверяемую монаду, и в этом случае нормальный способ генерации входов или проверки предварительных условий не будет работать.

Вот пример тестирования некоторого кода IO: мы проверяем, что после записи чего-то во временный файл мы можем прочитать эти же данные обратно. Для демонстрационных целей мы наложим предварительное условие, чтобы мы пишем по крайней мере один байт в файл. Два тестовых свойства делают то же самое; один использует pick и pre без необходимости, а другой - нет.

import System.Directory (removeFile)
import System.IO (hGetContents, hPutStr, hSeek, openBinaryTempFile, SeekMode (..))
import Test.QuickCheck (arbitrary, Property, quickCheck, (==>))
import Test.QuickCheck.Monadic (assert, monadicIO, pick, pre, run)

-- Demonstrating pick and pre as well:
prop_writeThenRead :: Property
prop_writeThenRead = monadicIO $ do writtenData <- pick arbitrary
                                    pre $ not (null writtenData)
                                    readData <- run $ writeThenRead writtenData
                                    assert $ writtenData == readData

-- A more idiomatic way to write the above:
prop_writeThenRead2 :: [Char] -> Property
prop_writeThenRead2 writtenData = not (null writtenData) ==> monadicIO test
    where test = do readData <- run $ writeThenRead writtenData
                    assert $ writtenData == readData

writeThenRead :: [Char] -> IO [Char]
writeThenRead output = do (path, h) <- openBinaryTempFile "/tmp" "quickcheck.tmp"
                          removeFile path
                          hPutStr h output
                          hSeek h AbsoluteSeek 0
                          hGetContents h

main :: IO ()
main = do quickCheck prop_writeThenRead
          quickCheck prop_writeThenRead2

Ответ 2

Стандартная ссылка для тестирования монадического кода "Тестирование Monadic Code с QuickCheck" . Он показывает различные способы тестирования в контексте монады, такой как IO.

Но вам стоит подумать о том, чтобы опубликовать более конкретный вопрос о том, что вы хотите проверить.