step argument transformations specflow tables
Βήμα Argument Transformations & Specflow Tables Tutorial:
Το προηγούμενο σεμινάριο Specflow μας ενημέρωσε τα πάντα Κοινόχρηστοι και δεσμευμένοι δεσμοί, γάντζοι και επαναχρησιμοποίηση βημάτων λεπτομερώς. Εδώ σε αυτό το σεμινάριο, θα διερευνήσουμε περισσότερα σχετικά με το Step Argument Transformations στο Specflow.
Μη διστάσετε να διαβάσετε το δικό μας Πλήρης οδηγός κατάρτισης Specflow για αρχάριους για μια σαφή κατανόηση της έννοιας. Το χαρακτηριστικό Step Argument Transformation του Specflow, επιτρέπει στον χρήστη να παρέχει προσαρμοσμένο μετασχηματισμό για τις παραμέτρους που παρέχονται στα Steps.
Επιτρέπει την προσθήκη προσαρμοσμένης λογικής για τη μετατροπή παραμέτρων εισόδου σε συγκεκριμένη παράμετρο. Για παράδειγμα, Μπορείτε να δημιουργήσετε απευθείας ένα αντικείμενο κλάσης από τις παραμέτρους και να επιστρέψετε το δομημένο αντικείμενο από τη λειτουργία μετασχηματισμού.
Ένα άλλο χαρακτηριστικό του Specflow που θα το εξετάσουμε είναι Specflow Tables που επιτρέπουν τη μεταφορά δεδομένων εισόδου σε μορφή πίνακα με ένα μόνο βήμα και οι βοηθοί του πίνακα μπορούν να το χαρτογραφήσουν απευθείας σε μια παρουσία αντικειμένου όπως επιθυμείται.
Δες το βίντεο:
Ακολουθεί ένα εκπαιδευτικό βίντεο για τους πίνακες Step Argument Transformations & Specflow:
Τι θα μάθετε:
Βήμα Argument Transformations
Για να κατανοήσουμε καλύτερα τους μετασχηματισμούς Argument, ας προσπαθήσουμε πρώτα να καταλάβουμε πώς ακριβώς ταιριάζει το Specflow με τις παραμέτρους. Όπως είδαμε στα προηγούμενα άρθρα μας, για παράδειγμα αναζήτησης στο YouTube, περάσαμε τον όρο αναζήτησης ως παράμετρο για την εκτέλεση του σεναρίου.
Η αντιστοίχιση παραμέτρων συμβαίνει συνήθως μέσω μιας κανονικής έκφρασης και το αντίστοιχο regex οδηγεί στον καθορισμό της παραμέτρου μεθόδου στον παρεχόμενο όρο αναζήτησης στο βήμα.
Ας προσπαθήσουμε πρώτα να κατανοήσουμε ποιες είναι οι προεπιλεγμένες υποστηριζόμενες μετατροπές στο Specflow και πότε οι μετασχηματισμοί ορίσματος μπορούν να βοηθήσουν.
Υποστηριζόμενες μετατροπές
Το Specflow υποστηρίζει πολλές μετατροπές εκτός πλαισίου, εξετάζοντας τον ίδιο τον τύπο δεδομένων μετά την αντιστοίχιση regex. Μπορεί να φροντίζει αυτόματα για μετατροπές όπως - String, ακέραιος αριθμός, GUID, Enums κ.λπ.
Ας δούμε ένα παράδειγμα για μερικά από τα παρακάτω:
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
Στο παραπάνω δείγμα κώδικα, έχουμε επισημάνει διαφορετικούς τύπους εισόδου που περνάμε στα Βήματα και στις υλοποιήσεις βήμα, αυτοί μετατρέπονται στους αντίστοιχους τύπους δεδομένων.
Ας δούμε τις υλοποιήσεις βημάτων για αυτά παρακάτω (για απλότητα μόλις κάναμε μια κονσόλα για κάθε ένα από τα βήματα για να δείξουμε ότι το όρισμα που παρέχεται μετατρέπεται αυτόματα στον αναμενόμενο τύπο):
(Given(@'I have entered customer name as (.*)')) public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } (Given(@'I have entered customer account id as (.*)')) public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } (Given(@'I select sorting order as (.*)')) public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } (Then(@'I should see my account transactions')) public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } (Given(@'I select number of transactions to be displayed as (.*)')) public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
Κατά την εκτέλεση του παραπάνω σεναρίου, η έξοδος εκτυπώνει όλες τις τιμές με επιτυχία, υποδεικνύοντας ότι η αυτόματη μετατροπή ορισμάτων σε αναμενόμενους τύπους δεδομένων ήταν επιτυχής.
Έτσι φαίνεται η έξοδος:
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
Μετασχηματισμοί επιχειρημάτων
Ας δούμε ένα παράδειγμα σε δράση για να το καταλάβουμε. Υποστήριξη, έχετε μια εφαρμογή που μετατρέπει τον δεδομένο χρόνο και τη μετατρέπει σε λεπτά. Παράδειγμα: Εάν η είσοδος χρήστη είναι 1 ημέρα - η έξοδος είναι - 1440, εάν η είσοδος χρήστη είναι 1 ημέρα 2 ώρες 2 λεπτά, τότε η έξοδος θα πρέπει να είναι 1562.
Τώρα, μπορεί να φανεί ότι για να υποστηρίξει διαφορετικούς τύπους εισόδων, κάποιος θα πρέπει να γράψει διαφορετικές δεσμευτικές υλοποιήσεις ανάλογα με τον τύπο των εισόδων. Για παράδειγμα: Για εισόδους που έχουν μόλις μέρος, θα υπάρχει ξεχωριστή εφαρμογή βήματος, για εισόδους που έχουν μέρος ημέρας, μήνα - θα υπάρχει ξεχωριστή εφαρμογή βήματος κ.λπ.
Ας δούμε πώς αυτό μπορεί να εφαρμοστεί μέσω μιας εφαρμογής ενός βήματος μέσω του μετασχηματισμού Step Argument και η παρεχόμενη είσοδος μετατρέπεται απλώς σε αντικείμενο χρονικής σήμανσης και επιστρέφεται στο αρχικό βήμα που ονομάζεται μετασχηματισμός βημάτων.
Σκεφτείτε το ως σάρωση regex πρώτου επιπέδου στην είσοδό σας, η οποία επιστρέφει την μερικώς μετασχηματισμένη τιμή στο βήμα κλήσης.
Κοιτάξτε το αρχείο χαρακτηριστικών που έχει 3 διαφορετικές παραλλαγές εισόδου, με ένα μόνο μετασχηματισμό μετατρέποντάς το σε πλήρες αντικείμενο χρονικής διάρκειας και επιστρέφοντας πίσω.
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
Κοιτάξτε τις επισημασμένες τιμές στο παραπάνω παράδειγμα κώδικα. Όλα αυτά θα φροντίσουν για τον ίδιο ακριβώς μετασχηματισμό και το τελικό αποτέλεσμα θα είναι μια μετασχηματισμένη τιμή εισόδου TimeSpan που αποστέλλεται πίσω στο καλούμενο Specflow Step.
Ας δούμε την εφαρμογή του Μετασχηματισμού παρακάτω:
(StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')) public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
Για να γνωρίζει το πλαίσιο ότι είναι δεσμευτικός μετασχηματισμός, το χαρακτηριστικό StepArgumentTransformation Attribution πρέπει να προστεθεί στη μέθοδο εφαρμογής της μετατροπής Argument.
Τα άλλα σημαντικά σημεία που πρέπει να σημειωθούν σχετικά με τις μετατροπές με επιχειρήματα είναι:
# 1) Οι μετασχηματισμοί βημάτων βάσης εκτελούνται για κάθε βήμα αντιστοίχισης, ανεξάρτητα από τον τύπο του βήματος, δηλαδή εάν έχει δοθεί, πότε ή έπειτα, ο μετασχηματισμός θα συμβεί για κάθε αντίστοιχο regex.
#δύο) Ανάλογα με τον τύπο επιστροφής της μετασχηματισμένης εξόδου, εάν το πραγματικό βήμα κλήσης δεν έχει τον αντίστοιχο τύπο επιστροφής για την παράμετρο εισόδου, τότε ο μετασχηματισμός δεν θα πραγματοποιηθεί.
Αυτό σημαίνει ότι, ας υποθέσουμε ότι το βήμα κλήσης απαιτεί μετασχηματισμένη είσοδο, αλλά έχει την αναφερόμενη χρονική σήμανση εισόδου ως κάτι που δεν ταιριάζει με τον τύπο επιστροφής της μετασχηματισμένης μεθόδου, τότε η αντιστοίχιση regex θα παρακαμφθεί και η μετατροπή δεν θα πραγματοποιηθεί.
Ας δούμε την εφαρμογή της κλήσης του βήματος 'Δεδομένου':
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Κοιτάξτε εδώ τον τύπο της παραμέτρου εισόδου, δηλαδή το TimeSpan, το οποίο ταιριάζει με τον τύπο που επιστρέφεται από το βήμα μετασχηματισμού, εάν αυτό αλλάξει σε κάποιον άλλο τύπο. Για παράδειγμα String, τότε η μετατροπή ορίσματος δεν θα συμβεί και η αντιστοίχιση regex θα αντικατασταθεί από την αρχική εφαρμογή Step.
Επαγγελματική συμβουλή: Ένα σημαντικό σημείο που πρέπει να σημειωθεί εδώ είναι ότι ολόκληρο το κείμενο που πρέπει να μετασχηματιστεί πρέπει να τροφοδοτηθεί / αντιστοιχιστεί μέσω του μετασχηματισμού ορίσματος βήμα. Ως εκ τούτου, το δεδομένο βήμα θα τυλίξει τώρα όλες τις πιθανές μορφές εισόδου σε μία συμβολοσειρά και το regex μετασχηματισμού θα το μετατρέψει σε αντικείμενο TimeSpan και θα επιστρέψει πίσω.Πίνακες Specflow
Οι πίνακες Specflow είναι ένας τρόπος για να μεταβιβάσετε μια λίστα με τις τιμές στη λειτουργία υλοποίησης βήμα. Στα προηγούμενα άρθρα μας, εξετάσαμε τον τρόπο υλοποίησης τεστ βάσει δεδομένων χρησιμοποιώντας το περίγραμμα και τα παραδείγματα του σεναρίου. Αλλά αυτό ήταν κυρίως η εκτέλεση του σεναρίου με διαφορετικές εισόδους.
Εδώ, σε πίνακες, πρόκειται για τη διαβίβαση όλων των δεδομένων ταυτόχρονα σε μορφή πίνακα στην εφαρμογή βήματος που παρέχει δεδομένα.
Για παράδειγμα, σκεφτείτε ένα παράδειγμα όπου δοκιμάζετε ένα Σύστημα Διαχείρισης Φοιτητών και για να δημιουργήσετε ένα νέο αντικείμενο Φοιτητή, σας ζητείται να συμπληρώσετε πολλές λεπτομέρειες όπως όνομα, επώνυμο, ηλικία, έτος γέννησης κ.λπ.
Ένας τρόπος είναι να μεταβιβάσετε κάθε μια από αυτές τις πληροφορίες ως ξεχωριστό βήμα, το οποίο θα είναι ουσιαστικά πολύς κωδικός boilerplate και σε κάθε βήμα, θα καταλήξετε να ενημερώσετε το ίδιο αντικείμενο που πρέπει να δοκιμαστεί. Ένας άλλος τρόπος μπορεί να είναι η δημιουργία ενός σύνθετου regex και η προσπάθεια μετάδοσης όλων των δεδομένων στο ίδιο βήμα, αλλά είναι αρκετά επιρρεπές σε σφάλματα και ασταθή.
Τα τραπέζια έρχονται στη διάθεσή μας εδώ. Όλα τα δεδομένα εισαγωγής που σχετίζονται με τους μαθητές μπορούν να σταλούν στην εφαρμογή του ίδιου βήματος με έναν ωραίο πίνακα μέσω της δυνατότητας πίνακα του specflow.
Ας δούμε ένα δείγμα κώδικα παρακάτω για την εφαρμογή Χαρακτηριστικών και Βημάτων:
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
Τα δεδομένα του πίνακα επισημαίνονται στο παραπάνω Σενάριο Βήμα.
καλύτερη εφαρμογή διαχείρισης έργων για το iPhone
Το Specflow παρέχει πολλά TableHelpers, τα οποία επιτρέπουν άμεσα χρήσιμες λειτουργίες, όπως τη δημιουργία μιας παρουσίας αντικειμένου από τα δεδομένα εισαγωγής που παρέχονται από τον χρήστη, αντί να αναλύουν κάθε πεδίο μόνοι σας.
Ας δούμε το βήμα εφαρμογής παρακάτω:
private StudentInfo studInfo; (Given(@'I have entered following info for Student')) public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
Κοιτάξτε την επισημασμένη ενότητα παραπάνω. Εδώ είναι μόνο μια μικρή γραμμή κώδικα, ολόκληρο το αντικείμενο StudentInfo (το οποίο είναι ένα POCO που περιέχει τα πεδία δεδομένων μαθητών, δηλαδή όνομα, επώνυμο, ηλικία, έτος γέννησης κ.λπ.)
Ορισμένες άλλες δυνατότητες / έννοιες που σχετίζονται με τους πίνακες Specflow παρουσιάζονται παρακάτω:
# 1) Οι πίνακες μπορεί να είναι οριζόντιοι ή κάθετοι. Οι κάθετοι πίνακες μοιάζουν περισσότερο με ζεύγη τιμών-κλειδιών και στο παραπάνω σενάριο μοιάζουν περισσότερο με αντιστοιχίσεις ονομάτων-τιμών, ενώ οι οριζόντιοι πίνακες περιέχουν όλα τα δεδομένα για ένα αντικείμενο σε μία μόνο γραμμή (όπως είδαμε στο παράδειγμά μας).
#δύο) Οι κάθετοι πίνακες μπορούν να αντιστοιχιστούν σε ένα μόνο αντικείμενο .NET, ενώ οι οριζόντιοι πίνακες μπορούν επίσης να αντιστοιχιστούν σε ένα σύνολο ή συλλογή αντικειμένων.
# 3) Κάθε τιμή πεδίου στον πίνακα πρέπει να είναι ατομική καθώς θα αντιστοιχιστεί σε ένα αντίστοιχο πεδίο στο αντικείμενο ανάλυσης.
Ένα σημαντικό σημείο που πρέπει να σημειωθεί εδώ είναι ότι ακόμα κι αν εσείς auto-generate συνδέσεις βήμα με τα δεδομένα πίνακα, η γεννήτρια δέσμευσης Specflow θα λαμβάνει αυτόματα υπόψη αυτούς τους τύπους εισόδου και θα την αναγνωρίζει ως έγκυρα δεδομένα πίνακα.
συμπέρασμα
Σε αυτό το άρθρο, προσπαθήσαμε να εξηγήσουμε 2 σημαντικές και εύχρηστες έννοιες στο Specflow.
Το πρώτο βήμα είναι το Βήμα Μετασχηματισμοί επιχειρημάτων που επιτρέπουν μετατροπές προσαρμοσμένου τύπου για ορίσματα Specflow για την αποφυγή κωδικού boilerplate (και επιτρέπει στο σενάριο δοκιμής να φαίνεται πιο διαμορφωμένο και λογικό) και το δεύτερο χαρακτηριστικό που εξετάσαμε είναι Πίνακες Specflow τα οποία είναι χρήσιμα όταν πρέπει να περάσετε σε πολλά πεδία / δεδομένα σε ένα βήμα σε φιλική προς τον χρήστη μορφή πίνακα.
Στο επερχόμενο σεμινάριό μας, θα μάθουμε περισσότερα για το πώς μπορείτε να δημιουργήσετε αυτόματα όμορφη τεκμηρίωση χρησιμοποιώντας το Specflow σε διαφορετικές μορφές χρησιμοποιώντας εργαλεία ανοιχτού κώδικα όπως Pickles τα οποία μπορούν να χρησιμεύσουν σε μια εύκολη αναφορά για όλους τους ενδιαφερόμενους του έργου.
Εκπαιδευτικό πρόγραμμα PREV | ΕΠΟΜΕΝΟ Φροντιστήριο
Συνιστώμενη ανάγνωση
- Ανάπτυξη στο MongoDB: Εκμάθηση βήμα προς βήμα
- Βήμα προς βήμα εγκατάσταση και εγκατάσταση του Appium Studio
- Παράδειγμα Specflow και Selenium Webdriver End to End
- Ένας οδηγός βήμα προς βήμα για την ενοποίηση του QTP με ALM / QC
- Κορυφαίες 15 δημοφιλείς ερωτήσεις συνέντευξης Specflow
- Σύνθετες δεσμεύσεις Specflow Shared & Scoped Bindings, Hooks και Step Reuse
- Εγκαταστήστε το MongoDB στα Windows: Ένας οδηγός βήμα προς βήμα
- Πώς να ενσωματώσετε το JIRA με το qTest: Οδηγός βήμα προς βήμα