Κλείστε ραντεβού
Ιστολόγιο

Όταν οι δοκιμές περνούν αλλά η απαίτηση δεν ικανοποιείται

Οι επιτυχημένες δοκιμές μπορεί να καλύπτουν μόνο μέρος του αποτελέσματος. Ένα παράδειγμα τηλεμετρίας και πρακτικό αρχείο τεκμηρίωσης έκδοσης.

Emmanouil MandrakisΔημοσιεύτηκε: Ενημερώθηκε:

Σύνοψη: Οι επιτυχημένες δοκιμές δείχνουν ότι ικανοποιήθηκαν οι συγκεκριμένοι έλεγχοι μιας εκτέλεσης. Δεν αποδεικνύουν από μόνες τους ότι ικανοποιήθηκε η απαίτηση. Ο έλεγχος ότι στάλθηκε ένα μήνυμα επιβεβαιώνει μια ενέργεια. Αν η απαίτηση λέει ότι ο χειριστής βλέπει τη σωστή θερμοκρασία, χρειάζονται στοιχεία από την οθόνη. Ξεκινήστε από το επιθυμητό αποτέλεσμα, ελέγξτε το στο κατάλληλο σημείο και καταγράψτε όσα μένουν ανεπιβεβαίωτα.

Τι αποδεικνύει ένας επιτυχημένος έλεγχος

Το CI αναφέρει αποτελέσματα για συγκεκριμένο build, περιβάλλον και δεδομένα εισόδου. Οι δοκιμές μονάδας και σχήματος είναι χρήσιμες: εντοπίζουν γρήγορα σφάλματα και προστατεύουν συμβόλαια. Τα ονόματά τους και το αρχείο έκδοσης πρέπει να περιγράφουν ακριβώς τι τεκμηριώνουν. Οι οδηγίες του Google Testing Blog για τον έλεγχο συμπεριφοράς εξηγούν ότι οι δοκιμές της δημόσιας συμπεριφοράς συνήθως αντέχουν καλύτερα στις αλλαγές υλοποίησης. Ο έλεγχος μιας κλήσης παραμένει χρήσιμος, αλλά δεν τεκμηριώνει από μόνος του το αποτέλεσμα που βλέπει ο χρήστης.

Ένα υποθετικό σφάλμα τηλεμετρίας

Ενδεικτικό σενάριο, όχι πραγματικό περιστατικό. Ένας κόμβος αισθητήρα δημοσιεύει μια μέτρηση θερμοκρασίας, το σύστημα την αποθηκεύει και μια οθόνη παρακολούθησης δείχνει την τελευταία τιμή. Η απαίτηση είναι: «Στη συγκεκριμένη συνθήκη αναφοράς, η οθόνη του χειριστή δείχνει την τρέχουσα θερμοκρασία του κόμβου σε °C με απόκλιση έως ±0,5 °C». Στο παράδειγμα, μια ανεξάρτητη μέτρηση αναφοράς είναι 25,0 °C και το αποδεκτό εύρος της υποθετικής προδιαγραφής είναι 24,5 έως 25,5 °C. Αυτές είναι ενδεικτικές τιμές, όχι καθολική μετατροπή των μετρήσεων ADC. Η ακατέργαστη τιμή 2048 δεν αντιστοιχεί σε θερμοκρασία χωρίς προδιαγραφές αισθητήρα, κυκλώματος, βαθμονόμησης και μετατροπής.

Ο ακόλουθος ψευδοκώδικας ελέγχει τη δημοσίευση. Οι κλάσεις και οι μέθοδοι είναι ενδεικτικές, δεν αποτελούν API αυτού του ιστότοπου.

# Ψευδοκώδικας: ελέγχει μόνο τη μορφή και την αποστολή.
node = Node(adc=FakeAdc(raw_count=2048), broker=FakeBroker())
node.sample_and_publish()
message = node.broker.last_message
assert message["type"] == "temperature"
assert isinstance(message["value"], (int, float))
assert node.broker.publish_count == 1

Και οι τρεις έλεγχοι μπορούν να περάσουν ακόμη και αν ένα σφάλμα μετατροπής βάλει την ακατέργαστη τιμή στο value. Το μήνυμα υπάρχει και περιέχει αριθμό, αλλά η ένδειξη μπορεί να είναι λάθος. Κρατήστε αυτή τη δοκιμή ως έλεγχο σχήματος ή δημοσίευσης, όχι ως τεκμήριο ακρίβειας θερμοκρασίας.

