1 / 28

Μηχανική Λογισμικού ΙΙ Έλεγχος Λογισμικού JUNIT – TDD TFD + Refactoring

Μηχανική Λογισμικού ΙΙ Έλεγχος Λογισμικού JUNIT – TDD TFD + Refactoring. Παναγιώτης Σφέτσος , PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr. Σκοπός. Έλεγχοι παντού και πάντα ( Testing… ) Test Driven Development ( TDD ) Test-First Design ( TFD ) + Refactoring.

ula
Télécharger la présentation

Μηχανική Λογισμικού ΙΙ Έλεγχος Λογισμικού JUNIT – TDD TFD + Refactoring

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Μηχανική Λογισμικού ΙΙ Έλεγχος Λογισμικού JUNIT – TDD TFD + Refactoring Παναγιώτης Σφέτσος, PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr

  2. Σκοπός Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ Έλεγχοι παντού και πάντα (Testing…) • Test Driven Development(TDD) • Test-First Design (TFD) + Refactoring

  3. Εισαγωγή Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ • Έλεγχοι μονάδας(Unit testing): • Από τους προγραμματιστές • Αυτοματοποιημένοι, ώστε να μπορούν να εκτελούνται επαναληπτικά • Εργαλείο JUNIT • Έλεγχοι ενσωμάτωσης (Integration testing): • Από τους προγραμματιστές, καθώς ενσωματώνουν νέο κώδικα στη βάση κώδικα. • Αυτοματοποιημένοι, ώστε να μπορούν να εκτελούνται επαναληπτικά • Λειτουργικοί έλεγχοι συστήματος(Functional Testing): • Εκτελούνται συνήθως από κάποια εξωτερική ομάδα ελέγχου • Συνήθως είναι αυτοματοποιημένοι και έχουν την μορφή μαύρου κουτιού • Έλεγχοι αποδοχής (Acceptance testing): • Διενεργούνται από τον πελάτη ή τους εκπροσώπους του, στο δικό τους χώρο. • Συνήθως είναι αυτοματοποιημένοι και έχουν την μορφή μαύρου κουτιού

  4. Unit Testing – JUNIT Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ Έλεγχοι μονάδας(Unit Testing) Το πλαίσιο ελέγχου(testing framework)-JUNIT • Java και JUNIT (Beck και Gamma) – Ανοικτός κώδικας • Η επιτυχία ή αποτυχία μιας δοκιμής στον κώδικα απεικονίζεται με την βοήθεια μιας πράσινης ή κόκκινηςμπάραςαντίστοιχα (στο γραφικό περιβάλλον). • Δημιουργούμε μια κλάση ελέγχου | δοκιμήςγια κάθε κλάση του προγράμματος της εφαρμογής • Κάθε κλάση ελέγχου περιέχει ένα σύνολο από μεθόδους δοκιμής, που ελέγχουν τη σωστή λειτουργία των μεθόδων των κλάσεων της εφαρμογής • Πλεονεκτήματα: Σωστός κώδικας, Τεκμηρίωση

  5. Integration Testing – JUNIT Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ Έλεγχοι ενσωμάτωσης(Integration testing) • Εργαλείο συνήθως το JUNIT • Δημιουργία ακολουθιών δοκιμών (test suites) • Οι ακολουθίες δοκιμών ενσωματώνουν όλες τις κλάσεις δοκιμών σε μία κλάσηκαι με τον τρόπο αυτό εκτελούνται ταυτόχρονα όλα τα τεστ των κλάσεων της βάσης κώδικα • Εύκολα και γρήγορα γνωρίζουμε ότι όλες οι κλάσεις μας λειτουργούν σωστά.

  6. Εγκατάσταση του JUNIT (DOS) - 1 Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ • Κατεβάστε το εργαλείο junitαπό τη διεύθυνση http://www.junit.org/ • Κάντε unzip των αρχείων στον επιθυμητό κατάλογο (συνήθως c:\junitx.x) • Ανοίξτε το παράθυρο γραμμής εντολών (Command Prompt) • Ορίστε ως κατάλογοεργασίας τον φάκελο bin της έκδοσης javaπου έχετε:cdC:\Program Files\Java\jdk1.6.0_01\bin • Με την CLASSPATH ορίστε την διαδρομή όπου βρίσκεται αποθηκευμένο το junit.jarκαθώς και την διαδρομή όπου βρίσκονται αποθηκευμένες οι κλάσεις δοκιμών που θέλετε να τρέξετε. (π.χC:\Program Files\Java\jdk1.6.0_01\bin> set classpath=%classpath%;C:\junit3.8.1\junit.jar; C:\junit3.8.1;

  7. Εγκατάσταση του JUNIT (DOS) - 2 • Για να εμφανιστεί το παράθυρο του JUNIT και να δείτε το αποτέλεσματης κλάσης δοκιμής σας εκτελέστε την ακόλουθη εντολή: C:\Program Files\Java\jdk1.6.0_01\bin> και μετά: για text: 1) java junit.textui.TestRunnerjunit.samples.AllTests γιαγραφική:2) java junit.awtui.TestRunnerjunit.samples.AllTests για swing: 3) java junit.swingui.TestRunnerjunit.samples.AllTests Όπου:AllTests στην συγκεκριμένη περίπτωση είναι μία κλάσηδοκιμής που υπάρχει στον φάκελο junit\samples του junitx.x. ΑντίγιαAllTests εσείς θα γράφετε το όνομα της δικής σας κλάσηςδοκιμής, έχοντας βέβαια ορίσει την κατάλληλη διαδρομή στηνμεταβλητή CLASSPATH. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  8. Εγκατάσταση του JUNIT (DOS) - 3 Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  9. Το πλαίσιο δοκιμών - JUNIT • Το εργαλείοJUNIT αποτελείται από: • πακέτα κώδικα της Java (packages) • και περιπτώσεις ελέγχου (test cases) του κώδικα. • Εκτελεί τους ελέγχους κώδικα σε επίπεδο μονάδας(unit testing) • ήμαζικήςεπεξεργασίας(batch mode-integration testing) – για • ελέγχουςενσωμάτωσης. • Εκτελεί τους ελέγχους σαν τις μεθόδους μιας κλάσης. • Πολλαπλές περιπτώσεις ελέγχου εκτελούνται με την μορφή • ακολουθιών δοκιμών(testsuites) • Η περίπτωση ελέγχου (test case)περιέχει μια συλλογή ελέγχων • μονάδων ενώ η ακολουθία δοκιμών (testsuite) περιέχει ένα • σύνολο από περιπτώσεις ελέγχου. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  10. Το μοντέλο JUNIT Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  11. Κανόνες και ορισμοί - 1 Ο κύκλος ζωής της περίπτωσης ελέγχου (TestCase lifecycle) • setUp()// αρχικοποίηση • testXXX()// η μέθοδος ελέγχου ΧΧΧ • tearDown()// η διαγραφή • Επανάληψη βημάτων 1 έως 3 για κάθε μέθοδοtestXXX … • Οι setUp() και tearDown() μπορούν να υπερφορτωθούν (overriding), αλλά και να παραληφθούν ανάλογα τις περιπτώσεις. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  12. Κανόνες και ορισμοί - 2 Απλό Test: • import junit.framework.TestCase; • class Calculator { • public double add(double x, double y) { • return (x+y);} • } • public class TestCalculator extends TestCase • { • public void testAdd() • { • Calculator calc = new Calculator(); • double result = calc.add(50,10); • assertEquals(60, result,0); • } } • Εισάγουμε το πλαίσιο των junit-tests • Ορίζουμε μια υποκλάση της TestCase. • Υπερφορτώνουμε ή παραλείπουμε τις μεθόδους setUp() & tearDown(). • Ορίζουμε μια ή περισσότερες δημόσιες μεθόδους testXXX(). • Ελέγχουμε το αντικείμενο/α που λαμβάνουν μέρος στην δοκιμή. • Βεβαιώνουμε (assert) τα αποτελέσματα. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  13. Κανόνες και ορισμοί - 3 Test με την χρήση της Test suit() package TestExamples; import java.util.*; import junit.framework.*; public class FirstTest extends TestCase { public void testEmptyCollection() { Collection collection = new ArrayList(); assertTrue(collection.isEmpty()); } public static Test suite() { return new TestSuite(FirstTest.class); } public static void main(String args[]) { junit.textui.TestRunner.run(suite()); } } • Εισάγουμε το πλαίσιο των junit-tests • Ορίζουμε μια υποκλάση της TestCase. • Υπερφορτώνουμε ή παραλείπουμε τις μεθόδους setUp() & tearDown(). • Ορίζουμε μια ή περισσότερες δημόσιες μεθόδους testXXX(). • Ελέγχουμε το αντικείμενο/α που λαμβάνουν μέρος στην δοκιμή. • Βεβαιώνουμε (assert) τα αποτελέσματα. • Ορίζουμε μια στατική μέθοδο την suite() • Ορίζουμε μια ακολουθία δοκιμών (TestSuite) • Προαιρετικά ορίζουμε μια μέθοδο main() για να τρέξουμε την TestCase Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  14. Ο έλεγχος με την Test suit και main() // 1 – εισάγουμε τις κλάσεις και μεθόδους της junit package TestExamples; import java.util.*; import junit.framework.*; // 2 – δημιουργούμε την υποκλάση της TestCase: public class FirstTest extends TestCase { // 3 – γράφουμε μια μέθοδο ελέγχου για να βεβαιωθούμε (to assert): public void testEmptyCollection() { Collection collection = new ArrayList(); assertTrue(collection.isEmpty());//τιςεντολές assert θα δούμε αναλυτικά παρακάτω } // 4 – γράφουμε μια ακολουθία δοκιμών που περιέχει όλες τις μεθόδους TestXXX: public static Test suite() { return new TestSuite(FirstTest.class);} // 5 – γράφουμε την main() για να τρέξουμε το τεστ με αποτελέσματα σε μορφή κειμένου: public static void main(String args[]) { junit.textui.TestRunner.run(suite());}} Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  15. Εκτελεστές Ελέγχων (TestRunners) 6 – τρέχουμε το τεστ στο παράθυρο του dos (αποτελέσματα σε μορφή κειμένου): java TestExamples.FirstTest Το αποτέλεσμα θα είναι: . Time: 0 OK (1 tests) 7 – τρέχουμε το τεστ για αποτελέσματα σε γραφική μορφή – πράσινη μπάρα: java junit.swingui.TestRunner TestExamples.FirstTest Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  16. Οι Εντολές - assert • assertTrue(boolean condition)assertFalse(boolean condition) • assertEquals(Object expected, Object actual) • Χρησιμοποιεί την equals() σύγκριση (ίδια αντικείμενα) • assertSame(Object expected, Object actual)assertNotSame(Object expected, Object actual) • Χρησιμοποιεί την== σύγκριση (δύο αντικείμενα αναφέρονται στο ίδιο) • assertEquals(float expected, float actual, float tolerance) • assertNull(Object o)assertNotNull(Object o) • fail(String message), κλπ……….. - Απλό μήνυμα λάθους Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  17. JCreator - 1 Ενοποιημένο περιβάλλον ανάπτυξης κώδικα java και τεστ ελέγχων (JUNIT). To περιβάλλον διατίθεται δωρεάν και μπορείτε να το κατεβάσετε από την διεύθυνση www.jcreator.com/download.htm Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  18. JCreator - 2 • Για να τρέχουμε τις κλάσεις δοκιμών με το JUnit μέσα από τον JCreator • κάνουμε τις παρακάτω ρυθμίσεις : • Προσθέτουμε την διαδρομή του Junit στο παρακάτω πεδίο του μενού • Project: • ProjectProject SettingsJDK version j2sdk1.4.2_04editadd • add archivec:\junitx.x\junit.jar Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  19. JCreator - 3 • Προσθέτουμε την διαδρομή CLASSPATH του junit.jar στο παρακάτωπεδίο του • μενού Build ή Run: • Build Runtime Configuration default edit Run Application • default edit Parameters • Γράφουμε: • -classpath ".;c:\junit3.8.1\junit.jar" junit.swingui.TestRunner Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  20. Θέλουμε να κατασκευάσουμε την κλάση -box που θα περιλαμβάνει μέθοδο υπολογισμού του όγκου του. Για να βεβαιωθούμε ότι η μέθοδος δουλεύει σωστά θα γράψουμε ένα τεστ ελέγχου (μέθοδο), ορίζοντας δύο διαφορετικά αντικείμενα. Γράφουμε πρώτα τον κώδικα της κλάσης : • import junit.framework.*; • public class BoxTest extends TestCase { • class Box { • double width; • double height; • double depth; • / / O κατασκευαστής της Box. • Box(double x, double y, double z) { • width = x; • height = y; • depth = z; } • //υπολογισμός και επιστροφή του όγκου • double volume() {return width * height * depth; }} Παράδειγμα – 2ο Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  21. Παράδειγμα – 2ο (συνέχεια..) Το τεστ ελέγχου public void testAdd() { // δήλωση, και αρχικοποίηση των αντικειμένων box Box mybox1 = new Box(10, 20, 15); Box mybox2 = new Box(3, 6, 9); double vol; // λήψη όγκου του πρώτου box vol = mybox1.volume(); assertTrue(vol == 3000.00); // λήψη όγκου του δευτέρου box vol = mybox2.volume(); assertTrue(vol == 162.00); }} Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  22. Παράδειγμα – 2ο (συνέχεια..) Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  23. Παράδειγμα – 3ο Θα ελέγξουμε τους τύπους και τιμές μερικών μεταβλητών – Κάνουμε λάθη σε διαίρεση με το μηδέν, αλλά και σε τιμές μεταβλητών import junit.framework.*; public class SimpleTest extends TestCase{ protected int fValue1; protected int fValue2; protected void setUp() { fValue1= 2; fValue2= 3; } public void testAdd() { double result= fValue1 + fValue2; assertTrue(result == 6); } public void testDivideByZero() { int zero= 0; int result= 8/(zero); } public void testEquals() { assertEquals(12, 12); assertEquals(12L, 12L); assertEquals(new Long(12), new Long(12)); assertEquals("Size", 12, 13); assertEquals("Capacity", 12.0, 11.00, 0.0); } } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  24. Παράδειγμα – 3ο Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  25. Παράδειγμα – 3ο (Με τις διορθώσεις) Διορθώνουμε τα λάθη, προσθέτουμε try – catch για να πιάσουμε το λάθος της διαίρεσης με το μηδέν. import junit.framework.*; public class SimpleTest extends TestCase { protected int fValue1; protected int fValue2; protected void setUp() { fValue1= 2; fValue2= 3; } public void testAdd() { double result= fValue1 + fValue2; assertTrue(result == 5); } public void testDivideByZero() { int zero= 0; try{ int result= 8/(zero); } catch (Exception e) {} } public void testEquals() { assertEquals(12, 12); assertEquals(12L, 12L); assertEquals(new Long(12), new Long(12)); assertEquals("Size", 12, 12); assertEquals("Capacity", 12.0, 12.00, 0.0); } } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  26. Παράδειγμα – 3ο (Με τις διορθώσεις) Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  27. Δημιουργία ακολουθίας δοκιμών για όλες τις κλάσεις Αν θέλουμε την main() για εκτέλεση όλων των κλάσεων δοκιμών, τότε δημιουργούμε την παρακάτω ξεχωριστή κλάση: import junit.framework.Test; import junit.framework.TestSuite; public class AllMyTestSuite { // Δημιουργούμε το σετ των τεστ (πλήθος 3) public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(A_Test.class); suite.addTestSuite(BoxTest.class); suite.addTestSuite(SimpleTest.class); return suite; } //Τρέχουμε το σετ των τεστ (suite) public static void main(String args[]) { junit.textui.TestRunner.run(suite()); }} Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

  28. Δημιουργία ακολουθίας δοκιμών για όλες τις κλάσεις Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ

More Related