Γλώσσες Προγραμματισμού Εφαρμογών - ΜΕΠΒ20

Σχετικά έγγραφα
Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Εισαγωγή στον Προγραμματισμό Python Μάθημα 4: Συναρτήσεις (functions) και δομοστοιχεία (modules) στην Python

α. Οι συμβολοσειρές είναι μια ακολουθία από χαρακτήρες. Μια συμβολοσειρά μπορεί να αποτελείται από περισσότερες από μία λέξεις.

Σημειωματάριο Τετάρτης 18 Οκτ. 2017

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Πληρουορική Γ Γσμμασίοσ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Θέματα Προγραμματισμού Η/Υ

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Προγραμματισμός ΙI (Θ)

Γλώσσα προγραμματισμού python

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2018 Β ΦΑΣΗ

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ

ΣΥΝΟΛΟ ΣΕΛΙ ΩΝ: ΕΠΤΑ (7)

Ανακτήθηκε από την ΕΚΠΑΙΔΕΥΤΙΚΗ ΚΛΙΜΑΚΑ

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

Δομημένος Προγραμματισμός (ΤΛ1006)

Τύποι δεδομένων, τελεστές, μεταβλητές

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Σημειωματάριο Δευτέρας 9 Οκτ. 2017

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

Πληροφορική 2. Τεχνολογία Λογισμικού

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Ελεγχος, Αξιοπιστία και Διασφάλιση Ποιότητας Λογισµικού Πολυπλοκότητα

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ

Αντικειµενοστραφής Προγραµµατισµός

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΓΛΩΣΣΙΚΗ ΤΕΧΝΟΛΟΓΙΑ. Python & NLTK: Εισαγωγή

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Διαδικασιακός Προγραμματισμός

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

(3) Από την εργαλειοθήκη επιλέξτε το εργαλείο «ετικέτας (Label)». Δημιουργήστε μια ετικέτα στην φόρμα σας.

Δημιουργία μιας εφαρμογής Java με το NetBeans

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Θέματα Προγραμματισμού Η/Υ

Πώς γίνεται το debug? Το debug γίνεται με δύο τρόπους, ως επί το πλείστον. Τουλάχιστον, εγώ δύο έμαθα, και αυτούς αναφέρω.

Ράβδος Εργαλείων, σχεδόν τα ίδια εργαλεία και εικονίδια υπάρχουν όπως στα άλλα προγράμματα που έχετε μάθει μέχρι σήμερα.

Κεφάλαιο 10 ο Υποπρογράµµατα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Διαδικασιακός Προγραμματισμός

Εισαγωγή στον Προγραμματισμό Python Μάθημα 1: Μεταβλητές, τελεστές, είσοδος/έξοδος προγράμματος, συνθήκη ελέγχου if Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ.

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

APP INVENTOR ΟΔΗΓΟΣ 8 Οκτωβρίου 2018

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

3 Αλληλεπίδραση Αντικειμένων

Λογικές εκφράσεις και μεταβλητές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Εντολές επιλογής Επαναλήψεις (if, switch, while)

Τεχνολογία Λογισµικού Ι Κεφάλαιο 6

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Εισαγωγή στον Προγ/μό Υπολογιστών

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

Ανάπτυξη και Σχεδίαση Λογισμικού

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Πως θα κατασκευάσω το πρώτο πρόγραμμα;

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

ΘΕΜΑ Α. 1. Η δυαδική αναζήτηση χρησιμοποιείται μόνο σε ταξινομημένες συλλογές δεδομένων.

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Γραφικά υπολογιστών Εργαστήριο 4 Εισαγωγή στις λίστες

Transcript:

Γλώσσες Προγραμματισμού Εφαρμογών - ΜΕΠΒ20 Διάλεξη 10 Δοκιμή του Κώδικα Παπαϊωάννου Αθανάσιος Π.Μ.Σ. «Εφαρμοσμένη Πληροφορική» Χειμερινό Εξάμηνο 20 16-20 17

Ορίσματα στο main module $ python test.py arg1 arg2 arg3 Το module sys της Python παρέχει πρόσβαση σε κάθε όρισμα που δίδεται από τη γραμμή εντολών σε ένα module μέσω της sys.argv Λίστα ορισμάτων sys.argv[0] είναι το όνομα του module που καλείται Αντίστοιχο με το args στη Java len(sys.argv) είναι το μήκος της λίστας ορισμάτων import sys print 'Number of arguments:', len(sys.argv), 'arguments.' print 'Argument List:', str(sys.argv) $ python test.py arg1 arg2 arg3 Number of arguments: 4 arguments. Argument List: ['test.py', 'arg1', 'arg2', 'arg3']