Ελέγξτε το αποτέλεσμα στο σημείο που έχει σημασία

Πάρτε την αναμενόμενη τιμή από την προδιαγραφή ή από ανεξάρτητη μέτρηση αναφοράς, ποτέ από τον ίδιο κώδικα μετατροπής που ελέγχετε. Συσχετίστε την ένδειξη με τον κόμβο και το πρόσφατο δείγμα, για παράδειγμα με αναγνωριστικό δείγματος και χρονική σήμανση. Ελέγξτε μονάδα, αριθμητική ανοχή και συμπεριφορά όταν η μέτρηση λείπει, έχει παλιώσει ή έχει λάθος μονάδα. Μια παλιά ένδειξη 25,0 °C δεν καλύπτει απαίτηση για το τρέχον δείγμα.

Το επόμενο παράδειγμα είναι επίσης ψευδοκώδικας. Δείχνει έναν έλεγχο ολοκλήρωσης στο API με επανεκτέλεση ανεξάρτητα χαρακτηρισμένου δείγματος:

# Ψευδοκώδικας: το δείγμα 42 έχει τιμή αναφοράς 25,0 °C.
rig.replay(characterized_sample_id=42)
reading = backend_api.latest_reading(node_id=rig.node_id)
assert reading.sample_id == 42
assert reading.unit == "°C"
assert reading.age_seconds <= SPEC_MAX_AGE_SECONDS
assert abs(reading.value - 25.0) <= 0.5  # ενδεικτική ανοχή

Αυτό τεκμηριώνει τη διαδρομή επανεκτέλεσης και API στις συνθήκες της δοκιμής. Αν η απαίτηση αφορά την οθόνη του χειριστή, ο έλεγχος αποδοχής πρέπει επίσης να εξετάσει την τιμή και τη μονάδα που εμφανίζονται για το δείγμα 42, καθώς και την εμφάνιση παλιών ή ελλειπόντων μετρήσεων. Μέχρι να εκτελεστεί αυτός ο έλεγχος, καταγράψτε την οθόνη ως ανεπιβεβαίωτη. Η επανεκτέλεση δεν αποδεικνύει ακρίβεια αισθητήρα, αναλογική συμπεριφορά, βαθμονόμηση ή μεταφορά σε φυσικό υλικό. Ο έλεγχος στον πάγκο με κατάλληλο όργανο αναφοράς είναι ξεχωριστή επαλήθευση υλικού.

Δείξτε ότι εντοπίζεται ένα σχετικό σφάλμα

Σε ελεγχόμενο κλάδο δοκιμής, αλλάξτε προσωρινά τη μετατροπή ώστε να επιστρέφει την ακατέργαστη τιμή ή αντικαταστήστε τη μονάδα °C. Ο έλεγχος αποτελέσματος πρέπει να αποτύχει. Στη συνέχεια επαναφέρετε τον κώδικα. Έτσι δείχνετε ότι εντοπίζεται το συγκεκριμένο σφάλμα στις συγκεκριμένες συνθήκες, όχι ότι καλύπτονται όλα τα πιθανά σφάλματα. Το άρθρο του Google Testing Blog για το mutation testing περιγράφει την εισαγωγή σφαλμάτων για να αξιολογηθεί αν οι δοκιμές τα ανιχνεύουν, καθώς και την ανάγκη αποφυγής άχρηστων μεταλλάξεων.

Τα mocks κάνουν τις δοκιμές μονάδας γρήγορες και στοχευμένες, αλλά ένας ψεύτικος αισθητήρας ή broker μοντελοποιεί μόνο όσα του έχει ορίσει ο δημιουργός του. Διατηρήστε αυτές τις δοκιμές για τη λογική και το σχήμα. Προσθέστε ελέγχους στα όρια όπου το δικαιολογεί ο κίνδυνος. Δεν χρειάζεται βαριά δοκιμή από άκρο σε άκρο για κάθε απαίτηση.

Επαναχρησιμοποιήσιμο αρχείο τεκμηρίωσης έκδοσης

Αντιγράψτε την παρακάτω δομή στο αρχείο της έκδοσης, αντικαθιστώντας τις ενδεικτικές καταστάσεις με πραγματικά αποτελέσματα και συνδέσμους. Ένας έλεγχος που δεν εκτελέστηκε παραμένει ανοικτός, ακόμη και αν πέρασαν γειτονικές δοκιμές.

