Δοκιμαστική υποδομή ως κώδικας με Pulumi. Μέρος 2

Γεια σε όλους. Σήμερα μοιραζόμαστε μαζί σας το τελευταίο μέρος του άρθρου. "Δοκιμή υποδομής ως κώδικα με Pulumi", η μετάφραση του οποίου ετοιμάστηκε ειδικά για φοιτητές του μαθήματος "Πρακτικές και εργαλεία DevOps".

Δοκιμαστική υποδομή ως κώδικας με Pulumi. Μέρος 2

Δοκιμή ανάπτυξης

Αυτό το στυλ δοκιμών είναι μια ισχυρή προσέγγιση και μας επιτρέπει να εκτελούμε δοκιμές λευκού κουτιού για να δοκιμάσουμε την εσωτερική λειτουργία του κώδικα υποδομής μας. Ωστόσο, περιορίζει κάπως αυτό που μπορούμε να δοκιμάσουμε. Οι δοκιμές εκτελούνται με βάση το σχέδιο ανάπτυξης στη μνήμη που δημιουργήθηκε από την Pulumi πριν από την πραγματική ανάπτυξη και επομένως η ίδια η ανάπτυξη δεν μπορεί να δοκιμαστεί. Για τέτοιες περιπτώσεις, το Pulumi έχει ένα πλαίσιο δοκιμής ολοκλήρωσης. Και αυτές οι δύο προσεγγίσεις λειτουργούν τέλεια μαζί!

Το πλαίσιο δοκιμής ενσωμάτωσης Pulumi είναι γραμμένο στο Go, έτσι δοκιμάζουμε το μεγαλύτερο μέρος του εσωτερικού μας κώδικα. Ενώ η προσέγγιση δοκιμής μονάδας που συζητήθηκε προηγουμένως έμοιαζε περισσότερο με τη δοκιμή λευκού κουτιού, η δοκιμή ενοποίησης είναι ένα μαύρο κουτί. (Υπάρχουν επίσης επιλογές για αυστηρές εσωτερικές δοκιμές.) Αυτό το πλαίσιο δημιουργήθηκε για να λάβει ένα πλήρες πρόγραμμα Pulumi και να εκτελέσει διάφορες λειτουργίες κύκλου ζωής σε αυτό, όπως η ανάπτυξη μιας νέας στοίβας από την αρχή, η ενημέρωση της με παραλλαγές και η διαγραφή της, πιθανώς πολλές φορές . Τα τρέχουμε τακτικά (για παράδειγμα, τη νύχτα) και ως τεστ αντοχής.

(Εμείς το δουλεύουμε, έτσι ώστε παρόμοιες δυνατότητες δοκιμής ενσωμάτωσης είναι διαθέσιμες στο εγγενές SDK των γλωσσών. Μπορείτε να χρησιμοποιήσετε το πλαίσιο δοκιμής ενσωμάτωσης Go ανεξάρτητα από τη γλώσσα στην οποία είναι γραμμένο το πρόγραμμα Pulumi).

Εκτελώντας το πρόγραμμα χρησιμοποιώντας αυτό το πλαίσιο, μπορείτε να ελέγξετε τα εξής:

  • Ο κώδικας του έργου σας είναι συντακτικά σωστός και εκτελείται χωρίς σφάλματα.
  • Οι ρυθμίσεις διαμόρφωσης στοίβας και μυστικών λειτουργούν και ερμηνεύονται σωστά.
  • Το έργο σας μπορεί να αναπτυχθεί με επιτυχία στον πάροχο cloud της επιλογής σας.
  • Το έργο σας μπορεί να αναβαθμιστεί με επιτυχία από την αρχική κατάσταση σε Ν άλλες καταστάσεις.
  • Το έργο σας μπορεί να καταστραφεί με επιτυχία και να αφαιρεθεί από τον πάροχο cloud.

Όπως θα δούμε σύντομα, αυτό το πλαίσιο μπορεί επίσης να χρησιμοποιηθεί για την επικύρωση χρόνου εκτέλεσης.

Απλή δοκιμή ολοκλήρωσης

Για να το δούμε στην πράξη, θα δούμε το αποθετήριο pulumi/examples, καθώς η ομάδα μας και η κοινότητα Pulumi το χρησιμοποιούν για να δοκιμάσουν τα δικά μας αιτήματα έλξης, δεσμεύσεις και νυχτερινές κατασκευές.

Παρακάτω είναι μια απλοποιημένη δοκιμή μας παράδειγμα που παρέχει τον κάδο S3 και κάποια άλλα αντικείμενα:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

Αυτή η δοκιμή περνάει από τον βασικό κύκλο ζωής της δημιουργίας, τροποποίησης και καταστροφής μιας στοίβας για έναν φάκελο aws-js-s3-folder. Θα χρειαστεί περίπου ένα λεπτό για να αναφέρετε μια επιτυχή δοκιμασία:

