إجراءات الاختبار IO مع Monadic QuickCheck
-
20-09-2019 - |
سؤال
ويمكن لأي شخص أن تعطيني مثالا وجيزة من اختبار الإجراءات IO باستخدام Monadic QuickCheck؟
المحلول
Test.QuickCheck وحدة .Monadic يتيح لك اختبار التعليمات البرمجية monadic، حتى الأشياء التي تعمل في IO
.
واختبار خاصية monadic من نوع PropertyM m a
، حيث m
هو الكائن الدقيق الاحادي الخلية وتجاهلت اختباراته في وa
في نهاية المطاف. في حالة PropertyM IO a
، عليك تحويل اختبار monadic إلى Property
باستخدام monadicIO
. لجميع الكائنات الدقيقة الاحاديه الخلية الأخرى، يمكنك استخدام monadic
بدلا من ذلك (التي تأخذ وظيفة لتشغيل الكائن الدقيق الاحادي الخلية، وهو أمر IO
ليس لديها).
في اختبار monadic، return
ed قيمة من يتم تجاهل الكائن الدقيق الاحادي الخلية. للتحقق تعبير، استخدم assert
. سوف assert
ing قيمة خاطئة تفشل في الاختبار. استخدام run
لتنفيذ التعليمات البرمجية في الكائن الدقيق الاحادي الخلية التي يجري اختبارها.
وهناك إجراءات أخرى monadic تحت تصرفكم. على سبيل المثال، سوف pick
توليد المدخلات اختبار جديد للخروج من Gen a
، وسوف pre
تحقق شروط مسبقة الاختبار. هذه هي مفيدة إذا كانت المدخلات اختبار أو شروط مسبقة أنفسهم تعتمد على القيم حسابها عن طريق الكائن الدقيق الاحادي الخلية التي يجري اختبارها، وفي هذه الحالة بالطريقة العادية لتوليد المدخلات أو التحقق precontions لن ينجح.
وهنا مثال لاختبار بعض التعليمات البرمجية 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
نصائح أخرى
والإشارة القياسية لاختبار كود monadic هي "اختبار كود Monadic مع QuickCheck ". وهو يبين طرق مختلفة لاختبار في سياق الكائن الدقيق الاحادي الخلية مثل IO.
ولكن يجب عليك أن تنظر حقا نشر سؤال أكثر تحديدا حول ما الذي كنت ترغب في الاختبار.