Pergunta

Alguém pode me dar um breve exemplo de teste de ações de IO usando o Monadic QuickCheck?

Foi útil?

Solução

o Test.quickcheck.monadic O módulo permite testar o código monádico, mesmo coisas que correm em IO.

Um teste de propriedade Monadic é do tipo PropertyM m a, Onde m é a mônada que o teste é executado e a é finalmente ignorado. No caso de PropertyM IO a, você converte o teste de Monadic em um Property usando monadicIO; Para todas as outras mônadas, você usa monadic em vez IO não tem).

Em um teste monádico, o valor returnED fora da mônada é ignorado. Para verificar uma expressão, use assert; assertum valor falso falhará no teste. Usar run Para executar o código na mônada que está sendo testado.

Existem outras ações monádicas à sua disposição. Por exemplo, pick irá gerar novas entradas de teste de um Gen a, e pre verificará as pré -condições de teste. Estes são úteis se as entradas ou pré -condições de teste dependem de valores calculados através da mônada que está sendo testada; nesse caso, a maneira normal de gerar entradas ou verificações de preenchimento não funcionará.

Aqui está um exemplo de testar alguns IO Código: verificamos que, depois de escrever algo em um arquivo temporário, podemos ler os mesmos dados de volta. Para fins de demonstração, imporemos a pré -condição de que escrevemos pelo menos um byte ao arquivo. As duas propriedades de teste fazem a mesma coisa; um usa pick e pre desnecessariamente enquanto o outro não.

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

Outras dicas

A referência padrão para testar código monádico é "Testando código Monadic com Quickcheck". Ele mostra várias maneiras de testar no contexto de uma mônada como a IO.

Mas você realmente deve considerar postar uma pergunta mais concreta sobre o que você gostaria de testar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top