DedSec Project

Έλεγχος κώδικα που προτείνει AI — DedSec Project

Έλεγχος παραγόμενου κώδικα — ανεξάρτητες απαιτήσεις και δοκιμές ιδιοτήτων Ένα πειστικό αλλά λανθασμένο παράδειγμα Ένας βοηθός προτείνει συνάρτηση έκπτωσης που αφαιρεί int(cents percentage /…

Έλεγχος παραγόμενου κώδικα — ανεξάρτητες απαιτήσεις και δοκιμές ιδιοτήτων

Ένα πειστικό αλλά λανθασμένο παράδειγμα

Ένας βοηθός προτείνει συνάρτηση έκπτωσης που αφαιρεί int(cents * percentage / 100). Με αυτόν τον τρόπο αποκόπτει σιωπηρά το κλασματικό μέρος της έκπτωσης. Η συνάρτηση περνά μια εύκολη δοκιμή έκπτωσης 20% στα 100 λεπτά, αλλά παραβιάζει απαίτηση στρογγυλοποίησης της έκπτωσης με ROUND_HALF_UP. Γράψε πρώτα το πραγματικό συμβόλαιο ανεξάρτητα από τον προτεινόμενο κώδικα: μη αρνητικά ακέραια λεπτά, ακέραιο ποσοστό από 0 έως 100 και σαφής δεκαδικός κανόνας.

Εκτελέσιμο εργαστήριο Python 3

Αποθήκευσε ως review_lab.py και εκτέλεσε python3 review_lab.py. Ο κώδικας αποκαλύπτει ένα συγκεκριμένο αντιπαράδειγμα της λανθασμένης λύσης και ελέγχει τη διορθωμένη συνάρτηση σε εκατοντάδες τιμές.

from decimal import Decimal, ROUND_HALF_UP

def wrong(cents, pct):
    return cents - int(cents * pct / 100)

def safe(cents, pct):
    if type(cents) is not int or cents < 0 or type(pct) is not int or not 0 <= pct <= 100:
        raise ValueError("bad input")
    discount = (Decimal(cents) * Decimal(pct) / 100).quantize(
        Decimal("1"), rounding=ROUND_HALF_UP)
    return cents - int(discount)

assert wrong(101, 50) == 51 and safe(101, 50) == 50
for pct in (0,25,50,100):
    assert all(safe(c,pct) <= safe(c+1,pct) for c in range(300))
assert safe(999,0) == 999 and safe(999,100) == 0
for args in ((True,50),(-1,25),(10,101)):
    try:
        safe(*args)
    except ValueError:
        pass
    else:
        raise AssertionError("bad input accepted")
print("PASS: independent rounding contract and properties")

Τι αποδεικνύεται και τι όχι

Με αρχικό ποσό 101 λεπτά και έκπτωση 50%, η ελαττωματική υλοποίηση δίνει υπόλοιπο 51 λεπτά αντί 50. Οι δοκιμές ιδιοτήτων ελέγχουν ότι το πληρωτέο ποσό δεν μειώνεται όταν αυξάνεται η αρχική τιμή για τα δοκιμαστικά ποσοστά, καθώς και ότι η μηδενική και πλήρης έκπτωση λειτουργούν σωστά. Δεν αποδεικνύουν μαθηματικά την ορθότητα για όλους τους ακεραίους ούτε ότι ο κανόνας είναι κατάλληλος για κάθε πραγματική φορολογική ή εμπορική χρήση. Ο έλεγχος ακριβούς τύπου αποκλείει τιμές bool, παρότι η Python τις αντιμετωπίζει ως υποκλάση ακεραίων.

Πρακτική διαδικασία επιθεώρησης

  1. Γράψε πριν την υλοποίηση τις μονάδες, τα επιτρεπόμενα όρια, τον κανόνα στρογγυλοποίησης και τη συμπεριφορά σε ελλείπουσες τιμές.
  2. Αντικατάστησε προσωρινά την ακριβή πράξη με float και αποκοπή δεκαδικών. Βεβαιώσου ότι η δοκιμή των 101 λεπτών εντοπίζει την παλινδρόμηση.
  3. Πρόσθεσε ψευδοτυχαίες δοκιμές με σταθερό σπόρο μαζί με καθορισμένες οριακές τιμές. Σύγκρινε με ανεξάρτητη λύση αναφοράς.
  4. Πριν από συγχώνευση αλλαγών σε αποθετήριο, έλεγξε αρχεία εκτός αιτούμενου πεδίου, νέες εξαρτήσεις, διαρροή μυστικών και αποτυχίες χειρισμού αρχείων.

Παραδοτέα: PASS, αντιπαράδειγμα 101 λεπτών, αποτελέσματα ιδιοτήτων και σύντομη λίστα επιθεώρησης. Η επιτυχία των δοκιμών δεν πιστοποιεί ολόκληρο άγνωστο έργο.