Έλεγχος λογισμικού Ποιότητα Λογισμικού Black Box testing White Box testing Χ. Σκουρλάς, cskourlas@teiath.gr Α θ ή ν α 2015-16
Γίνεται παρουσίαση, με τη βοήθεια παραδειγμάτων. Σκοπός του μαθήματος είναι η παρουσίαση των απαραίτητων εννοιών ώστε οι φοιτητές να κατανοήσουν τον Έλεγχο Λογισμικού και ειδικότερα τις τεχνικές Black Box testing, White Box testing. Γίνεται παρουσίαση, με τη βοήθεια παραδειγμάτων. Χ. Σκουρλάς
Πότε Σταματά ο έλεγχος; Μόνο όταν το προϊόν αποσυρθεί οριστικά
Black box testing
Ακολουθούν παραδείγματα ελέγχου
έλεγχος: Τι θα συμβεί αν έχουμε Αστοχία του συστήματος (System fails) ή πρόβλημα δικτύου (the network connection breaks down) –για παράδειγμα μετά το πρώτο UPDATE-; Η δοσοληψία πρέπει να ακυρώνεται στο σύνολό της (rolled back). Το πρωτόκολλο (transaction protocol) εγγυάται ότι δεν υπάρχει απώλεια χρημάτων. έλεγχος: Τι θα συμβεί αν ένας από τους 2 λογαριασμούς δεν υπάρχει; Πρόβλημα Οι εντολές UPDATE θεωρείται ότι εκτελούνται «επιτυχώς» σε επίπεδο SQL. Λύση Θα πρέπει να εξετασθούν (inspect) τα SQL diagnostics και να ελεγχθεί ο αριθμός των γραμμών που επηρεάζονται από τις δύο εντολές UPDATE.
Η δοσοληψία (transaction) μπορεί να οδηγήσει σε λογικά λανθασμένη κατάσταση της βάσης δεδομένων (can lead into a logically erroneous state in the database) Η πρώτη εντολή UPDATE στην περίπτωση της mySQL μπορεί να οδηγεί σε προβληματική κατάσταση: το υπόλοιπο του λογαριασμού 1 ενδεχομένως γίνεται αρνητικό (παραβίαση του CHECK constraint) Τότε η εκτέλεση της δεύτερης εντολής UPDATE οδηγεί σε … Οι Application developers πρέπει να είναι ενήμεροι του τρόπου που το προϊόν DBMS mySQL«συμπεριφέρεται» και πως τα SQL diagnostics χρησιμοποιούνται.
Το επόμενο πρόγραμμα δεν είναι καλογραμμένο αλλά είναι ευκολονόητο για να «ξεκαθαρίσουμε» τη χρήση των ελέγχων Black Box και White Box. Δείτε πρώτα το πρώτο είδος ελέγχου και βεβαιωθείτε στη συνέχεια ότι γίνεται έλεγχος όλων των «μονοπατιών» εκτέλεσης στο πρόγραμμά μας.
DELIMITER // DROP PROCEDURE BankTransfer // CREATE PROCEDURE BankTransfer (IN fromAcct INT, IN toAcct INT, IN amount INT, OUT msg VARCHAR(100) ) P1: BEGIN DECLARE rows INT ; DECLARE newbalance INT; SELECT COUNT(*) INTO rows FROM Accounts WHERE acctID = fromAcct; UPDATE Accounts SET balance = balance - amount WHERE acctID = fromAcct; SELECT balance INTO newbalance FROM Accounts WHERE acctID = fromAcct; IF rows = 0 THEN ROLLBACK; SET msg = CONCAT('rolled back because of missing account ', fromAcct); ELSEIF newbalance < 0 THEN SET msg = CONCAT('rolled back because of negative balance of account ', fromAcct); ELSE SELECT COUNT(*) INTO rows FROM Accounts WHERE acctID = toAcct; UPDATE Accounts SET balance = balance + amount WHERE acctID = toAcct; SET msg = CONCAT('rolled back because of missing account ', toAcct); COMMIT; SET msg = 'committed'; END IF; END P1 // DELIMITER ;
mysql> SET @out = ' '; Query OK, 0 rows affected (0.00 sec) mysql> CALL BankTransfer (101, 202, 100, @out); mysql> SELECT @out; +-------------+ | @out | | committed | 1 row in set (0.00 sec) mysql> SELECT * FROM Accounts; +---------+-----------+ | acctID | balance | | 101 | 900 | | 202 | 2100 | 2 rows in set (0.00 sec)
mysql> CALL BankTransfer (100, 202, 100, @out); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SELECT @out; +------------------------------------------------------+ | @out | | rolled back because of missing account 100 | 1 row in set (0.00 sec) mysql> SELECT * FROM Accounts; +--------+----------+ | acctID | balance | | 101 | 900 | | 202 | 2100 | 2 rows in set (0.00 sec)
mysql> CALL BankTransfer (101, 200, 100, @out); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @out; +--------------------------------------------------------+ | @out | | rolled back because of missing account 200 | +-------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM Accounts; +--------+----------+ | acctID | balance | | 101 | 900 | | 202 | 2100 | 2 rows in set (0.00 sec)
mysql> CALL BankTransfer (101, 202, 2000, @out); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @out; +----------------------------------------------------------------------+ | @out | | rolled back because of negative balance of account 101 | 1 row in set (0.00 sec) mysql> SELECT * FROM Accounts; +--------+---------+ | acctID | balance | | 101 | 900 | | 202 | 2100 |
Developers and Error handling SQL standards have defined various diagnostic indicators some of which are implemented in most DBMS products, and some are not, while DBMS products have implemented indicators or exception handling methods of their own. Procedural extensions of SQL dialects are different, especially in terms of error handling.
Ερωτήσεις