getopt Το module getopt βοηθά στην επεξεργασία επιλογών και ορισμάτων στη γραμμή εντολών Αυτό γίνεται με τη συνάρτηση getopt(args, options[, long_options]) options: Συμβολοσειρά γραμμάτων για πέρασμα επιλογών. Αν μια επιλογή ακολουθείται από τιμή τότε το αντίστοιχο γράμμα θα πρέπει να ακολουθείται από (:) long_options: Λίστα συμβολοσειρών επιλογών. Αν μια επιλογή ακολουθείται από τιμή τότε το αντίστοιχο γράμμα θα πρέπει να ακολουθείται από (=) >>> import getopt >>> args = '-a -b -cfoo -d bar a1 a2'.split() >>> args ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2'] >>> optlist, args = getopt.getopt(args, 'abc:d:') >>> optlist [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] >>> args ['a1', 'a2'] Exceptiongetopt.GetoptError: Όταν υπάρχει λάθος στα ορίσματα

Η εντολή assert Η εντολή assert ελέγχει αν μια συνθήκη είναι αληθής κατά το χρόνο εκτέλεσης του προγράμματος Αν η συνθήκη είναι ψευδής, τότε το πρόγραμμα σταματά και παράγεται ένα AssertionError assert(number_of_players < 5) assert(number_of_players < 5), msg Σε περίπτωση AssertionError επιστρέφει το msg

Δοκιμή Κώδικα Έλεγχος Λαθών Η δοκιμή του κώδικά είναι σημαντική για την ανάπτυξη ποιοτικού λογισμικού Οι δοκιμές πρέπει να είναι εύκολες στη χρήση και επαναχρησιμοποιήσιμες Πρέπει να είναι ανεξάρτητες από τον κώδικα τον οποίο ελέγχουν δηλ. όταν ελέγχεται ο κώδικας πρέπει να ελέγχεται βάσει της λειτουργικότητάς του που περιγράφεται στο docstring και όχι βάσει του ίδιου του κώδικα που έχει γραφτεί Αυτό σημαίνει ότι ελέγχει κανείς τις αποκρίσεις του κώδικα προς το χρήστη βάσει κάποιας εισόδου

Δοκιμή Κώδικα Υπάρχουν 2 βασικά στοιχεία στη δοκιμή κώδικα: Το να σκεφτεί κανείς τι πρόκειται να ελέγξει Τα εργαλεία που πρόκειται να χρησιμοποιήσει για να «τρέξει» τις δοκιμές Το πρώτο είναι επί το πλείστον ανεξάρτητο από τη γλώσσα προγραμματισμού Αλλά όχι εντελώς, αφού μερικές γλώσσες μπορεί να επιτρέπουν διαφορετικούς τύπους εισόδου Το δεύτερο εξαρτάται αρκετά από τη γλώσσα προγραμματισμού Υπάρχει μια αρκετά κοινή μεθοδολογία για τη δοκιμή κώδικα, αλλά σε μερικές γλώσσες υπάρχουν ενσωματωμένα εργαλεία για το σκοπό αυτό

Περιπτώσεις Δοκιμών (1) Τι ελέγχουμε; Δεν μπορούμε να ελέγξουμε όλες τις πιθανές εισόδους Οπότε, θα πρέπει να διαλέξουμε ένα υποσύνολο εισόδων που θα είναι αντιπροσωπευτικό Μπορούμε να έχουμε «τυπικές εισόδους» Μπορούμε να ελέγξουμε περιπτώσεις όπου υποψιαζόμαστε πιθανό προγραμματιστικό λάθος Μπορούμε να ελέγξουμε «ακραίες περιπτώσεις» που υποψιαζόμαστε ότι μπορεί να έχουν παραβλεφθεί

Περιπτώσεις Δοκιμών (2) Είναι χρήσιμο να σκέφτεται κανείς«επιθετικά» όταν επιλέγει περιπτώσεις δοκιμών Δηλαδή, θα πρέπει να προσπαθήσει να κάνει το πρόγραμμά του να «κρεμάσει» Όμως «νόμιμα», δηλαδή σύμφωνα με τις επιτρεπτές εισόδους του προγράμματος του που περιγράφονται στο docstring Σε αυτό το πεδίο ορισμού, θα πρέπει να επιλέγει όσο πιο άσχημες περιπτώσεις μπορεί

