A tesztelés, bár időigényes lehet, minden alkalmazás fejlesztési ciklusának fontos lépése. Gondoskodik arról, hogy már korán felismerje a hibákat és problémákat, mielőtt a kódot éles verzióba helyezi.
A Jest segítségével tesztelheti az Express Rest API-t. Miután létrehozott egy egyszerű CRUD API-t, fedezze fel, hogyan írhat teszteket az egyes végpontokhoz.
Mi az a Jest?
Számos JavaScript tesztelési könyvtár közül választhat, de Tréfa ezzel a legkönnyebb kezdeni. Ez a Facebook által kifejlesztett tesztelési könyvtár, amelyet többnyire a React projektek tesztelésére használnak. Használhatja azonban a Node és más JavaScript-alapú projektek tesztelésére is. A Jasmine, egy másik tesztelőeszköz tetején fejlesztették ki, és saját állítási könyvtárával együtt érkezik.
Noha nincs szükség állítási könyvtárra a tesztek Jestben történő írásához, HTTP-kérésekhez eszközt kell használnia. Ez a cikk a SuperTestet használja.
Mi az a SuperTest?
Szuperteszt egy csomópont-tesztelési könyvtár a HTTP-hívásokhoz. Kibővíti a szuperügynök tesztelési könyvtárát, és lehetővé teszi olyan kérések benyújtását, mint a GET, POST, PUT és DELETE.
A SuperTest egy kérési objektumot biztosít, amellyel HTTP kéréseket küldhet.
const kérés = igényelnek("szupertest")
kérés("https://icanhazdadjoke.com")
.kap('/slack')
.end(funkció(hiba, res) {
ha (téved) dobás téved;
konzol.log(res.test.mellékletek);
});
Itt átadja az API alap URL-jét a kérelem objektumnak, majd a HTTP metódust az URL többi részével láncolja. Az vége() metódus meghívja az API-kiszolgálót, és a visszahívási függvény kezeli a válaszát.
Miután megkapta a választ az API-tól, a Jest segítségével ellenőrizheti azt.
Hozzon létre egy Express API-t
A saját API-végpontjainak teszteléséhez létre kell hoznia egy REST API első. A létrehozandó API meglehetősen egyszerű. Beszúr, lekér, frissít és töröl elemeket egy tömbből.
Kezdje egy új, node-jest nevű könyvtár létrehozásával és az npm inicializálásával.
mkdir node-jest
npm init -y
Ezután hozzon létre egy új fájlt, melynek neve index.js és hozza létre az Express szervert.
const expressz = igényelnek("Expressz")
const app = express()
app.listen (3000, () => console.log("Hallgatás a 3000-es porton"))
Tesztelje a GET /todos végpontot
Az első létrehozandó végpont a GET /todos végpont. Visszaadja a tömb összes elemét. Az index.js fájlban adja hozzá a következőket.
const todos = [
];
// Get all todos
app.get("/todos", (req, res) => {
Visszatérésres.állapot(200).json({
adatok: todos,
hiba: nulla,
});
});
Vegye figyelembe, hogy a válasz 200-as állapotkóddal és egy JSON-objektummal rendelkezik, amely egy adat nevű tömbben tartalmazza a teendőket és egy hibaüzenetet. Ezt fogja tesztelni a Jest használatával.
Most telepítse a Jest és a SuperTestet:
npm telepítés tréfa szuperteszt
Ezután adjon hozzá egy tesztszkriptet package.json alábbiak szerint:
{
"forgatókönyvek": {
"teszt": "tréfa"
}
}
Mielőtt elkezdené saját tesztjeit írni, meg kell értenie, hogyan írhat alaptesztet a Jestben.
Vegye figyelembe a következő funkciót:
funkcióösszeg(a, b) {
Visszatérés a + b;
}
modult.export = összeg;
A tesztfájlban a következőket kell tennie:
- Importálja a függvényt.
- Írja le, mit kell tennie a tesztnek.
- Hívja meg a függvényt.
- Állítsa be a várt választ a függvény tényleges válaszával.
const { összeg } = igényelnek("./összeg")
leír("Két tétel összege", async() => {
teszt("4-et kell visszaadnia", () => {
elvárják(összeg(2,2)).lenni(4)
})
})
Az leírni kulcsszó határozza meg a tesztek csoportját és a teszt utasítás határozza meg a konkrét tesztet. Ha a függvénytől visszaadott érték megegyezik a következőnek átadott értékkel lenni, a teszt sikeres.
Az API-végpontok tesztelésekor nem függvényt kell meghívnia, hanem kérést küld a SuperTest vagy egy másik HTTP-ügyfélkönyvtár használatával.
Visszatérve a GET végponthoz, hozzon létre egy új nevű fájlt api.test.js. Ide kell írni az összes végponttesztet. A tesztfájl elnevezése a .teszt Az infix biztosítja, hogy a Jest tesztfájlként ismerje fel.
Az api.test.js fájlban importálja a szupertestet, és állítsa be az alap URL-t a következőképpen:
const kérés = igényelnek("szupertest")
const baseURL = "http://localhost: 3000"
Ezután hozza létre az első tesztet a leírási blokkban:
leír("GET /todos", () => {
const newTodo = {
id: kripto.randomUUID(),
tétel: "Vizet inni",
elkészült: hamis,
}
minden előtt(async () => {
// állítsd be a teendőt
kérésre vár (baseURL).post("/todo").send (newTodo);
})
végül(async () => {
várják kérés (baseURL).delete(`/todo/${newTodo.id}`)
})
azt("200-at kell visszaadnia", aszinkron () => {
const válasz = várják kérés (alapURL).get("/todos");
elvárják(válasz.statusCode).lenni(200);
elvárják(válasz.test.hiba).lenni(nulla);
});
azt("vissza kell térnie a todoshoz", aszinkron () => {
const válasz = várják kérés (alapURL).get("/todos");
várható (response.body.data.length >= 1).lenni(igaz);
});
});
A tesztek futtatása előtt meg kell határoznia a beállítási és lebontási funkciókat. Ezek a függvények feltöltik a todo tömböt egy elemmel a teszt előtt, és minden teszt után törlik az áladatokat.
Az összes teszt előtt lefutó kód a beforeAll() függvényben található. Az összes teszt után lefutó kód az afterAll() függvényben található.
Ebben a példában egyszerűen leüti a POST és a DELETE végpontokat mindegyiknél. Egy valós alkalmazásban valószínűleg a tesztadatokat tartalmazó áladatbázishoz csatlakozna.
Ebben a tesztben először kért a GET /todos végponthoz, és összehasonlította a visszaküldött választ a várt eredményekkel. Ez a tesztcsomag sikeres lesz, ha a válasz egy HTTP állapotkód 200, az adatok nem üresek, és a hibaüzenet nulla.
Tesztelje a POST /todo végpontot
Az index.js fájlban hozza létre a POST /todo végpontot:
app.post("/todo", (req, res) => {
próbálja meg {
const { azonosító, tétel, elkészült } = igénytörzs;
const newTodo = {
azonosító,
tétel,
befejezve,
};
todos.nyom(newTodo);
Visszatérésres.állapot(201).json({
adatok: todos,
hiba: nulla,
});
} fogás (hiba) {
Visszatérésres.állapot(500).json({
adat: nulla,
hiba: hiba,
});
}
});
Ebben a tesztben el kell küldenie a feladat részleteit a kérés törzsében a send() metódussal.
kérés (baseURL).post("/todo").send (newTodo)
A POST /todo kérésnek 201-es állapotkódot és a todos tömböt kell visszaadnia az új elemmel a végén. Így nézhet ki a teszt:
leír("POST /todo", () => {
const newTodo = {
// csinálni
}
végül(async () => {
várják kérés (baseURL).delete(`/todo/${newTodo.id}`)
})
azt("hozzá kell adnia egy elemet a todos tömbhöz", aszinkron () => {
const válasz = várják kérés (baseURL).post("/todo").send(newTodo);
const lastItem = válasz.body.data[válasz.test.adat.length-1]
elvárják(válasz.statusCode).lenni(201);
elvárják(utolsó elem.tétel).lenni(newTodo["tétel"]);
elvárják(utolsó elem.befejezte).lenni(newTodo["befejezve"]);
});
});
Itt a todo adatokat a send() metódusnak adja át argumentumként. A válasznak 201-es állapotkóddal kell rendelkeznie, és tartalmaznia kell az adatobjektum összes teendőjét is. Annak teszteléséhez, hogy a todo valóban létrejött-e, ellenőrizze, hogy a visszaadott todos utolsó bejegyzése megegyezik-e a kérésben elküldött bejegyzéssel.
A PUT /todos/:id végpontnak a frissített elemet kell visszaadnia:
app.put("/todos/:id", (req, res) => {
próbálja meg {
const id = req.params.id
const todo = todos.find((todo) => todo.id == id);
if(!todo) {
dobásújHiba("Todo nem található")
}
todo.completed = req.body.completed;
Visszatérésres.állapot(201).json({
adatok: todo,
hiba: nulla,
});
} fogás (hiba) {
Visszatérésres.állapot(500).json({
adat: nulla,
hiba: hiba,
});
}
});
Tesztelje a választ a következőképpen:
leír("Frissítsen egy teendőt", () => {
const newTodo = {
// csinálni
}
minden előtt(async () => {
kérésre vár (baseURL).post("/todo").send (newTodo);
})
végül(async () => {
várják kérés (baseURL).delete(`/todo/${newTodo.id}`)
})
azt("frissítenie kell az elemet, ha létezik", aszinkron () => {
const válasz = várják kérés (baseURL).put(`/todos/${newTodo.id}`).Küld({
elkészült: igaz,
});
elvárják(válasz.statusCode).lenni(201);
elvárják(válasz.test.adat.befejezte).lenni(igaz);
});
});
A választörzsben szereplő kitöltött értéknek igaznak kell lennie. Ne felejtse el megadni a frissíteni kívánt elem azonosítóját az URL-ben.
Tesztelje a DELETE /todos/:id végpontot
Az index.js fájlban hozza létre a DELETE végpontot. Vissza kell adnia a teendő adatokat a törölt elem nélkül.
app.delete("/todos/:id", (req, res) => {
próbálja meg {
const id = req.params.id
const todo = todos[0]
if (todo) {
todos.illesztés(id, 1)
}
Visszatérésres.állapot(200).json({
adatok: todos,
hiba: nulla,
});
} fogás (hiba) {
Visszatérésres.állapot(500).json({
adat: nulla,
hiba: hiba,
});
}
});
A végpont teszteléséhez ellenőrizheti, hogy a törölt elem még mindig létezik-e a visszaadott adatok között:
leír("Töröljön egy teendőt", () => {
const newTodo = {
// csinálni
}
minden előtt(async () => {
kérésre vár (baseURL).post("/todo").send (newTodo);
})
azt("törölnie kell egy elemet", aszinkron () => {
const válasz = várják kérés (baseURL).delete(`/todos/${newTodo.id}`);
const todos = válasz.test.adatok
const létezik = todos.find (todo => {
newTodo.id == todoId
})
elvár (létezik).toBe(meghatározatlan)
});
});
A DELETE végponttól visszaküldött adatok nem tartalmazhatják a törölt elemet. Mivel a visszaadott elemek egy tömbben vannak, az Array[id] segítségével ellenőrizheti, hogy az API megfelelően törölte-e az elemet. Az eredménynek hamisnak kell lennie.
REST API-k létrehozása
Ebből a cikkből megtanulta, hogyan tesztelhet egy Express Rest API-t a Jest API használatával. Teszteket írt a GET, PUT, POST és DELETE HTTP kérésekhez, és látta, hogyan lehet adatokat küldeni a végponthoz az URL-ben és a kérésben. Ezt a tudást alkalmaznia kell saját Rest API tesztelésekor.