Παρότι η τυχαία δοκιμή λογισμικού βασισμένη σε προδιαγραφές (random
property-based testing) είναι μια αποτελεσματική μέθοδος εύρεσης
σφαλμάτων και βελτίωσης της ποιότητας του λογισμικού, λάθη στην
διαδικασία ελέγχου μπορεί να συγκαλύψουν σημαντικά σφάλματα στο
λογισμικό και να μειώσουν την αποτελεσματικότητα της μεθόδου. Στη
διπλωματική αυτή παρουσιάζουμε μια καινοτόμο μέθοδο που μας επιτρέπει
να επαληθεύσουμε τυπικά τις τεχνικές δοκιμής λογισμικού, την οποία
ενσωματώνουμε στο εργαλείο QuickChick, το οποίο παρέχει τη δυνατότητα
αυτόματων δοκιμών βασισμένων σε προδιαγραφές για το εργαλείο
διαδραστικών αποδείξεων Coq. Ο στόχος της επέκτασης του εργαλείου
είναι η τυπική απόδειξη ορθότητας του εκτελέσιμου κώδικα που
χρησιμοποιείται για τη δοκιμή λογισμικού αναφορικά με υψηλού επιπέδου
προδιαγραφές, οι οποίες αποτυπώνουν πιο άμεσα την υπό δοκιμή
υπόθεση. Προκειμένου να επιτευχθεί κάτι τέτοιο παρέχουμε τη δυνατότητα
τυπικής απόδειξης ορθότητας για γεννήτορες τυχαίων δεδομένων
αντιστοιχίζοντας τους στα σύνολα των τιμών που έχουν μη μηδενική
πιθανότητα να παραχθούν. Χρησιμοποιώντας την μεθοδολογία μας
αποδείξαμε την ορθότητα των περισσότερων συνδυαστών που παρέχονται από
την διεπαφή του εργαλείου QuickChick, έχοντας ως αναφορά έναν μικρό
αριθμό αυτών για τους οποίους ορίσαμε τη σημασιολογία τους
αξιωματικά. Τέλος, αξιολογήσαμε την προτεινόμενη μεθοδολογία μέσα από
έναν αριθμό μη τετριμμένων περιπτώσεων εφαρμογής της και δείξαμε ότι
μπορεί να κλιμακωθεί σε δοκιμές σύνθετων συστημάτων χωρίς να
απαιτούνται αλλαγές σε ήδη υπάρχοντα κώδικα.
While random property-based testing is often an effective way for
quickly finding bugs and increasing software quality, testing errors
can conceal important bugs and thus reduce its benefits. In this
thesis we introduce a novel methodology for formally verified
property-based testing; this methodology is embodied by a framework
built on top of the QuickChick testing plugin for Coq. Our
verification framework is aimed at proving the correctness of
executable testing code with respect to a high-level specification,
which captures the conjecture under test in a more direct way. To this
end, we provide a systematic way for reasoning about the set of values
a random data generator can produce with non-zero probability. We have
used our methodology to prove the correctness of most QuickChick
combinators, with respect to the axiomatic semantics of a small number
of primitive ones. We have evaluated our verification methodology on
two sizable case studies showing that it is modular, scalable, and
requires minimal changes to existing code.