Czy ktoś może podać krótki przykład testowania działań IO przy użyciu Monadic QuickCheck?Testowanie działań IO za pomocą Monadic QuickCheck
Odpowiedz
Moduł Test.QuickCheck.Monadic pozwala przetestować monadyczny kod, nawet rzeczy, które działają w IO
.
Monadyczny test właściwości jest typu PropertyM m a
, gdzie m
jest monadą, w której test jest wykonywany, a a
jest ostatecznie ignorowany. W przypadku PropertyM IO a
zamieniasz monadyczny test na Property
, używając monadicIO
; dla wszystkich innych monad, zamiast tego używasz monadic
(która ma funkcję uruchomienia monady, coś nie ma).
W monadycznym teście, wartość return
wydana z monady jest ignorowana. Aby sprawdzić wyrażenie, użyj assert
; assert
Niewłaściwa wartość nie powiedzie się. Użyj run
, aby wykonać kod w testowanej monadzie.
Do Twojej dyspozycji są inne monadyczne akcje. Na przykład pick
wygeneruje nowe wejścia testowe z Gen a
, a pre
sprawdzi warunki testowe. Są one użyteczne, jeśli same wejścia testowe lub warunki wstępne zależą od wartości wyliczonych przez testowaną monadę, w którym to przypadku normalny sposób generowania danych wejściowych lub sprawdzania prekursorów nie zadziała.
Oto przykład przetestowania kodu IO
: sprawdzamy, czy po zapisaniu czegoś w pliku tymczasowym możemy odczytać te same dane. Dla celów demonstracyjnych narzucimy warunek, że zapisujemy co najmniej jeden bajt do pliku. Dwie właściwości testowe robią to samo; jeden używa niepotrzebnie pick
i pre
, podczas gdy drugi nie.
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
Standardowym punktem odniesienia dla testowania kodu monadycznego jest "Testing Monadic Code with QuickCheck". Pokazuje różne sposoby testowania w kontekście monady, takiej jak IO.
Ale naprawdę powinieneś rozważyć umieszczenie bardziej konkretnego pytania na temat tego, co chciałbyś przetestować.
Link jest obecnie niedostępny. –
Koen najwyraźniej reorganizuje swoją stronę główną. Zamiast tego spróbuj wpisać następujący adres URL: [www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps](http://www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps) – svenningsson
- 1. Haskell IO Testowanie
- 2. Testowanie za pomocą HTF
- 3. Testowanie za pomocą Thread.sleep
- 4. Testowanie analizatorów Parsec przez generowanie danych wejściowych za pomocą funkcji QuickCheck
- 5. Testowanie właściwości QuickCheck w stosunku do wielu typów?
- 6. Jak przekształcać zdarzenia za pomocą funkcji IO?
- 7. Czytaj hex w C# za pomocą IO
- 8. Wiosenne testowanie za pomocą @Configurable
- 9. Testowanie łączy za pomocą rspec?
- 10. Generowanie list o określonej długości za pomocą QuickCheck Haskella
- 11. Generuj tylko dodatnie liczby całkowite za pomocą QuickCheck
- 12. Testowanie modeli Django za pomocą FileField
- 13. Testowanie za pomocą Robolectric i ANT
- 14. Szyny: Testowanie nazwanych zakresów za pomocą RSpec
- 15. Testowanie funkcjonalności Androida za pomocą sztyletu
- 16. Testowanie sprawdzania poprawności hasła za pomocą RSpec
- 17. Testowanie asynchronicznych wywołań zwrotnych za pomocą Jasmine
- 18. Testowanie jednostek za pomocą innych klas testowych
- 19. Testowanie dwóch środowisk za pomocą jest
- 20. Testowanie jednostek za pomocą podróbek lub makiet?
- 21. Testowanie HTTPS lokalnie za pomocą Coldfusion
- 22. Jak wypróbować testowanie komponentu za pomocą `entryComponents`?
- 23. Testowanie zadań asynchronicznych za pomocą robolektryka
- 24. Testowanie jednostki ASP.NET WebApi za pomocą Request.CreateResponse
- 25. Grails: testowanie przekierowania za pomocą testu integracji
- 26. Testowanie aplikacji NativeScript za pomocą Appium
- 27. Testowanie okna WPF za pomocą StaticResources
- 28. Testowanie aplikacji Django za pomocą Postgis Backend
- 29. Testowanie jednostkowe kodu C++ za pomocą Javy
- 30. Testowanie wydajności za pomocą architektury xUnit
Podanie przykładu tego, co chciałbyś przetestować, sprawiłoby, że byłoby lepiej. – Egon