Περιπτώσεις Δοκιμών (3) Όλες οι περιπτώσεις δοκιμών για ένα κομμάτι κώδικα πρέπει να είναι μεταξύ τους ανεξάρτητες Αυτό γιατί, θα πρέπει να είναι διαφωτιστικές σχετικά με την αιτία αποτυχίας της δοκιμής Οπότε, το να έχει κανείς πολλές περιπτώσεις δοκιμών που «χτίζουν» η μία πάνω στην άλλη δεν είναι και πολύ καλή ιδέα Σημειώστε ότι αυτό είναι διαφορετικό από το να έχουμε περιπτώσεις δοκιμών που ελέγχουν συναρτήσεις, οι οποίες καλούν άλλες συναρτήσεις

Τί ελέγχουμε; Ιδεατά, κάθε συνάρτηση ελέγχεται ξεχωριστά Αυτό αποκαλείται unit testing Όταν έχουν ελεγθεί όλες οι μικρότερες συναρτήσεις, τότε πραγματοποιέιται ο έλεγχος μεγαλύτερων συναρτήσεων που καλούν τις μικρότερες Όταν γίνουν κάποιες αλλαγές στον κώδικα, τότε θα πρέπει να ξαναγίνουν όλες οι δοκιμές (που μπορεί να τον αφορούν άμεσα ή έμμεσα) Αυτό αποκαλείται regression testing

Πότε ελέγχουμε τον κώδικά μας για λάθη; Το καλύτερο είναι ο έλεγχος μιας συνάρτησης να γίνεται αμέσως μετά το γράψιμό της Η διόρθωση σφαλμάτων είναι ευκολότερη στο σημείο αυτό Συχνά είναι χρήσιμο να σκέφτεται κανείς τις περιπτώσεις δοκιμών πριν ακομή γράψει κώδικα (δηλ. περιπτώσεις χρήσης, τυπικές, δύσκολες, ακραίες) Έτσι, θα σκεφτεί τη δομή του κώδικα της συνάρτησης και το τι κάνει η συνάρτηση καλά πριν γράψει κώδικα για τη συνάρτηση Με αυτόν τον τρόπο, μπορεί να γράψει κανείς τις δοκιμές κώδικα με έναν γενικό τρόπο ανεξαρτήτως κώδικα (black-box fashion), διότι δεν ξέρει ποιος θα είναι ο κώδικας της συνάρτησης ακόμη

Πότε ελέγχουμε τον κώδικά μας για λάθη? Οι επαγγελματίες προγραμματιστές συχνά γράφουν ελέγχους λαθών πριν να γράψουν κώδικα Το να σκέφτεται κανείς περιπτώσεις ελέγχων την ώρα της σχεδίασης του κώδικα αποτελεί χρήσιμο σχεδιαστικό εργαλείο, διότι μπορεί να ανατροφοδοτήσει τον σχεδιασμό Κάνει τον κώδικα πιο εύρωστο

Γενικές Απαιτήσεις για Δοκιμές Κώδικα Προτιμούμε ατομικές δοκιμές (unit tests) για κάθε συνάρτηση Οι δοκιμές αυτές θα πρέπει να είναι ανεξάρτητες μεταξύ τους Κάποιες θα πρέπει να είναι γενικές και κάποιες επιλεγμένες με «επιθετική» λογική Θέλουμε να σχεδιάζουμε τις δοκιμές μας πριν τη συγγραφή κώδικα Κάνει τον κώδικά μας πιο εύρωστο και βελτιώνει την ανεξαρτησία των δοκιμών Θέλουμε να επανεκτελούμε τις δοκιμές όταν αλλάζουμε τον κώδικα Πώς επιτυγχάνουμε τα παραπάνω;

Δοκιμή Κώδικα στην Python Έχουμε λοιπόν κάποιες απαιτήσεις για τη δοκιμή κώδικα Είναι δύσκολο να τις ικανοποιήσουμε όλες Μέχρι τώρα, τεστάρουμε τα modules ή τις συναρτήσεις μας στο διαδραστικό φλοιό Απαιτεί πολύ δουλειά για regression testing με αυτόν τον τρόπο Θα μπορούσαμε να αποθηκεύουμε τις προηγούμενες δοκιμές μας σε ένα αρχείο, αλλά έτσι θα έπρεπε να γράψουμε κώδικα για ανάγνωση, επεξεργασία και εγγραφή αρχείων Ευτυχώς, η Python έχει ένα module που αποκαλείται Nose που διαθέτει αρκετή από τη χρήσιμη λειτουργικότητα για regression testing

