سؤال

ويمكن لأي شخص أن تعطيني مثالا وجيزة من اختبار الإجراءات IO باستخدام Monadic QuickCheck؟

هل كانت مفيدة؟

المحلول

Test.QuickCheck وحدة .Monadic يتيح لك اختبار التعليمات البرمجية monadic، حتى الأشياء التي تعمل في IO.

واختبار خاصية monadic من نوع PropertyM m a، حيث m هو الكائن الدقيق الاحادي الخلية وتجاهلت اختباراته في وa في نهاية المطاف. في حالة PropertyM IO a، عليك تحويل اختبار monadic إلى Property باستخدام monadicIO. لجميع الكائنات الدقيقة الاحاديه الخلية الأخرى، يمكنك استخدام monadic بدلا من ذلك (التي تأخذ وظيفة لتشغيل الكائن الدقيق الاحادي الخلية، وهو أمر IO ليس لديها).

في اختبار monadic، returned قيمة من يتم تجاهل الكائن الدقيق الاحادي الخلية. للتحقق تعبير، استخدم assert. سوف asserting قيمة خاطئة تفشل في الاختبار. استخدام 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.

ولكن يجب عليك أن تنظر حقا نشر سؤال أكثر تحديدا حول ما الذي كنت ترغب في الاختبار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top