Απαίτηση ή όριοΤεκμήριο στο παράδειγμαΚατάσταση
Το μήνυμα περιέχει τα απαιτούμενα πεδίαΔοκιμή σχήματος, σύνδεσμος εκτέλεσης CIΠέρασε στο CI
Πρόσφατη ένδειξη API 25,0 ±0,5 °C για το δείγμα 42Χαρακτηρισμένη επανεκτέλεση, έλεγχος API, σύνδεσμος CIΠέρασε στην επανεκτέλεση
Η οθόνη δείχνει την τιμή και τη μονάδα του δείγματος 42, χειρίζεται παλιά ή ελλείποντα δεδομέναΈλεγχος εμφανιζόμενης οθόνης, σύνδεσμος αποτελέσματοςΑνεπιβεβαίωτο μέχρι την εκτέλεση
Ο φυσικός αισθητήρας πληροί την προδιαγραφή ακρίβειαςΔιαδικασία πάγκου, όργανο αναφοράς και αποτέλεσμαΑνεπιβεβαίωτο μέχρι την εκτέλεση

Στοιχεία αρχείου: κωδικός απαίτησης και αναθεώρηση προδιαγραφής, hash build/firmware, εκτέλεση CI και έκδοση δείγματος επανεκτέλεσης, αναθεώρηση υλικού και περιβάλλον, όργανο αναφοράς και στοιχεία βαθμονόμησης όπου απαιτούνται, ημερομηνία, αποτέλεσμα, ανοικτά όρια, υπεύθυνος και επόμενο βήμα. Για τις δύο ανοικτές γραμμές, ορίστε υπεύθυνο και περιβάλλον επαλήθευσης πριν από την απόφαση έκδοσης. Πρόκειται για υπόδειγμα, όχι για ισχυρισμό ότι εκτελέστηκαν δοκιμές σε πραγματικό προϊόν.

Λίστα ελέγχου πριν από την έκδοση

  • Διατυπώστε το επιθυμητό αποτέλεσμα με σημείο παρατήρησης, μονάδα, ανοχή και κανόνα επικαιρότητας.
  • Αντιστοιχίστε κάθε ισχυρισμό σε ονομασμένη δοκιμή ή μέτρηση, με build και περιβάλλον.
  • Χρησιμοποιήστε ανεξάρτητη αναμενόμενη τιμή και συσχετισμένο δείγμα. Ελέγξτε λάθος μονάδες και παλιές ή ελλείπουσες τιμές.
  • Κρατήστε ξεχωριστά τα τεκμήρια API, εμφανιζόμενης οθόνης και φυσικού υλικού.
  • Εισαγάγετε ελεγχόμενα ένα σχετικό σφάλμα για να δείτε αν ο έλεγχος το εντοπίζει, και επαναφέρετε τον κώδικα.
  • Καταγράψτε κενά, υπεύθυνο, επόμενο βήμα και απόφαση έκδοσης. Κρατήστε τα χρήσιμα αποτελέσματα μονάδας και σχήματος στο σωστό πεδίο ισχύος.

Συχνές ερωτήσεις

Είναι ακόμη χρήσιμες οι δοκιμές μονάδας;

Ναι. Απομονώνουν γρήγορα σφάλματα λογικής και προστατεύουν σταθερά συμβόλαια. Το επιτυχές αποτέλεσμά τους τεκμηριώνει αυτά τα συμβόλαια, με τις παραδοχές των mocks και των δεδομένων εισόδου.

Χρειάζεται δοκιμή από άκρο σε άκρο για κάθε απαίτηση;

Όχι. Επιλέξτε το απλούστερο αξιόπιστο τεκμήριο για κάθε κίνδυνο και όριο. Ένας υπολογισμός μπορεί να καλυφθεί με περιπτώσεις αναφοράς στη διεπαφή του στοιχείου. Μια απαίτηση οθόνης χρειάζεται τεκμήριο από την εμφανιζόμενη οθόνη.

Τι γίνεται αν το υλικό δεν μπορεί να εκτελεστεί στο CI;

Χρησιμοποιήστε χαρακτηρισμένη επανεκτέλεση στο CI για τη διαδρομή λογισμικού και προγραμματίστε δοκιμή στον πάγκο για τη διαδρομή υλικού. Καταγράψτε ξεχωριστά τους δύο ισχυρισμούς και τα περιβάλλοντά τους.

Δείτε πώς προσεγγίζουμε αυτά τα όρια τεκμηρίωσης στην ποιοτική μηχανική.