bdd cucumber tutorial with examples
Αυτό το σεμινάριο αγγουριών βάθους συζητά το BDD και τα οφέλη του, το αγγούρι, τις περιβαλλοντικές ρυθμίσεις, τη δημιουργία σεναρίου δοκιμών, τα χαρακτηριστικά αγγουριών, τις αναφορές κ.λπ.
Το αγγούρι έχει γίνει πολύ δημοφιλές και τώρα χρησιμοποιείται ευρέως στη βιομηχανία δοκιμών λογισμικού.
Προαπαιτούμενα - Οι προοριζόμενοι παραλήπτες θα πρέπει να γνωρίζουν Scrum, Maven, TestNG κ.λπ.
Τι θα μάθετε:
- Ιστορικό BDD
- Οφέλη από την ανάπτυξη βάσει συμπεριφοράς (BDD)
- Εργαλεία BDD
- Γιατί αγγούρι;
- Πώς λειτουργεί το αγγούρι;
- Περιβαλλοντικές ρυθμίσεις
- Γράψιμο δοκιμαστικών περιπτώσεων με χρήση αγγουριού
- Δημιουργία αρχείων για αγγούρι
- Χαρακτηριστικά αγγουριού
- TestNG με αγγούρι
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Ιστορικό BDD
Στο μεθοδολογία TDD Framework of Agile, συνήθως γράφουμε πρώτα τις δοκιμαστικές περιπτώσεις και στη συνέχεια τις εκτελούμε. Αυτό είναι καλό για την επίτευξη δοκιμαστικής κάλυψης και για να βεβαιωθείτε ότι η κατασκευή είναι έτοιμη για παραγωγή.
Ωστόσο, μπορούμε να βελτιώσουμε το πλαίσιο TDD εισάγοντας συμπεριφορές, δυνατότητες κ.λπ. στη δοκιμή και στη συνέχεια να εκτελέσουμε το ίδιο. Αυτή η βελτίωση στο TDD ονομάζεται BDD (Behavior Driven Development).
Οφέλη από την ανάπτυξη βάσει συμπεριφοράς (BDD)
Μερικά οφέλη από τη χρήση BDD είναι:
# 1) Γεφυρώνει το χάσμα μεταξύ των επιχειρηματικών φορέων και της τεχνικής ομάδας μέσω μιας κοινής πλατφόρμας. Ως εκ τούτου, η επικοινωνία μεταξύ της ομάδας γίνεται πιο διαφανής.
#δύο) Τα σενάρια μπορούν να γραφτούν από οποιονδήποτε, συμπεριλαμβανομένων ατόμων από την πλευρά του πελάτη, μέλους της επιχειρηματικής ομάδας, της διαχείρισης κ.λπ. Ως εκ τούτου, καλύπτονται οι απαιτήσεις, τα σενάρια.
# 3) Οι προγραμματιστές θα γράψουν τον κώδικα σύμφωνα με τα σενάρια που γράφονται στο πλαίσιο BDD αντί να γράψουν / αναπτύξουν τον κώδικα σύμφωνα με την κατανόησή τους.
# 4) Οι δοκιμές γίνονται πιο έντονες, εξοικονομείται χρόνος που απαιτείται για τη δημιουργία και την επακόλουθη εκτέλεση μιας δοκιμής, κρίσιμα ελαττώματα ειδικά εκείνα που μπορούν να επηρεάσουν την επιχείρηση μπορούν να βρεθούν στο ίδιο το μπροστινό μέρος.
# 5) Ο κώδικας, η τεκμηρίωση που σχετίζεται με το BDD είναι εύκολα κατανοητές και διατηρήσιμες, καθώς δεν απαιτείται άλλη προσπάθεια για τη διατήρηση του κώδικα, καθώς τα έγγραφα και ο αντίστοιχος κώδικας σχετίζονται ήδη. Ως εκ τούτου, αυτό που αναφέρεται στην τεκμηρίωση, δηλαδή σενάρια, θα έχει τον αντίστοιχο κωδικό του.
# 6) Δεδομένου ότι έχουμε πολύ εύκολα κατανοητά σενάρια, μπορούμε εύκολα να τα χωρίσουμε σε εργασίες, δευτερεύουσες εργασίες κ.λπ. με λογικό τρόπο.
# 7) Η ομάδα μπορεί να είναι πιο δυναμική, ευέλικτη καθώς υπάρχει σαφής σαφήνεια σχετικά με τα σενάρια, τα κριτήρια αποδοχής και σχεδόν ακριβή εκτίμηση δοκιμών.
# 8) Πολύ καλή πλατφόρμα για ένα νέο μέλος για να καλλωπιστεί με την υπάρχουσα ομάδα τόσο από την άποψη της τεκμηρίωσης όσο και του κώδικα λόγω της απλότητας του.
# 9) Όχι μόνο βοηθά στην επικύρωση των σεναρίων (κυρίως UI, που σχετίζονται με τη συμπεριφορά), αλλά βοηθά επίσης σε περιπτώσεις δοκιμών σε επίπεδο μονάδας.
# 10) Επίσης, είναι χρήσιμο να παρακολουθείτε την πρόοδο της ομάδας από την πρώτη μέρα, επειδή οι απαιτήσεις και τα σενάρια ορίζονται σαφώς (κάτι που οι προγραμματιστές συνήθως παλεύουν να συλλέξουν στο TDD).
Ως εκ τούτου, η εφαρμογή του BDD καταργεί την υπόθεση ότι «ο τελικός πελάτης δεν σκέφτεται τη σημασία της δοκιμής», «ο πελάτης δεν θέλει να εμπλακεί στις δοκιμαστικές δραστηριότητες» κ.λπ.
Εργαλεία BDD
Υπάρχουν πολλά εργαλεία δοκιμών που μας επιτρέπουν να εφαρμόσουμε την προσέγγιση BDD.
Οπως:
- Αγγούρι
- SpecFlow
- Τζαμπέιβ
- Μαρούλι
- Συμφωνία
- FitNesse
- BeanSpec
- Εύκολο Β
- Τζντάβε
- Givwenzen-flex
- GivWenZen
- Ενστικτο
- Γυαλί ανατροπής
- Gospecify
- Θεαματικός
- dSpec
- Διόπτρα
- Μπριζόλα
- JSSpec
Μεταξύ των παραπάνω εργαλείων, το Jbehave λειτουργεί αρκετά παρόμοιο με το Αγγούρι, ωστόσο, αυτά είναι ελαφρώς διαφορετικά όσον αφορά την εφαρμογή τους.
JBEHAVE | ΑΓΓΟΥΡΙ |
---|---|
Υποστηρίζει εξωτερικές πηγές δεδομένων | Δεν υποστηρίζει εξωτερικές πηγές δεδομένων |
Υποστηρίζει ιστορίες | Υποστηρίζει χαρακτηριστικά |
Πολύ καλή τεκμηρίωση | Δεν υπάρχει τυπική τεκμηρίωση |
Υποστηρίζει σύνθετα βήματα | Δεν υποστηρίζει σύνθετα βήματα |
Όχι τόσο ευέλικτο | Ευέλικτη παράμετρος διέλευσης |
Δεν υποστηρίζει φόντο | Υποστηρίζει φόντο |
Όχι τόσο εκτεταμένες αναφορές | Καλύτερη ευελιξία μορφοποίησης, ενσωματωμένες αναφορές |
Αναπτύχθηκε χρησιμοποιώντας Java | Αναπτύχθηκε χρησιμοποιώντας Ruby |
Γιατί αγγούρι;
Το αγγούρι χρησιμοποιείται για τη σύνταξη όλων των ειδών δοκιμαστικών περιπτώσεων, ιδίως για τις δοκιμαστικές περιπτώσεις επιπέδου αποδοχής (για τις οποίες ενδιαφέρονται περισσότερο οι τελικοί χρήστες), γραμμένες σε στυλ ανάπτυξης βάσει συμπεριφοράς. Υποστηρίζει τη χρήση αναλυτών γλωσσών όπως το Gherkin.
Αρχικά, το αγγούρι γράφτηκε χρησιμοποιώντας γλώσσα προγραμματισμού Ruby και αναπτύχθηκε ειδικά για δοκιμές Ruby. Τώρα, υποστηρίζεται από άλλες γλώσσες προγραμματισμού όπως η Java.
Το Gherkin χρησιμοποιείται ως γλώσσα στην οποία οι δοκιμαστικές θήκες γράφονται σε απλή μορφή και μπορούν επίσης να διαβαστούν και να τροποποιηθούν από έναν μη τεχνικό χρήστη.
Εκτός από τα Αγγλικά, το Αγγούρι υποστηρίζει και άλλες γλώσσες.
Πώς λειτουργεί το αγγούρι;
Ερχόμενοι στον μηχανισμό λειτουργίας του, πρώτα, αφήνουμε στους χρήστες (τεχνικούς / μη τεχνικούς) να γράψουν τις επιθυμητές δοκιμαστικές τους περιπτώσεις (ως χαρακτηριστικά) χρησιμοποιώντας τη σύνταξη Gherkin, αφού ολοκληρωθεί, πρέπει να βεβαιωθούμε ότι έχουν εγκριθεί ώστε να μπορούν να μεταβούν το επόμενο επίπεδο.
Μετά από αυτό, πρέπει να εφαρμόσουμε δηλαδή να γράψουμε σενάρια για κάθε γραμμή (χρησιμοποιώντας ένα αρχείο stepdef) όπως αναφέρεται στο αρχείο χαρακτηριστικών. Μόλις εφαρμοστούν οι κωδικοί, το επόμενο πράγμα θα ήταν να εκτελέσετε τα σενάρια (χρησιμοποιώντας ένα αρχείο δρομέα).
Περιβαλλοντική ρύθμιση
Η περιβαλλοντική ρύθμιση για το Αγγούρι είναι ελαφρώς περίπλοκη σε σύγκριση με την εργασία με οποιοδήποτε άλλο εργαλείο όπως το Eclipse ή οποιοδήποτε άλλο IDE.
Προκλήσεις
Πρέπει να βεβαιωθούμε ότι οι εκδόσεις των αγγείων αγγουριών ταιριάζουν με την εγκατεστημένη έκδοση Java καθώς και με το IDE στο οποίο εργαζόμαστε αυτήν τη στιγμή.
Περιβαλλοντικές ρυθμίσεις
# 1) Πρόσθετο αγγουριού Eclipse : Βοηθά το Eclipse να κατανοήσει τη σύνταξη Gherkin και επισημαίνει τη σύνταξη του αρχείου δυνατοτήτων αντί για απλό κείμενο.
Πρέπει να πάμε Eclipse >> Βοήθεια >> Εγκατάσταση νέου λογισμικού >> Κάντε κλικ στο κουμπί Προσθήκη >> Καθορίστε την τοποθεσία όπως και Αυτό . Το όνομα λέει 'Αγγούρι' και μετά κάντε κλικ στο OK και ακολουθήστε τη διαδικασία εγκατάστασης.
Επιτέλους επανεκκινήστε το IDE σας, δηλαδή το Eclipse.
#δύο) Χρησιμοποιήστε το Maven για να έχετε όλα τα βάζα, δηλαδή εξαρτήσεις, πρόσθετα κ.λπ. όπως αναφέρεται παρακάτω.
4.0.0 com cucumber.example 0.0.1-SNAPSHOT jar cucumber.example http://maven.apache.org UTF-8 org.seleniumhq.selenium selenium-java 3.6.0 org.seleniumhq.selenium selenium-chrome-driver 3.6.0 info.cukes cucumber-core 1.2.5 info.cukes cucumber-java 1.2.5 test info.cukes cucumber-junit 1.2.5 test junit junit 4.11 test info.cukes cucumber-testng 1.2.0 info.cukes gherkin 2.12.2 provided log4j log4j 1.2.17 org.apache.poi poi-ooxml 3.9 org.apache.poi poi 3.11-beta3 xml-apis xml-apis 2.0.2 xerces xercesImpl 2.8.0 info.cukes cucumber-jvm-deps 1.0.5 provided org.apache.maven.plugins maven-surefire-plugin 2.18 org.apache.maven.surefire surefire-junit47 2.18
# 3) Βεβαιωθείτε ότι κάνουμε Ctrl + s ή εκτελέσουμε την εγκατάσταση Maven.
# 4) Μετά από αυτό, φροντίστε να εκτελέσετε το Maven build για να αποφύγετε τυχόν σφάλματα που σχετίζονται με την εξάρτηση, ώστε να μην έχουμε αργότερα κάποια εξάρτηση, προσθήκη, σφάλμα αναντιστοιχίας έκδοσης.
τύποι δοκιμαστικής θήκης σε δοκιμές λογισμικού
# 5) Μόλις ολοκληρωθούν τα παραπάνω βήματα, το περιβάλλον μας είναι έτοιμο.
Γράψιμο δοκιμαστικών περιπτώσεων με χρήση αγγουριού
Το αγγούρι περιλαμβάνει τα ακόλουθα τρία αρχεία:
- Αρχείο χαρακτηριστικών: Εδώ γράφουμε τις δυνατότητες που θα δοκιμαστούν σε μορφή Gherkin, δηλ. Δεδομένου όταν τότε. Μπορούμε ακόμη και να εκτελέσουμε το αρχείο χαρακτηριστικών για την εκτέλεση των δοκιμαστικών σεναρίων που είναι γραμμένα στο αρχείο Stepdef.
- Αρχείο Stepdef: Μόλις το αρχείο δυνατοτήτων είναι έτοιμο, κάθε πρόταση του αρχείου δυνατοτήτων μπορεί να εφαρμοστεί περαιτέρω μέσω του αρχείου Stepdef.
- Αρχείο δρομέα: Αυτό είναι απλώς για να εκτελέσετε το πραγματικό δοκιμαστικό σενάριο που γράφτηκε πάνω από το αρχείο Stepdef αναφερόμενοι στο αρχείο χαρακτηριστικών. Εκτός από αυτό, έχει πολλές άλλες επιλογές για προσαρμογή, αναφορά, επιλεκτική εκτέλεση κ.λπ.
Εδώ είναι ένα απλό παράδειγμα αρχείου Runner
package runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features='Features', glue='com.Multi', plugin={'html:target/cucumber-html-report', 'json:target/cucumber.json', 'pretty:target/cucumber-pretty.txt','usage:target/cucumber-usage.json', 'junit:target/cucumber- results.xml'}, dryRun = false, monochrome = true, tags={'@Smoke,@Regression'} ) public class Runner { }
Δημιουργία αρχείων για αγγούρι
- Αρχείο Stepdef - Src / test / java >> Νέο >> Άλλα >> Αγγούρι >> StepDef class.
- Αρχείο χαρακτηριστικών - Έργο >> Νέο >> Αρχείο >> καθορίστε το όνομα για το αρχείο με επέκταση ως '.feature'.
- Αρχείο δρομέα - Είναι παρόμοιο με οποιαδήποτε άλλη δημιουργία κλάσης Java, αλλά ίσως χρειαστεί να εφαρμόσουμε κάποια μέθοδο εδώ.
Χαρακτηριστικά αγγουριού
Εδώ είναι μερικά από τα βασικά χαρακτηριστικά του Αγγουριού που, θα εφαρμόσουμε στο Test Script μας.
# 1) Γάντζοι αγγουριών
Αυτά είναι τα μπλοκ του κώδικα που εκτελείται πριν ή μετά από κάθε σενάριο. Για να τα ορίσουμε, οπουδήποτε στο έργο μας. Για παράδειγμα, Ορισμός βημάτων.
Σύμφωνα με τον ορισμό, αυτά είναι μόνο δύο σχόλια @ Μετά και @ Πριν. Στην κονσόλα, μπορούμε να δούμε τα μπλοκ να εκτελούνται και να δίνουν καθαρή έξοδο. Μπορούμε επίσης να εκτελέσουμε τα άγκιστρα για συγκεκριμένες ετικέτες.
# 2) Ετικέτες αγγουριού
Συνήθως χρησιμοποιούνται πάνω από το αρχείο χαρακτηριστικών για να ταξινομήσουν τα σενάρια πάνω από τα αρχεία χαρακτηριστικών σύμφωνα με το όνομα ετικέτας που τους δίνεται. Μπορούμε να έχουμε πολλές ετικέτες για ένα δεδομένο σενάριο στο αρχείο δυνατοτήτων.
Οι ετικέτες καθορίζονται από το χρήστη και μπορούμε να δώσουμε οποιοδήποτε όνομα σε αυτές όπως το @Smoke, @Regression κ.λπ.
# 3) Σχολιασμοί αγγουριών
Αυτά είναι ενσωματωμένα στο Αγγούρι. Κανονικά οι ετικέτες είναι @Given, @When, @Then.
Ωστόσο, αργότερα, αν χρειαστεί, μπορούμε να δημιουργήσουμε τον δικό μας σχολιασμό και στη συνέχεια να τον χρησιμοποιήσουμε στο πρόγραμμά μας. Κατά την εκτέλεση, ο αντίστοιχος κώδικας κόλλας δηλ. Οι λειτουργίες γράφονται σε ένα αρχείο Stepdef με το @Given, @When, @Then θα εκτελεστεί.
# 4) Φόντο αγγούρι
Αυτά είναι βήματα ή σειρά βημάτων που είναι κοινά σε όλα τα σενάρια στο αρχείο δυνατοτήτων.
Μας επιτρέπει να προσθέσουμε κάποιο πλαίσιο στα σενάρια για ένα χαρακτηριστικό όπου ορίζεται. Εκτελείται πριν από κάθε σενάριο για ένα χαρακτηριστικό στο οποίο ορίζεται.
# 5) Πίνακες δεδομένων αγγουριών
Το Cucumber έχει τη δυνατότητα να υποστηρίζει δοκιμές βάσει δεδομένων, η οποία μας επιτρέπει να εκτελούμε αυτόματα μια δοκιμαστική θήκη πολλές φορές με διαφορετικές τιμές εισαγωγής και επικύρωσης για ένα δεδομένο σενάριο.
Το αγγούρι υποστηρίζει τον πίνακα δεδομένων. Η πρώτη σειρά θεωρείται ως στήλη και οι γραμμές δίπλα της είναι τα δεδομένα για τα σενάρια.
# 6) Μεταφορά αγγουριού
Αυτή είναι μια μικρή τροποποίηση στον πίνακα δεδομένων Αγγούρι. Εδώ η πρώτη στήλη θα θεωρείται ως στήλη και οι επόμενες στήλες θεωρούνται δεδομένα για τα σενάρια.
# 7) Πολυ σενάρια αγγουριών
Το αγγούρι μας επιτρέπει να εκτελούμε δοκιμές πολλαπλών σεναρίων σε ένα αρχείο χαρακτηριστικών.
# 8) Αναφορά αγγουριών
Σε αντίθεση με την αναφορά και άλλα εργαλεία τρίτων μερών όπου πρέπει να κάνουμε κάποια διαμόρφωση για την προβολή της αναφοράς.
Εδώ στο Cucumber, έχουμε ενσωματωμένα πρόσθετα, όπως όμορφα, JSON, HTML, XML, τα οποία μας δίνουν την ολοκληρωμένη αναφορά εκτέλεσης δοκιμών.
TestNG με αγγούρι
Μπορούμε ακόμα να εκτελέσουμε τις δοκιμαστικές θήκες JUnit γραμμένες στο Αγγούρι χρησιμοποιώντας το TestNG ακολουθώντας:
- Πρέπει να προσθέσουμε τις εξαρτήσεις στο έργο Maven.
- Επέκταση της τάξης στην κλάση Runner ως δρομέας πακέτων AbstractTestNGCucumberTests.
- Μετατρέψτε το έργο maven και προσθέστε το πακέτο (όπου υπάρχει η κλάση δρομέων).
Μετά από αυτό, μπορούμε να εκτελέσουμε ολόκληρη τη δοκιμαστική θήκη αγγουριού ως TestNG και να δημιουργήσουμε αναφορές που σχετίζονται με το ίδιο (αν έχουμε τους ακροατές).
Σε αυτό το σεμινάριο, θα συζητήσουμε 3 διαφορετικά παραδείγματα αγγουριών για να καλύψουμε τις παραπάνω έννοιες
Παράδειγμα 1
Θα καλύψει αγκίστρια, ετικέτες, σχολιασμούς, φόντο, πολλαπλά σενάρια και TestNG με Αγγούρι.
Μόλις ρυθμιστεί το περιβάλλον δοκιμής:
- Προσθέστε το πρόσθετο Eclipse Cucumber στο Eclipse.
- Δημιουργήστε ένα έργο Maven και προσθέστε όλες τις απαιτούμενες εξαρτήσεις σε αυτό και προσθέστε επίσης την εξάρτηση που σχετίζεται με το TestNG στο Maven.
- Δημιουργήστε ένα νέο αρχείο χαρακτηριστικών.
- Προσθέστε την απαιτούμενη εφαρμογή για αυτό στο αρχείο Stepdef.
- Τώρα δημιουργήστε ένα αρχείο δρομέα με εκτεταμένες AbstractTestNGCucumberTests.
- Μετατρέψτε το έργο Maven σε TestNG και στο testng.xml προσθέστε τη διαδρομή πακέτου της τάξης δρομέων Cucumber.
- Εκτελέστε το αρχείο TestNG.xml.
Αρχείο χαρακτηριστικών
Χαρακτηριστικό:
Ως χρήστης
Θέλω να μπορώ να προσθέσω νέους πελάτες στο σύστημα
Για να μπορώ να προσθέσω λογιστικά δεδομένα για αυτόν τον πελάτη
Ιστορικό:
Δεδομένου ότι είμαι στην αρχική σελίδα του Github
Όταν ορίζω το όνομα χρήστη ως 'xxxxxxxxxxxxxxxxxxxx' και τον κωδικό πρόσβασης ως 'xxx'
Και κάντε κλικ στο κουμπί Είσοδος
@Καπνός
Σενάριο: Επεξεργασία του προφίλ
Δεδομένου κάνω κλικ στην επιλογή Προφίλ σας
Όταν κάνω κλικ στο κουμπί επεξεργασίας προφίλ
Και ανέβασε νέα εικόνα
Τότε θα έπρεπε να βλέπω νέα εικόνα προφίλ
@Regression @ Κάθε φορά
Σενάριο: Δημιουργήστε νέα ουσία
Δεδομένου, κάνω κλικ στην επιλογή σας Gists
Όταν παρέχω όνομα αρχείου, περιγραφή
Και κάντε κλικ στο Δημιουργία δημόσιας βασικής μεθόδου
Τότε θα έπρεπε να βλέπω τη νέα ουσία
Αρχείο Stepdef
package com.Multi; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.runtime.ScenarioImpl; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.ScenarioOutline; import cucumber.api.DataTable; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.cli.Main; public class Step2 { static public String sb; static public String sa; static WebDriver driver = null; @Before('@Smoke,@Regression') public void beforeScenario(){ System.out.println('New scenario begins'); } @After('@Smoke,@Regression') public void afterScenario(){ System.out.println('Scenario ends'); } @MyAnnotation public static void myanno() { System.out.println('my annot gets executed'); } @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2){ driver.findElement(By.cssSelector('input#login_field')).sendKeys(arg1); driver.findElement(By.cssSelector('input#password')).sendKeys(arg2); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Profile option$') public void i_click_on_Your_Profile_option(){ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your profile')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I click on edit profile button$') public void i_click_on_edit_profile_button(){ driver.findElement(By.xpath('//*(@id='js-pjax -container')/div/div(2)/div(1)/a')).click(); // Write code here that turns the phrase above into concrete actions } @When('^Uploaded new picture$') public void uploaded_new_picture() throws InterruptedException{ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); driver.findElement(By.id('upload-profile -picture')).sendKeys('D://cucumberFinal//multiple//Files//images.jpg'); Thread.sleep(10000); String wh = driver.getWindowHandle(); driver.switchTo().window(wh); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')); Thread.sleep(10000); actions.moveToElement(element); //Thread.sleep(10000); actions.click(); //actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')).click(); Thread.sleep(3000); // Write code here that turns the phrase above into concrete actions } @Then('^I should be seeing new profile picture$') public void i_should_be_seeing_new_profile_picture(){ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); if(!(sb.equals(sa))) { Assert.assertTrue('File Upload successful', true); } // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Gists option$') public void i_click_on_Your_Gists_option(){ driver.findElement(By.xpath('//*(@id='user-links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your Gists')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I provide filename, description$') public void i_provide_filename_description() throws InterruptedException { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//div(@class='edit container')/div(@id='gists')/input')).sendKeys('Gist1'); Thread.sleep(2000); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')); actions.moveToElement(element); actions.click(); actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')).sendKeys('GIST1 Description'); Thread.sleep(2000); } @When('^click on Create public gist method$') public void click_on_Create_public_gist_method() { driver.findElement(By.xpath('//*(@id='new_gist')/div(2)/div(2)/button(1)')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^i should be seeing the new gist$') public void i_should_be_seeing_the_new_gist(){ List glist = driver.findElements(By.xpath('//div(@class='container repohead-details- container')/ul(1)/li(@class='flex-auto')/div/a')); for(WebElement o:glist) { if(o.getText().equals('Gist1')) { System.out.println('Gist created successfully'); } } // Write code here that turns the phrase above into concrete actions } }
Εδώ είναι το αποτέλεσμα δοκιμής του TestNG XML
Η προεπιλεγμένη αναφορά TestNG μοιάζει με αυτήν που δίνεται παρακάτω.
Παράδειγμα 2
Θα καλύψει πίνακες δεδομένων και θα μεταφέρει.
Μόλις ρυθμιστεί το Περιβάλλον:
- Προσθέστε το πρόσθετο Eclipse Cucumber στο Eclipse.
- Δημιουργήστε ένα έργο Maven και προσθέστε όλες τις απαιτούμενες εξαρτήσεις σε αυτό.
- Δημιουργήστε ένα νέο αρχείο χαρακτηριστικών.
- Προσθέστε την απαιτούμενη εφαρμογή για αυτό στο αρχείο stepdef.
- Εκτελέστε απευθείας από το αρχείο χαρακτηριστικών κάνοντας δεξί κλικ στο αρχείο >> Εκτέλεση ως >> Cucumber.feature
Αρχείο δυνατοτήτων
Χαρακτηριστικό: Τίτλος της δυνατότητάς σας
Θέλω να χρησιμοποιήσω αυτό το πρότυπο για το αρχείο δυνατοτήτων μου
Ιστορικό:
Δεδομένου ότι είμαι στη σελίδα σύνδεσης του Gmail
Όταν καθορίζω το όνομα χρήστη και τον κωδικό πρόσβασης
Και κάντε κλικ στο κουμπί Είσοδος
Σενάριο: Δημιουργήστε νέο μήνυμα από τον πίνακα δεδομένων
Όταν βρίσκομαι σε νέα σελίδα ηλεκτρονικού ταχυδρομείου
Και καθορίζω τις ακόλουθες λεπτομέρειες
| To1 | Θέμα |
| Person1@email.com | Άτομο1 θέμα |
| Person2@email.com | Άτομο2 θέμα |
Σενάριο: Δημιουργία νέου μηνύματος από τον πίνακα μεταφοράς δεδομένων
Όταν βρίσκομαι σε νέα σελίδα ηλεκτρονικού ταχυδρομείου
Και καθορίζω τις ακόλουθες λεπτομέρειες από τον πίνακα μεταφοράς
| To1 | Person1@email.com | Person2@email.com |
| Θέμα | Άτομο1 θέμα | Άτομο2 θέμα |
Αρχείο Stepdef
package com.datatable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.time.*; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.DataTable; import cucumber.api.Transpose; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import gherkin.formatter.model.Examples; import cucumber.runtime.CucumberException; import cucumber.runtime.ParameterInfo; import cucumber.runtime.xstream.LocalizedXStreams; public class Step3 { static public WebDriver driver; @Given('^I am on Gmail login page$') public void i_am_on_Gmail_login_page() throws InterruptedException{ System.setProperty('webdriver.chrome.driver', 'Executables/chromedriver.exe'); driver= new ChromeDriver(); Actions act = new Actions(driver); driver.manage().window().maximize(); driver.navigate().to('https://www.google.com/gmail/about'); driver.findElement(By.xpath('//nav/div/a(2)')).click(); Thread.sleep(3000); } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() throws InterruptedException{ driver.findElement(By.xpath('//input(@type='email')')).sendKeys('xxxxxx@xxx. com'); driver.findElement(By.xpath('//*(@id='identifierNext')/content/span')).click(); Thread.sleep(3000); driver.findElement(By.xpath('//input(@type='password')')).sendKeys('xxxxxxxx xxx'); } @When('^Click on SignIn button$') public void click_on_SignIn_button() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='passwordNext')/content/span')).click(); Thread.sleep(5000); } @When('^I am on New Email Page$') public void i_am_on_New_Email_Page(){ } @When('^I specify following details$') public void i_specify_following_details(DataTable tables)throws Throwable{ for (Map row : tables.asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^I specify following details from transpose table$') public void i_specify_following_details_from_transpose_table(DataTable tables) throws InterruptedException { // DataTable tables = null; for (Map row : tables.transpose().asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). Thread.sleep(2000); System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).click(); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^then click on Send button$') public void then_click_on_Send_button(){ // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to send the email successfully$') public void i_should_be_able_to_send_the_email_successfully() { // Write code here that turns the phrase above into concrete actions }
Παραγωγή : Έτσι, το παραπάνω παράδειγμα θα συνδεθεί στο Gmail και θα στείλει δύο μηνύματα ηλεκτρονικού ταχυδρομείου για κάθε σενάριο που αφορά τον πίνακα δεδομένων και τον πίνακα δεδομένων μεταφοράς.
Παράδειγμα 3
Θα καλύψει τις αναφορές.
Μόλις ρυθμιστεί το Περιβάλλον:
- Προσθέστε το πρόσθετο Eclipse Cucumber στο Eclipse.
- Δημιουργήστε ένα έργο Maven και προσθέστε όλες τις απαραίτητες εξαρτήσεις σε αυτό.
- Δημιουργήστε ένα νέο αρχείο χαρακτηριστικών.
- Προσθέστε την απαιτούμενη εφαρμογή για αυτό στο αρχείο Stepdef.
- Δημιουργήστε μια κλάση δρομέα και εκτελέστε την κλάση δρομέα.
- Δείτε όλους τους τύπους αναφορών.
Αρχείο χαρακτηριστικών
Χαρακτηριστικό: Τίτλος της δυνατότητάς σας
Θέλω να χρησιμοποιήσω αυτό το πρότυπο για το αρχείο δυνατοτήτων μου
@ ετικέτα1
Σενάριο: Τίτλος του σεναρίου σας
Δεδομένου ότι είμαι στην αρχική σελίδα του Github
Όταν καθορίζω το όνομα χρήστη και τον κωδικό πρόσβασης
Και κάντε κλικ στο κουμπί Είσοδος
Τότε θα πρέπει να μπορώ να δω την επιλογή αποσύνδεσης
Αρχείο Stepdef
package com.cucumber; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.api.DataTable; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.api.cli.Main; public class Step1 { static WebDriver driver = null; @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() { driver.findElement(By.cssSelector('input#login_field')).sendKeys('chintamoni .patra@gmail.com'); driver.findElement(By.cssSelector('input#password')).sendKeys('Test@123'); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to see logout option$') public void I_should_be_able_to_see_logout_option() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); WebElement opt = driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/ul/li')); List olist = opt.findElements(By.xpath('//li/form/button')); for(WebElement o : olist) { System.out.println(o); } //int a = olist.size(); System.out.println(olist.get(0).getText()); olist.get(0).click(); Thread.sleep(2000); // Write code here that turns the phrase above into concrete actions } }
Ακολουθούν οι διάφοροι τύποι αναφορών που δημιουργούνται από το αγγούρι:
Αναφορά HTML
Αρκετά
Τζούνιτ
συμπέρασμα
Όντας ένα εργαλείο ανοιχτού κώδικα, το αγγούρι χρησιμοποιείται ευρέως στο BDD. Και είναι πολύ εύκολο να γίνει κατανοητό και έχει πολλά περιθώρια σε σχέση με τις νέες δυνατότητες και είναι πρακτικά δυνατό να ενσωματωθεί το Αγγούρι με το Σελήνιο ή οποιαδήποτε άλλα εργαλεία / βάζα τρίτων κατασκευαστών κ.λπ.
Καθώς διαθέτει ενεργές ομάδες βοήθειας / μέλη, γίνεται πραγματικά εύκολο για όποιον μόλις άρχισε να μαθαίνει Αγγούρι ή για εκείνους που έχουν ενδιάμεση γνώση στο Αγγούρι / BDD.
Το αγγούρι υποστηρίζει περαιτέρω την ενσωμάτωση με το φύλλο excel και Jenkins επίσης.
Συνιστώμενη ανάγνωση
- Cucumber Selenium Tutorial: Αγγούρι Java Selenium WebDriver Integration
- Εκμάθηση Python DateTime με παραδείγματα
- Δοκιμή REST API με αγγούρι με προσέγγιση BDD
- Έλεγχος αυτοματισμού με χρήση εργαλείου αγγουριού και σεληνίου - Σελήνιο Tutorial # 30
- Εκμάθηση αγγουριών αγγουριού: Δοκιμή αυτοματισμού με χρήση αγγουριού
- Unix Shell Scripting Tutorial με παραδείγματα
- Selenium Find Element By Text Tutorial με παραδείγματα
- Java 'αυτό' Λέξη-κλειδί: Εκμάθηση με παραδείγματα κώδικα