Δοκιμή Κώδικα με το Nose (1) Η δοκιμή κώδικα με το Nose γίνεται ως ακολούθως: Έστω ότι θέλουμε να εξέγξουμε ένα module που ονομάζεται mod Θέλουμε να δοκιμάσουμε κάποιες ή όλες τις συναρτήσεις μέσα σε αυτό Για να το κάνουμε αυτό, δημιουργούμε ένα module με όνομα test mod Σε αυτό το module κάνουμε import nose και import mod Για κάθε συνάρτηση func του mod που θέλουμε να τεστάρουμε, γράφουμε μια συνάρτηση test func()

Δοκιμή Κώδικα με το Nose (2) Όταν εκτελούμε το mod_test: if name == ' main ': nose.run () Εναλλακτικά, nosetests Στο σώμα της συνάρτησης test func() χρησιμοποιούμε εντολές assert Η assert (boolean condition) δε θα κάνει κάτι αν η συνθήκη είναι True, αλλά θα «πετάξει» μήνυμα λάθους αν είναι False Οπότε, η test func() έχει εντολές του τύπου: assert func(input) == (expected_output) Το Nose εκτελεί αυτές τις εντολές και παράγει αποτελέσματα δοκιμών

Δοκιμή Κώδικα με το Nose (3) Δημιουργούμε ταξεις δοκιμής (test classes) βάζοντάς τις είτε σε ένα module που καταλήγει σε (ή ξεκινά με) test ή _test (testmatch) ή κάνοντάς τις θυγατρικές της unittest.testcase Για κάθε μέθοδο που ταιριάζει στο testmatch, κατασκευάζεται μια περίπτωση δοκιμής με ένα νέο στιγμιότυπο της τάξης δοκιμής Μέθοδοι setup και teardown μπορούν να οριστούν που θα τρέχουν πριν και μετά κάθε μέθοδο Σε επίπεδο τάξης Σε επίπεδο μεθόδου class TestA(object): @classmethod def setup_class(klass): """This method is run once for each class before any tests are run""" @classmethod def teardown_class(klass): """This method is run once for each class _after_ all tests are run""" def setup(self): """This method is run once before _each_ test method is executed""" def teardown(self): """This method is run once after _each_ test method is executed""" def test_init(self): a = A() assert_equal(a.value, "Some Value") assert_not_equal(a.value, "Incorrect Value") def test_return_true(self): a = A() assert_equal(a.return_true(), True) assert_not_equal(a.return_true(), False)

Έξοδος του Nose (1) Η πρώτη γραμμή των αποτελεσμάτων μας λέει το αποτέλεσμα των δοκιμών Η τελεία σημαίνει το module υπό δοκιμή πέρασε τη δοκιμή με επιτυχία (χωρίς λάθη), το F σημαίνει ότι η δοκιμή απέτυχε, και το E ότι συνέβη κάποιο λάθος Το F συμβολίζει λανθασμένη έξοδο του κώδικα και το Ε σημαίνει ότι παρουσιάστηκε μια εξαίρεση στον κώδικα Για κάθε αποτυχία ή λάθος παρέχεται αντίστοιχη πληροφορία στην έξοδο του Nose Τέλος, παρέχεται ο συνολικός αριθμός των ελέγχων που πέρασε ο κώδικας με επιτυχία, ο συνολικός αριθμός των αποτυχιών και ο συνολικός αριθμός λαθών (εξαιρέσεων)

Έξοδος του Nose (2) Η πληροφορία για τα λάθη είναι απλώς αυτή που παρέχεται από την ίδια την Python Όταν αποτυγχάνει μια δοκιμή, έχουμε ένα 'AssertionError'. Αν θέλουμε να προσθέσουμε ένα δικό μας μήνυμα σε περίπτωση αποτυχίας μιας δοκιμής, μπορούμε να βάλουμε στην εντολή assert ως ακολούθως: assert (condition), "Some String."

