Η δοκιμή, αν και μπορεί να είναι χρονοβόρα, είναι ένα σημαντικό βήμα στον κύκλο ανάπτυξης οποιασδήποτε εφαρμογής. Διασφαλίζει ότι εντοπίζετε σφάλματα και προβλήματα από νωρίς προτού προωθήσετε τον κώδικα στην παραγωγή.
Μπορείτε να χρησιμοποιήσετε το Jest για να δοκιμάσετε ένα Express Rest API. Αφού δημιουργήσετε ένα απλό CRUD API, ανακαλύψτε πώς να γράφετε δοκιμές για κάθε τελικό σημείο.
Τι είναι το Jest;
Υπάρχουν πολλές βιβλιοθήκες δοκιμών JavaScript από τις οποίες μπορείτε να επιλέξετε, αλλά Αστείο είναι το πιο εύκολο στην αρχή. Είναι μια βιβλιοθήκη δοκιμών που αναπτύχθηκε από το Facebook, που χρησιμοποιείται κυρίως για τη δοκιμή έργων React. Ωστόσο, μπορείτε επίσης να το χρησιμοποιήσετε για να δοκιμάσετε το Node και άλλα έργα που βασίζονται σε JavaScript. Αναπτύχθηκε πάνω από το Jasmine, ένα άλλο εργαλείο δοκιμών, και συνοδεύεται από τη δική του βιβλιοθήκη ισχυρισμών.
Αν και δεν θα χρειαστείτε μια βιβλιοθήκη ισχυρισμών για τη σύνταξη δοκιμών στο Jest, θα χρειαστεί να χρησιμοποιήσετε ένα εργαλείο για να κάνετε αιτήματα HTTP. Αυτό το άρθρο χρησιμοποιεί το SuperTest.
Τι είναι το SuperTest;
SuperTest είναι μια βιβλιοθήκη δοκιμής κόμβου για κλήσεις HTTP. Επεκτείνει τη βιβλιοθήκη δοκιμών υπερπρακτόρων και σας επιτρέπει να υποβάλετε αιτήματα όπως GET, POST, PUT και DELETE.
Το SuperTest παρέχει ένα αντικείμενο αιτήματος που μπορείτε να χρησιμοποιήσετε για να κάνετε αιτήματα HTTP.
συνθ αίτημα = απαιτώ("supertest")
αίτηση("https://icanhazdadjoke.com")
.παίρνω('/slack')
.τέλος(λειτουργία(err, res) {
αν (πλανώμαι) βολή πλανώμαι;
κονσόλα.κούτσουρο(res.σώμα.συνημμένα);
});
Εδώ, μεταβιβάζετε τη βασική διεύθυνση URL του API στο αντικείμενο αιτήματος και, στη συνέχεια, συνδέετε τη μέθοδο HTTP με το υπόλοιπο URL. ο τέλος() μέθοδος καλεί τον διακομιστή API και η συνάρτηση επανάκλησης χειρίζεται την απόκρισή του.
Μόλις λάβετε την απάντηση από το API, μπορείτε να χρησιμοποιήσετε το Jest για να την επικυρώσετε.
Δημιουργήστε ένα Express API
Για να δοκιμάσετε τα δικά σας τελικά σημεία API, πρέπει να δημιουργήσετε ένα REST API πρώτα. Το API που θα δημιουργήσετε είναι αρκετά απλό. Εισάγει, ανακτά, ενημερώνει και διαγράφει στοιχεία από έναν πίνακα.
Ξεκινήστε δημιουργώντας έναν νέο κατάλογο που ονομάζεται node-jest και αρχικοποιώντας το npm.
mkdir node-jest
npm init -y
Στη συνέχεια, δημιουργήστε ένα νέο αρχείο που ονομάζεται index.js και δημιουργήστε τον διακομιστή Express.
συνθ εκφράζω = απαιτώ("εξπρές")
συνθ app = express()
app.listen (3000, () => console.log("Ακρόαση στη θύρα 3000"))
Δοκιμάστε το τελικό σημείο GET /todos
Το πρώτο τελικό σημείο που θα δημιουργήσετε είναι το τελικό σημείο GET /todos. Επιστρέφει όλα τα στοιχεία του πίνακα. Στο index.js, προσθέστε τα ακόλουθα.
συνθ todos = [
];
// Λάβετε όλες τις εργασίες
app.get("/todos", (απ., res) => {
ΕΠΙΣΤΡΟΦΗres.κατάσταση(200).json({
δεδομένα: todos,
λάθος: μηδενικό,
});
});
Σημειώστε ότι η απόκριση έχει κωδικό κατάστασης 200 και ένα αντικείμενο JSON που περιέχει το αντικείμενο εκκρεμοτήτων σε έναν πίνακα που ονομάζεται δεδομένα και ένα μήνυμα σφάλματος. Αυτό θα δοκιμάσετε χρησιμοποιώντας το Jest.
Τώρα, εγκαταστήστε το Jest και το SuperTest:
npm εγκαθιστώ αστεία υπερτεστ
Στη συνέχεια, προσθέστε ένα δοκιμαστικό σενάριο πακέτο.json ως εξής:
{
"σενάρια": {
"δοκιμή": "αστείο"
}
}
Πριν ξεκινήσετε να γράφετε τα δικά σας τεστ, θα πρέπει να καταλάβετε πώς να γράψετε ένα βασικό τεστ στο Jest.
Εξετάστε την ακόλουθη συνάρτηση:
λειτουργίαάθροισμα(α, β) {
ΕΠΙΣΤΡΟΦΗ a + b;
}
μονάδα μέτρησης.εξαγωγές = άθροισμα;
Στο αρχείο δοκιμής, πρέπει να:
- Εισαγάγετε τη συνάρτηση.
- Περιγράψτε τι πρέπει να κάνει το τεστ.
- Καλέστε τη συνάρτηση.
- Επιβεβαιώστε την αναμενόμενη απόκριση με την πραγματική απόκριση από τη συνάρτηση.
συνθ { άθροισμα } = απαιτώ("./άθροισμα")
περιγράφω("Άθροισμα δύο στοιχείων", async() => {
δοκιμή("Θα πρέπει να επιστρέψει 4", () => {
αναμένω(άθροισμα(2,2)).να είναι(4)
})
})
ο περιγράφω λέξη-κλειδί καθορίζει την ομάδα των δοκιμών και το δοκιμή δήλωση προσδιορίζει τη συγκεκριμένη δοκιμή. Εάν η τιμή που επιστρέφεται από τη συνάρτηση ταιριάζει με την τιμή που μεταβιβάστηκε να είναι, το τεστ περνάει.
Κατά τη δοκιμή των τελικών σημείων API, δεν θα καλείτε μια συνάρτηση, αλλά θα στέλνετε ένα αίτημα χρησιμοποιώντας το SuperTest ή άλλη βιβλιοθήκη πελάτη HTTP.
Επιστρέφοντας στο τελικό σημείο GET, δημιουργήστε ένα νέο αρχείο που ονομάζεται api.test.js. Εδώ θα γράψετε όλες τις δοκιμές τελικού σημείου. Ονομάζοντας το αρχείο δοκιμής με α .δοκιμή Το infix διασφαλίζει ότι το Jest το αναγνωρίζει ως δοκιμαστικό αρχείο.
Στο api.test.js, εισαγάγετε το supertest και ορίστε το βασικό URL ως εξής:
συνθ αίτημα = απαιτώ("supertest")
συνθ baseURL = "http://localhost: 3000"
Στη συνέχεια, δημιουργήστε την πρώτη δοκιμή στο μπλοκ περιγραφής:
περιγράφω("GET /todos", () => {
συνθ newTodo = {
ταυτότητα: κρυπτο.randomUUID(),
είδος: "Πίνουν νερό",
ολοκληρώθηκε το: ψευδής,
}
πριν από όλα (ασυγχρονισμός () => {
// ρυθμίστε την εκκρεμότητα
αναμονή αιτήματος (baseURL).post("/todo").send (newTodo);
})
μετά από όλα (ασυγχρονισμός () => {
αναμένω αίτημα (baseURL).delete(`/todo/${newTodo.id}`)
})
το("πρέπει να επιστρέψει 200", ασύγχρονο () => {
συνθ ανταπόκριση = αναμένω αίτημα (baseURL).get("/todos");
αναμένω(απάντηση.statusCode).να είναι(200);
αναμένω(απάντηση.σώμα.λάθος).να είναι(μηδενικό);
});
το("θα πρέπει να επιστρέψει στο todos", ασύγχρονο () => {
συνθ ανταπόκριση = αναμένω αίτημα (baseURL).get("/todos");
αναμένεται (response.body.data.length >= 1).να είναι(αληθής);
});
});
Πριν εκτελέσετε τις δοκιμές, θα χρειαστεί να ορίσετε τις λειτουργίες ρύθμισης και αποκοπής. Αυτές οι συναρτήσεις θα συμπληρώσουν τον πίνακα εκκρεμοτήτων με ένα στοιχείο πριν από τη δοκιμή και θα διαγράψουν τα εικονικά δεδομένα μετά από κάθε δοκιμή.
Ο κώδικας που εκτελείται πριν από όλες τις δοκιμές βρίσκεται στη συνάρτηση BeforeAll(). Ο κώδικας που εκτελείται μετά από όλες τις δοκιμές βρίσκεται στη συνάρτηση afterAll().
Σε αυτό το παράδειγμα, απλά χτυπάτε τα τελικά σημεία POST και DELETE για το καθένα. Σε μια πραγματική εφαρμογή, πιθανότατα θα συνδέεστε σε μια εικονική βάση δεδομένων που περιέχει τα δεδομένα δοκιμής.
Σε αυτήν τη δοκιμή, υποβάλατε πρώτα ένα αίτημα στο τελικό σημείο GET /todos και συγκρίνατε την απάντηση που εστάλη με τα αναμενόμενα αποτελέσματα. Αυτή η σουίτα δοκιμών θα περάσει εάν η απάντηση έχει ένα Κωδικός κατάστασης HTTP από 200, τα δεδομένα δεν είναι άδεια και το μήνυμα σφάλματος είναι μηδενικό.
Δοκιμάστε το τελικό σημείο POST /todo
Στο index.js, δημιουργήστε το τελικό σημείο POST /todo:
app.post("/todo", (απ., res) => {
προσπαθήστε {
συνθ { id, item, ολοκληρωμένο } = req.body;
συνθ newTodo = {
ταυτότητα,
είδος,
ολοκληρώθηκε το,
};
todos.Σπρώξτε(newTodo);
ΕΠΙΣΤΡΟΦΗres.κατάσταση(201).json({
δεδομένα: todos,
λάθος: μηδενικό,
});
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗres.κατάσταση(500).json({
δεδομένα: μηδενικό,
σφάλμα: σφάλμα,
});
}
});
Σε αυτήν τη δοκιμή, θα χρειαστεί να στείλετε τις λεπτομέρειες εκκρεμότητας στο σώμα του αιτήματος χρησιμοποιώντας τη μέθοδο send().
αίτημα (baseURL).post("/todo".send (newTodo)
Το αίτημα POST /todo θα πρέπει να επιστρέψει έναν κωδικό κατάστασης 201 και τον πίνακα todos με το νέο στοιχείο να προστεθεί στο τέλος. Δείτε πώς μπορεί να μοιάζει το τεστ:
περιγράφω("ΑΝΑΡΤΗΣΗ /todo", () => {
συνθ newTodo = {
// να κάνω
}
μετά από όλα (ασυγχρονισμός () => {
αναμένω αίτημα (baseURL).delete(`/todo/${newTodo.id}`)
})
το("θα πρέπει να προσθέσει ένα στοιχείο στον πίνακα todos", ασύγχρονο () => {
συνθ ανταπόκριση = αναμένω request (baseURL).post("/todo").send(newTodo);
συνθ lastItem = answer.body.data[response.body.data.length-1]
αναμένω(απάντηση.statusCode).να είναι(201);
αναμένω(τελευταίο στοιχείο.είδος).να είναι(newTodo["είδος"]);
αναμένω(τελευταίο στοιχείο.ολοκληρώθηκε το).να είναι(newTodo["ολοκληρώθηκε το"]);
});
});
Εδώ, μεταβιβάζετε τα δεδομένα todo στη μέθοδο send() ως όρισμα. Η απάντηση θα πρέπει να έχει έναν κωδικό κατάστασης 201 και επίσης να περιέχει όλα τα στοιχεία εκκρεμότητας σε ένα αντικείμενο δεδομένων. Για να ελέγξετε εάν η εκκρεμότητα δημιουργήθηκε πράγματι, ελέγξτε αν η τελευταία καταχώριση στις επιστρεφόμενες εργασίες ταιριάζει με αυτήν που στείλατε στο αίτημα.
Το τελικό σημείο PUT /todos/:id θα πρέπει να επιστρέψει το ενημερωμένο στοιχείο:
app.put("/todos/:id", (απ., res) => {
προσπαθήστε {
συνθ id = req.params.id
συνθ todo = todos.find((todo) => todo.id == id);
if(!todo) {
βολήνέοςΛάθος("Todo δεν βρέθηκε")
}
todo.completed = req.body.completed;
ΕΠΙΣΤΡΟΦΗres.κατάσταση(201).json({
δεδομένα: todo,
λάθος: μηδενικό,
});
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗres.κατάσταση(500).json({
δεδομένα: μηδενικό,
σφάλμα: σφάλμα,
});
}
});
Δοκιμάστε την απάντηση ως εξής:
περιγράφω("Ενημερώστε ένα έργο", () => {
συνθ newTodo = {
// να κάνω
}
πριν από όλα (ασυγχρονισμός () => {
αναμονή αιτήματος (baseURL).post("/todo").send (newTodo);
})
μετά από όλα (ασυγχρονισμός () => {
αναμένω αίτημα (baseURL).delete(`/todo/${newTodo.id}`)
})
το("θα πρέπει να ενημερώσει το στοιχείο εάν υπάρχει", ασύγχρονο () => {
συνθ ανταπόκριση = αναμένω request (baseURL).put(`/todos/${newTodo.id}`).στείλετε({
ολοκληρώθηκε το: αληθής,
});
αναμένω(απάντηση.statusCode).να είναι(201);
αναμένω(απάντηση.σώμα.δεδομένα.ολοκληρώθηκε το).να είναι(αληθής);
});
});
Η συμπληρωμένη τιμή στο σώμα απόκρισης πρέπει να είναι αληθής. Θυμηθείτε να συμπεριλάβετε το αναγνωριστικό του στοιχείου που θέλετε να ενημερώσετε στη διεύθυνση URL.
Δοκιμάστε το τελικό σημείο DELETE /todos/:id
Στο index.js, δημιουργήστε το τελικό σημείο DELETE. Θα πρέπει να επιστρέψει τα δεδομένα εργασίας χωρίς το διαγραμμένο στοιχείο.
app.delete("/todos/:id", (απ., res) => {
προσπαθήστε {
συνθ id = req.params.id
συνθ todo = todos[0]
if (todo) {
todos.συνδέω(ταυτότητα, 1)
}
ΕΠΙΣΤΡΟΦΗres.κατάσταση(200).json({
δεδομένα: todos,
λάθος: μηδενικό,
});
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗres.κατάσταση(500).json({
δεδομένα: μηδενικό,
σφάλμα: σφάλμα,
});
}
});
Για να ελέγξετε το τελικό σημείο, μπορείτε να ελέγξετε εάν το διαγραμμένο στοιχείο εξακολουθεί να υπάρχει στα επιστρεφόμενα δεδομένα:
περιγράφω("Διαγράψτε μία εργασία", () => {
συνθ newTodo = {
// να κάνω
}
πριν από όλα (ασυγχρονισμός () => {
αναμονή αιτήματος (baseURL).post("/todo").send (newTodo);
})
το("θα πρέπει να διαγράψει ένα στοιχείο", ασύγχρονο () => {
συνθ ανταπόκριση = αναμένω αίτημα (baseURL).delete(`/todos/${newTodo.id}`);
συνθ todos = απάντηση.σώμα.δεδομένα
συνθ exists = todos.find (todo => {
newTodo.id == todoId
})
αναμένω (υπάρχει).toBe(απροσδιόριστος)
});
});
Τα δεδομένα που επιστρέφονται από το τελικό σημείο DELETE δεν πρέπει να περιέχουν το διαγραμμένο στοιχείο. Δεδομένου ότι τα επιστρεφόμενα στοιχεία βρίσκονται σε έναν πίνακα, μπορείτε να χρησιμοποιήσετε το Array[id] για να ελέγξετε εάν το API διέγραψε σωστά το στοιχείο. Το αποτέλεσμα πρέπει να είναι ψευδές.
Δημιουργία REST API
Σε αυτό το άρθρο, μάθατε πώς να δοκιμάσετε ένα Express Rest API χρησιμοποιώντας το Jest API. Γράψατε δοκιμές για τα αιτήματα GET, PUT, POST και DELETE HTTP και είδατε πώς μπορείτε να στείλετε δεδομένα στο τελικό σημείο στη διεύθυνση URL και στο αίτημα. Θα πρέπει να μπορείτε να εφαρμόσετε αυτές τις γνώσεις όταν δοκιμάζετε το δικό σας Rest API.