$ go test .
PASS
ok      ... 43.993s

Υπάρχουν πολλές επιλογές για την προσαρμογή της συμπεριφοράς αυτών των δοκιμών. Δείτε την πλήρη λίστα επιλογών. στη δομή ProgramTestOptions. Για παράδειγμα, μπορείτε να διαμορφώσετε το τελικό σημείο Jaeger για ανίχνευση (Tracing), υποδείξτε ότι αναμένετε ότι η δοκιμή θα αποτύχει εάν η δοκιμή είναι αρνητική (ExpectFailure), εφαρμόστε μια σειρά «επεξεργασιών» στο πρόγραμμα για μια διαδοχική μετάβαση καταστάσεων (EditDirs) και πολλα ΑΚΟΜΑ. Ας δούμε πώς να τα χρησιμοποιήσετε για να δοκιμάσετε την ανάπτυξη της εφαρμογής σας.

Έλεγχος ιδιοτήτων πόρων

Η ενσωμάτωση που συζητήθηκε παραπάνω διασφαλίζει ότι το πρόγραμμά μας «δουλεύει» — δεν διακόπτεται. Τι γίνεται όμως αν θέλουμε να ελέγξουμε τις ιδιότητες της στοίβας που προκύπτει; Για παράδειγμα, ότι ορισμένοι τύποι πόρων έχουν (ή δεν έχουν) προβλεφθεί και ότι έχουν ορισμένα χαρακτηριστικά.

Παράμετρος ExtraRuntimeValidation για ProgramTestOptions μας επιτρέπει να δούμε την κατάσταση μετά την ανάπτυξη που καταγράφηκε από το Pulumi, ώστε να μπορούμε να κάνουμε πρόσθετους ελέγχους. Αυτό περιλαμβάνει ένα πλήρες στιγμιότυπο της κατάστασης της στοίβας που προκύπτει, συμπεριλαμβανομένης της διαμόρφωσης, των εξαγόμενων τιμών εξόδου, όλων των πόρων και των τιμών των ιδιοτήτων τους και όλων των εξαρτήσεων μεταξύ των πόρων.

Για να δούμε ένα βασικό παράδειγμα αυτού, ας ελέγξουμε ότι το πρόγραμμά μας δημιουργεί ένα Κάδος S3:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
        },
    })

Τώρα, όταν εκτελούμε τη δοκιμή go, όχι μόνο θα περάσει από μια μπαταρία δοκιμών κύκλου ζωής, αλλά επίσης, μετά την επιτυχή ανάπτυξη της στοίβας, θα εκτελέσει έναν πρόσθετο έλεγχο στην κατάσταση που προκύπτει.

Δοκιμές χρόνου εκτέλεσης

Μέχρι στιγμής, όλες οι δοκιμές αφορούσαν αποκλειστικά τη συμπεριφορά ανάπτυξης και το μοντέλο πόρων Pulumi. Τι γίνεται αν θέλετε να επαληθεύσετε ότι η παρεχόμενη υποδομή σας λειτουργεί πραγματικά; Για παράδειγμα, ότι η εικονική μηχανή λειτουργεί, ο κάδος S3 περιέχει αυτό που περιμένουμε και ούτω καθεξής.

Ίσως έχετε ήδη μαντέψει πώς να το κάνετε αυτό: επιλογή ExtraRuntimeValidation για ProgramTestOptions - αυτή είναι μια μεγάλη ευκαιρία για αυτό. Σε αυτό το σημείο, εκτελείτε μια προσαρμοσμένη δοκιμή Go με πρόσβαση στην πλήρη κατάσταση των πόρων του προγράμματός σας. Αυτή η κατάσταση περιλαμβάνει πληροφορίες όπως διευθύνσεις IP εικονικής μηχανής, διευθύνσεις URL και όλα όσα χρειάζονται για την πραγματική αλληλεπίδραση με τις εφαρμογές και την υποδομή cloud που προκύπτουν.

Για παράδειγμα, το δοκιμαστικό μας πρόγραμμα εξάγει την ιδιότητα webEndpoint καλείται κουβάς websiteUrl, που είναι η πλήρης διεύθυνση URL όπου μπορούμε να λάβουμε τη διαμόρφωση index document. Αν και θα μπορούσαμε να ψάξουμε στο αρχείο κατάστασης για να βρούμε bucket και διαβάστε απευθείας αυτήν την ιδιότητα, αλλά σε πολλές περιπτώσεις οι στοίβες μας εξάγουν χρήσιμες ιδιότητες όπως αυτή που θεωρούμε βολικό να χρησιμοποιήσουμε για έλεγχο:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            url := "http://" + stack.Outputs["websiteUrl"].(string)
            resp, err := http.Get(url)
            if !assert.NoError(t, err) {
                return
            }
            if !assert.Equal(t, 200, resp.StatusCode) {
                return
            }
            defer resp.Body.Close()
            body, err := ioutil.ReadAll(resp.Body)
            if !assert.NoError(t, err) {
                return
            }
            assert.Contains(t, string(body), "Hello, Pulumi!")
        },
    })