Γενικές Απαιτήσεις για Δοκιμές Κώδικα (ξανά) Προτιμούμε ατομικές δοκιμές (unit tests) για κάθε συνάρτηση Οι δοκιμές αυτές θα πρέπει να είναι ανεξάρτητες μεταξύ τους Κάποιες θα πρέπει να είναι γενικές και κάποιες επιλεγμένες με «επιθετική» λογική Θέλουμε να σχεδιάζουμε τις δοκιμές μας πριν τη συγγραφή κώδικα Κάνει τον κώδικά μας πιο εύρωστο και βελτιώνει την ανεξαρτησία των δοκιμών Θέλουμε να επανεκτελούμε τις δοκιμές όταν αλλάζουμε τον κώδικα Πώς επιτυγχάνουμε τα παραπάνω με το Nose;

Τεστ με Nose Unit Tests Κάθε δοκιμή στο nose είναι μια ξεχωριστή συνάρτηση, οπότε πρέπει να γραφτεί μια νέα συνάρτηση για κάθε unit test Σχεδιασμός δοκιμών πριν τη συγγραφή κώδικα Αυτό που πρέπει να γράψουμε στο nose είναι οι προδιαγραφές της συνάρτησης που θα δοκιμάζουμε, ενώ ο κώδικας της ίδιας της συνάρτησης είναι μαύρο κουτί Regression Testing Το Nose επιτρέπει πολύ εύκολα να την επανεκτέλεση όλων των δοκιμών κώδικα όποτε θέλουμε

Αν βρεθεί λάθος Αν βρεθεί κάποιο λάθος, θα πρέπει να το διορθώσεις με ιχνηλάτηση λαθών, μια διαδικασία που είναι συχνά επίπονη Υπάρχουν τρόποι να γίνει λιγότερο οδυνηρή Δοκιμάστε τον κώδικά σας έγκαιρα και συχνά Διαβάσε τα μηνύματα λάθους, και χρησιμοποιήστε τα για να δείτε αν ο κώδικας σας είναι σωστός στο σημείο που εμφανίζεται το λάθος Βρείτε το πρώτο σημείο που ο κώδικας διαφέρει από αυτό που νομίζετε ότι θα έπρεπε να είναι Εκτελέστε νοητικά τον κώδικα, ώστε αν η εκτέλεση φτάσει στο σημείο του κώδικα που ελέγχετε, ο ελεγχόμενος κώδικας να κάνει αυτό που προορίζεται

Python Package Index (pip) Η Python αποτελεί έργο ανάπτυξης λογισμικού ανοιχτού κώδικα Διαθέτει ενεργή κοινότητα προγραμματιστών που διαθέτουν τον κώδικά τους σε άλλους χρήστες Αυτό επιτρέπει στους χρήστες της Python να επωφελούνται από λύσεις που παρείχαν άλλοι και να συνεισφέρουν τις δικές τους Στο Python Packaging Index (https://pypi.python.org/pypi) είναι διαθέσιμα (με άδειες ανοιχτού κώδικα) όλα τα πακέτα που έχουν συνεισφέρει άλλοι χρήστες Μπορούμε να εγκαταστήσουμε κάποιο από αυτά τοπικά: python -m pip install SomePackage Αν έχουμε εγκαταστήσει το pip (http://www.pip-installer.org/en/latest/), τότε pip install SomePackage

pyenv https://github.com/yyuu/pyenv Διατηρεί ταυτόχρονα πολλές ανεξάρτητες μεταξύ τους εκδόσεις Python σε ένα υπολογιστή Επιτρέπει στο χρήστη να αλλάξει τη χρησιμοποιούμενη έκδοση της Python συνολικά ή ανά project ή package (φάκελο)! Ο χρήστης μπορεί δυναμικά με μια μεταβλητή περιβάλλοντος να χρησιμοποιήσει όποια έκδοση της Python επιθυμει Επιτρέπει την ταυτόχρονη αναζήτηση εντολών από πολλές εκδόσεις Python Μερικές εντολές: pyenv versions pyenv install list pyenv install 3.4.0 pyenv global 3.4.0 pyenv local 3.5.2

Σύνοψη Ορίσματα στο πρόγραμμα Έλεγχος κώδικα για λάθη Unit testing Regression testing Δημιουργία δοκιμών με Nose Διόρθωση λαθών Εγκατάσταση νέων πακέτων Python Διατήρηση πολλών εκδόσεων της Python