Μάθε για τις γεννήτριες δοκιμών

Μάθε πώς η διαδρομή Clojure χρησιμοποιεί γεννήτριες δοκιμών για να δημιουργεί δοκιμές για τις ασκήσεις


Το track Clojure χρησιμοποιεί μια γεννήτρια test για να παράγει αυτόματα τα test των ασκήσεων εξάσκησης. Εκμεταλλεύεται το γεγονός ότι οι περισσότερες ασκήσεις που ορίζονται στο αποθετήριο problem-specifications έχουν επίσης ένα αρχείο canonical-data.json, το οποίο περιέχει τυποποιημένα δεδομένα εισόδου και εξόδου για test που μπορούν να χρησιμοποιηθούν για την υλοποίηση της άσκησης.

Βήματα

Για να παράγει τα test μιας άσκησης εξάσκησης, η γεννήτρια test:

  1. Διαβάζει τα test cases της άσκησης από το αρχείο canonical-data.json της
  2. Χρησιμοποιεί το αρχείο tests.toml για να παραλείψει τα αποκλεισμένα test cases
  3. Μετασχηματίζει τα test cases (προαιρετικά)
  4. Αποδίδει τα test cases χρησιμοποιώντας το πρότυπο της γεννήτριας της άσκησης
  5. Μορφοποιεί το αποδοθέν πρότυπο με το cljfmt
  6. Γράφει το μορφοποιημένο πρότυπο στο αρχείο test της άσκησης

Βήμα 1: ανάγνωση του αρχείου canonical-data.json

Η γεννήτρια test αναλύει τα test cases από το αρχείο canonical-data.json της άσκησης χρησιμοποιώντας τη βιβλιοθήκη clojure/data.json.

Επειδή κάποια canonical data χρησιμοποιούν εμφώλευση, το test case που αναλύεται περιλαμβάνει ένα επιπλέον πεδίο path, το οποίο περιέχει τις ιδιότητες description τυχόν γονικών στοιχείων, καθώς και την ίδια την ιδιότητα description του test case.

Σημείωση: τα κλειδιά αναλύονται ως keywords.

Βήμα 2: παράλειψη των αποκλεισμένων test από το αρχείο tests.toml

Κάθε άσκηση έχει ένα αρχείο tests.toml, στο οποίο μεμονωμένα test μπορούν να αποκλειστούν/απενεργοποιηθούν. Η γεννήτρια test θα αφαιρέσει όποια test cases είναι σημασμένα ως αποκλεισμένα (include = false).

Βήμα 3: μετασχηματισμός των test cases (προαιρετικά)

Κάποιες ασκήσεις μπορεί να χρειάζονται μικροπροσαρμογές πριν από την απόδοση των δεδομένων. Για παράδειγμα, μπορεί να θέλεις να κάνεις την περιγραφή λιγότερο αναλυτική.

Για να προσαρμόσεις τα test cases, όρισε ένα αρχείο .meta/generator.clj με namespace <slug>-generator. Υπάρχουν δύο τρόποι με τους οποίους μπορείς να μετασχηματίσεις τα test cases:

  • Ενημέρωση test case(s)
  • Προσθήκη/αφαίρεση test case(s)

Ενημέρωση test case(s)

Για να ενημερώσεις μεμονωμένα test cases, όρισε την παρακάτω συνάρτηση:

(defn update-test-case
  "Update a test case"
  [test-case]
  ;; function body
)
Παράδειγμα

Αυτό το παράδειγμα αφαιρεί όλα εκτός από το τελευταίο στοιχείο της τιμής :path (συντομεύοντας την περιγραφή):

(ns difference-of-squares-generator)

(defn update-test-case [test-case]
  (update test-case :path #(take-last 1 %)))

Προσθήκη ή αφαίρεση test case(s)

Για να προσθέσεις ή να αφαιρέσεις test cases, όρισε την παρακάτω συνάρτηση:

(defn add-remove-test-cases
  "Add/remove test case(s)"
  [test-cases]
  ;; function body
)
Note

Αν ορίσεις και τις δύο συναρτήσεις, καλείται πρώτα η add-remove-test-cases και μετά η update-test-case.

Βήμα 4: απόδοση των test cases

Τα (ενδεχομένως μετασχηματισμένα) test cases περνούν στη συνέχεια στο αρχείο .meta/generator.tpl, το οποίο καθορίζει πώς πρέπει να αποδοθούν τα test με βάση αυτά τα test cases.

Βήμα 5: μορφοποίηση του αποδοθέντος προτύπου με το cljfmt

Το αποδοθέν πρότυπο μορφοποιείται στη συνέχεια με το cljfmt. Αυτό έχει τα εξής πλεονεκτήματα:

  • Οι ασκήσεις μορφοποιούνται με συνέπεια
  • Δεν χρειάζεται να ανησυχείς πολύ για τα κενά και τη στοίχιση όταν γράφεις πρότυπα

Βήμα 6: εγγραφή του αποδοθέντος προτύπου στο αρχείο test της άσκησης

Τέλος, η έξοδος του αποδοθέντος προτύπου γράφεται στο αρχείο test της άσκησης.

Πρότυπα

Τα πρότυπα αποδίδονται χρησιμοποιώντας τη βιβλιοθήκη hbs, η οποία υποστηρίζει σύνταξη handlebars (μέσω της handlebars.java).

Διεπαφή γραμμής εντολών

Υπάρχουν δύο τρόποι με τους οποίους μπορεί να εκτελεστεί η γεννήτρια test:

  1. bin/generate-tests: παράγει τα test για όλες τις ασκήσεις που διαθέτουν πρότυπο γεννήτριας
  2. bin/generate-tests <slug>: παράγει τα test για τη συγκεκριμένη άσκηση, αν διαθέτει πρότυπο γεννήτριας