Συστηματική αποσφαλμάτωση και αναπαραγωγή — DedSec Project
Αποσφαλμάτωση — αναπαραγωγή λάθους στα όρια γραμμών Σενάριο και κριτήρια επιτυχίας Ένας αναγνώστης εμφανίζει αρίθμηση γραμμών από το 1. Όταν ζητούνται οι γραμμές 2 έως 3, πρέπει να…
Αποσφαλμάτωση — αναπαραγωγή λάθους στα όρια γραμμών
Σενάριο και κριτήρια επιτυχίας
Ένας αναγνώστης εμφανίζει αρίθμηση γραμμών από το 1. Όταν ζητούνται οι γραμμές 2 έως 3, πρέπει να επιστρέφονται και οι δύο, χωρίς τη γραμμή 1. Οι τομές λιστών στην Python ξεκινούν από δείκτη μηδέν και δεν περιλαμβάνουν τον τελικό δείκτη. Αν μπερδέψεις τους δύο κανόνες, εμφανίζεται σφάλμα κατά μία θέση, συχνά μόνο στην αρχή ή στο τέλος του εγγράφου.
Εκτελέσιμο εργαστήριο — ενσωματωμένη βιβλιοθήκη Python 3
Αποθήκευσε τον κώδικα ως 11_debugging.py και εκτέλεσέ τον με Python 3. Χρησιμοποιεί μόνο τεχνητά δεδομένα και εμφανίζει PASS αν περάσουν οι έλεγχοι. Ο κώδικας είναι ίδιος και στις δύο γλωσσικές εκδόσεις.
def line_range(lines, start, end):
if not isinstance(start, int) or not isinstance(end, int):
raise TypeError("line numbers must be integers")
if not 1 <= start <= end <= len(lines):
raise ValueError("line range outside document")
# External users count from one; Python slices from zero.
return lines[start-1:end]
source = ["first", "second", "third"]
assert line_range(source, 1, 1) == ["first"]
assert line_range(source, 2, 3) == ["second", "third"]
assert line_range(source, 1, 3) == source
for begin, finish in ((0, 2), (2, 4), (3, 2)):
try: line_range(source, begin, finish)
except ValueError: pass
else: raise AssertionError("invalid interval accepted")
print("PASS off-by-one regression")
Τεχνική εξήγηση
Ξεκίνα με ακριβή είσοδο, αναμενόμενο αποτέλεσμα, πραγματικό αποτέλεσμα και έκδοση περιβάλλοντος. Τρεις γραμμές αρκούν για ευκολότερη διάγνωση από ένα τεράστιο έγγραφο. Ο περιορισμός 1 <= start <= end <= len(lines) ορίζει τις επιτρεπτές τιμές και η τομή [start-1:end] κάνει τη σωστή μετατροπή. Κράτησε δοκιμές για πρώτη, τελευταία και όλες τις γραμμές, καθώς και άκυρα διαστήματα. Αφαίρεσε μηνύματα διάγνωσης που ίσως καταγράφουν ιδιωτικό περιεχόμενο πριν από τη δημοσίευση.
Περιορισμένες ασκήσεις
Άλλαξε προσωρινά την τομή σε [start:end] και παρατήρησε ποιες δοκιμές αποτυγχάνουν. Δοκίμασε κενό αρχείο, έγγραφο μίας γραμμής και αρνητικούς δείκτες. Κατάγραψε το ελάχιστο αρχικό σφάλμα, διόρθωσέ το και εκτέλεσε ξανά ακριβώς την ίδια δοκιμή. Επανάλαβε με θέσεις byte έναντι χαρακτήρων UTF-8.
Διάγνωση και τεκμήρια επιτυχίας
Αν δεν αναπαράγεται το λάθος, κατέγραψε την έκδοση Python, το ακριβές δείγμα και αν η εξωτερική αρίθμηση αρχίζει στο 1. Μην κρύβεις τη δυσλειτουργία πιάνοντας κάθε Exception και επιστρέφοντας κενή λίστα. Η δοκιμή παλινδρόμησης πρέπει να παραμείνει στο έργο.