Όπως και οι προηγούμενοι έλεγχοι χρόνου εκτέλεσης, αυτός ο έλεγχος θα εκτελεστεί αμέσως μετά την ανύψωση της στοίβας, όλα ως απόκριση σε μια απλή κλήση go test. Και αυτή είναι μόνο η κορυφή του παγόβουνου — κάθε δυνατότητα δοκιμής Go που μπορείτε να γράψετε σε κώδικα είναι διαθέσιμη.

Συνεχής Ένταξη Υποδομής

Είναι καλό να μπορείτε να εκτελείτε δοκιμές σε φορητό υπολογιστή όταν γίνονται πολλές αλλαγές υποδομής για να τις δοκιμάσετε πριν τις υποβάλετε για έλεγχο κώδικα. Αλλά εμείς και πολλοί από τους πελάτες μας δοκιμάζουμε την υποδομή σε διάφορα στάδια του κύκλου ζωής της ανάπτυξης:

  • Σε κάθε ανοιχτό αίτημα έλξης για δοκιμή πριν από τη συγχώνευση.
  • Σε απόκριση σε κάθε δέσμευση, για να ελέγξετε ξανά ότι η συγχώνευση έγινε σωστά.
  • Περιοδικά, όπως τη νύχτα ή την εβδομάδα για πρόσθετες δοκιμές.
  • Ως μέρος της δοκιμής απόδοσης ή του stress test, η οποία συνήθως εκτελείται για μεγάλο χρονικό διάστημα και εκτελεί δοκιμές παράλληλα ή/και αναπτύσσει το ίδιο πρόγραμμα πολλές φορές.

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

Η Pulumi έχει υποστήριξη για κοινά συστήματα CI. Εδώ είναι μερικά από αυτά:

Για πιο λεπτομερείς πληροφορίες, ανατρέξτε στην τεκμηρίωση για Συνεχής Παράδοση.

Εφήμερα Περιβάλλοντα

Μια πολύ ισχυρή ευκαιρία που ανοίγεται είναι η δυνατότητα ανάπτυξης εφήμερων περιβαλλόντων αποκλειστικά για σκοπούς δοκιμής αποδοχής. Εννοια έργα και στοίβες Το Pulumi έχει σχεδιαστεί για να αναπτύσσει εύκολα και να καταστρέφει εντελώς απομονωμένα και ανεξάρτητα περιβάλλοντα, όλα σε μερικές απλές εντολές CLI ή χρησιμοποιώντας ένα πλαίσιο δοκιμής ενοποίησης.

Εάν χρησιμοποιείτε το GitHub, τότε το Pulumi προσφέρει Εφαρμογή GitHub, το οποίο θα σας βοηθήσει να συνδέσετε τη δοκιμή αποδοχής για να τραβήξετε αιτήματα εντός του αγωγού CI σας. Απλώς εγκαταστήστε την εφαρμογή στο αποθετήριο GitHub και το Pulumi θα προσθέσει πληροφορίες σχετικά με τις προεπισκοπήσεις της υποδομής, τις ενημερώσεις και τα αποτελέσματα δοκιμών στα αιτήματά σας CI και πισίνας:

Δοκιμαστική υποδομή ως κώδικας με Pulumi. Μέρος 2

Όταν χρησιμοποιείτε το Pulumi για τις βασικές δοκιμές αποδοχής, θα αποκτήσετε νέες δυνατότητες αυτοματισμού που θα βελτιώσουν την παραγωγικότητα της ομάδας και θα σας δώσουν εμπιστοσύνη στην ποιότητα των αλλαγών σας.

Σύνολο

Σε αυτό το άρθρο, είδαμε ότι χρησιμοποιώντας γλώσσες προγραμματισμού γενικού σκοπού, γίνονται διαθέσιμες σε εμάς πολλές τεχνικές ανάπτυξης λογισμικού που ήταν χρήσιμες στην ανάπτυξη των εφαρμογών μας. Περιλαμβάνουν δοκιμές μονάδων, δοκιμές ενοποίησης και πώς συνεργάζονται για την εκτέλεση εκτεταμένων δοκιμών χρόνου εκτέλεσης. Οι δοκιμές εκτελούνται εύκολα κατ' απαίτηση ή στο σύστημά σας CI.

Πουλούμι - λογισμικό ανοιχτού κώδικα, δωρεάν στη χρήση και λειτουργεί με τις αγαπημένες σας γλώσσες προγραμματισμού και σύννεφα - δοκιμάστε το σήμερα!

Το πρώτο μέρος

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο