Αντικαταστάτες εξαρτήσεων στις δοκιμές — DedSec Project
Δοκιμαστικά υποκατάστατα — ελεγχόμενο ρολόι και καταγραφή κλήσεων Απαιτήσεις ανεξάρτητες από την υλοποίηση Ένας τοπικός πελάτης ζητά έγγραφο με σύντομο αναγνωριστικό, αλλά δεν επιτρέπεται…
Δοκιμαστικά υποκατάστατα — ελεγχόμενο ρολόι και καταγραφή κλήσεων
Απαιτήσεις ανεξάρτητες από την υλοποίηση
Ένας τοπικός πελάτης ζητά έγγραφο με σύντομο αναγνωριστικό, αλλά δεν επιτρέπεται να καλέσει το μέσο μεταφοράς όταν έχει λήξει η προθεσμία. Άκυρα αναγνωριστικά απορρίπτονται, η απάντηση πρέπει να περιέχει τίτλο και ένα ληγμένο αίτημα δεν πρέπει να προκαλεί καμία εξωτερική κλήση. Οι δοκιμές μονάδας δεν χρειάζεται να κάνουν πραγματικά αιτήματα δικτύου ή να περιμένουν το ρολόι. Δώσε στη συνάρτηση ξεχωριστές διεπαφές ρολογιού και μεταφοράς ώστε το τεστ να ελέγχει το αποτέλεσμα και το ιστορικό.
Εκτελέσιμο εργαστήριο Python 3
Αποθήκευσε ως mock_lab.py και εκτέλεσε python3 mock_lab.py. Το υποκατάστατο της μεταφοράς καταγράφει κλήσεις χωρίς να αποστέλλει πακέτα, ενώ το ρολόι αλλάζει άμεσα τιμή.
class FakeClock:
def __init__(self):
self.tick = 0
def now(self):
return self.tick
class FakeTransport:
def __init__(self, answer):
self.answer = answer
self.calls = []
def request(self, slug):
self.calls.append(slug)
return self.answer
def fetch(slug, transport, clock, deadline):
if clock.now() > deadline:
raise TimeoutError("deadline exceeded")
if not isinstance(slug,str) or not slug.isascii() or not slug.isalnum():
raise ValueError("invalid slug")
value = transport.request(slug)
if not isinstance(value,dict) or "title" not in value:
raise ValueError("invalid response")
return value["title"]
clock = FakeClock()
stub = FakeTransport({"title":"local"})
assert fetch("abc2",stub,clock,10) == "local"
assert stub.calls == ["abc2"]
clock.tick = 11
try:
fetch("abc2",stub,clock,10)
except TimeoutError:
pass
else:
raise AssertionError("deadline bypassed")
assert stub.calls == ["abc2"]
print("PASS: injected clock, transport and call history")
Είδη δοκιμαστικών υποκατάστατων
Ένα stub επιστρέφει προκαθορισμένες απαντήσεις. Ένα fake υλοποιεί περιορισμένη πραγματική λειτουργικότητα της εξάρτησης. Ένα mock επικεντρώνεται στην επαλήθευση αλληλεπιδράσεων, όπως το αν η request κλήθηκε ακριβώς μία φορά. Το FakeTransport του εργαστηρίου συνδυάζει σταθερή απάντηση με ιστορικό. Η ονομασία δεν αντικαθιστά το ανεξάρτητο συμβόλαιο. Αν τα τεστ αντιγράφουν πιστά τον ίδιο ελαττωματικό αλγόριθμο, μπορεί να περάσουν ενώ το έργο παραμένει λάθος. Χρειάζονται επίσης ξεχωριστοί έλεγχοι συμβατότητας με την πραγματική βιβλιοθήκη μεταφοράς.
Ασκήσεις και οριακές τιμές
- Αντικατάστησε την απάντηση με κενό λεξικό και έλεγξε ότι εμφανίζεται σφάλμα.
- Δοκίμασε αναγνωριστικό με κάθετο, κενό ή ελληνικό χαρακτήρα. Αποφάσισε αν το πραγματικό έργο χρειάζεται διαφορετικό ρητό κανόνα.
- Όρισε χρόνο ίσο με την προθεσμία και μετά μία μονάδα μεγαλύτερο. Διευκρίνισε αν η λήξη υπολογίζεται με > ή >=.
- Βάλε προσωρινά την κλήση δικτύου πριν τον έλεγχο χρόνου. Η δοκιμή ιστορικού πρέπει να εντοπίσει την παλινδρόμηση.
Παραδοτέα: PASS, αμετάβλητο πλήθος κλήσεων μετά από λήξη, δοκιμή άκυρης απάντησης και καθορισμένο όριο προθεσμίας.