Тестирање, иако може бити дуготрајно, важан је корак у развојном циклусу сваке апликације. Осигурава да ћете рано ухватити грешке и проблеме пре него што гурнете код у производњу.

Можете користити Јест за тестирање Екпресс Рест АПИ-ја. Након што сте креирали једноставан ЦРУД АПИ, откријте како да напишете тестове за сваку крајњу тачку.

Шта је Јест?

Постоји много библиотека за тестирање ЈаваСцрипта које можете бирати, али Јест је најлакше за почетак. То је библиотека за тестирање коју је развио Фацебоок, која се углавном користи за тестирање Реацт пројеката. Међутим, можете га користити и за тестирање Ноде-а и других пројеката заснованих на ЈаваСцрипт-у. Развијен је на врху Јасмине, још једног алата за тестирање, и долази у пакету са сопственом библиотеком тврдњи.

Иако вам неће требати библиотека тврдњи да пишете тестове у Јест-у, мораћете да користите алатку за прављење ХТТП захтева. Овај чланак користи СуперТест.

Шта је СуперТест?

СуперТест је библиотека за тестирање чворова за ХТТП позиве. Проширује библиотеку тестирања суперагента и омогућава вам да постављате захтеве као што су ГЕТ, ПОСТ, ПУТ и ДЕЛЕТЕ.

СуперТест обезбеђује објекат захтева који можете да користите за прављење ХТТП захтева.

конст захтев = захтевају(„супертест“)
захтев("https://icanhazdadjoke.com")
.добити('/slack')
.крај(функција(ерр, рес) {
ако (ерр) бацити ерр;
конзола.Пријава(рес.тело.прилози);
});

Овде прослеђујете основни УРЛ АПИ-ја објекту захтева и затим повезујете ХТТП метод са остатком УРЛ-а. Тхе крај() метода позива АПИ сервер и функција повратног позива управља његовим одговором.

Када добијете одговор од АПИ-ја, можете користити Јест да га потврдите.

Креирајте Екпресс АПИ

Да бисте тестирали сопствене крајње тачке АПИ-ја, потребно је да креирате РЕСТ АПИ први. АПИ који ћете креирати је прилично једноставан. Умеће, преузима, ажурира и брише ставке из низа.

Започните креирањем новог директоријума под називом ноде-јест и иницијализацијом нпм-а.

мкдир ноде-јест
нпм инит -и

Затим креирајте нову датотеку под називом индек.јс и креирајте Екпресс сервер.

конст екпресс = захтевају("изразити")
конст апп = екпресс()
апп.листен (3000, () => цонсоле.лог("Слушање на порту 3000"))

Тестирајте ГЕТ /тодос крајњу тачку

Прва крајња тачка коју ћете креирати је ГЕТ /тодос крајња тачка. Враћа све ставке у низу. У индек.јс додајте следеће.

конст тодос = [
];
// Добиј све тодос
апп.гет("/todos", (рек, рес) => {
повратакрес.статус(200).јсон({
подаци: тодос,
грешка: нула,
});
});

Имајте на уму да одговор има статусни код 200 и ЈСОН објекат који садржи ставку обавеза у низу који се зове подаци и поруку о грешци. Ово је оно што ћете тестирати користећи Јест.

Сада инсталирајте Јест и СуперТест:

нпм инсталирај јест супертест

Затим додајте тестну скрипту пацкаге.јсон као што следи:

{
"скрипте": {
"тест": "шала"
}
}

Пре него што почнете да пишете сопствене тестове, требало би да разумете како да напишете основни тест у Јесту.

Размотрите следећу функцију:

функцијасум(а, б) {
повратак а + б;
}
модул.извоза = сума;

У тест датотеци треба да:

  • Увезите функцију.
  • Опишите шта тест треба да уради.
  • Позовите функцију.
  • Потврдите очекивани одговор са стварним одговором функције.
конст {сума} = захтевају("./сума")
описати ("Збир две ставке", асинц() => {
тест("Требало би да врати 4", () => {
очекивати(сум(2,2)).бити(4)
})
})

Тхе описати кључна реч специфицира групу тестова и тест изјава специфицира конкретан тест. Ако се вредност враћена из функције поклапа са вредношћу која је прослеђена бити, тест пролази.

Када тестирате крајње тачке АПИ-ја, нећете позивати функцију, већ слати захтев помоћу СуперТест-а или друге ХТТП клијентске библиотеке.

Враћајући се на ГЕТ крајњу тачку, креирајте нову датотеку под називом апи.тест.јс. Овде ћете написати све тестове крајње тачке. Именовање тест фајла са а .тест инфик осигурава да га Јест препознаје као пробну датотеку.

У апи.тест.јс, увезите супертест и поставите основни УРЛ на следећи начин:

конст захтев = захтевају(„супертест“)
конст басеУРЛ = "хттп://лоцалхост: 3000"

Затим креирајте први тест у блоку описа:

описати ("ГЕТ /тодос", () => {
конст невТодо = {
ид: црипто.рандомУУИД(),
ставка: "Пити воду",
завршено: лажно,
}
пре свега(асинц () => {
// постави задатак
чекај захтев (басеУРЛ).пост("/todo").сенд (невТодо);
})
после свега(асинц () => {
чекати захтев (басеУРЛ).делете(`/тодо/${невТодо.ид}`)
})
то("требало би да врати 200", асинц () => {
конст одговор = чекати захтев (басеУРЛ).гет("/todos");
очекивати(одговор.статусЦоде).бити(200);
очекивати(одговор.тело.еррор).бити(нула);
});
то("требало би да врати тодос", асинц () => {
конст одговор = чекати захтев (басеУРЛ).гет("/todos");
очекуј (респонсе.боди.дата.ленгтх >= 1).бити(истинито);
});
});

Пре покретања тестова, мораћете да дефинишете функције подешавања и уклањања. Ове функције ће попунити низ задатака са ставком пре теста и избрисати лажне податке након сваког теста.

Код који се покреће пре свих тестова налази се у функцији бефореАлл(). Код који се покреће након свих тестова налази се у функцији афтерАлл().

У овом примеру, једноставно погађате крајње тачке ПОСТ и ДЕЛЕТЕ за сваку. У стварној апликацији, вероватно бисте се повезали са лажном базом података која садржи податке теста.

У овом тесту, прво сте упутили захтев крајњој тачки ГЕТ /тодос и упоредили послат одговор са очекиваним резултатима. Овај скуп тестова ће проћи ако одговор има ХТТП статусни код од 200, подаци нису празни, а порука о грешци је нула.

Тестирајте крајњу тачку ПОСТ /тодо

У индек.јс направите крајњу тачку ПОСТ /тодо:

апп.пост("/todo", (рек, рес) => {
покушати {
конст { ид, ставка, завршено } = рек.боди;
конст невТодо = {
ид,
ставка,
завршено,
};
тодос.пусх(невТодо);
повратакрес.статус(201).јсон({
подаци: тодос,
грешка: нула,
});
} улов (грешка) {
повратакрес.статус(500).јсон({
подаци: нула,
грешка: грешка,
});
}
});

У овом тесту, мораћете да пошаљете детаље о обавезама у телу захтева користећи метод сенд().

захтев (басеУРЛ).пост("/todo".сенд (невТодо)

ПОСТ /тодо захтев треба да врати статусни код 201 и низ задатака са новом ставком која је додата на крају. Ево како би тест могао да изгледа:

описати ("ПОСТ /тодо", () => {
конст невТодо = {
// урадити
}
после свега(асинц () => {
чекати захтев (басеУРЛ).делете(`/тодо/${невТодо.ид}`)
})
то("треба додати ставку у тодос низ", асинц () => {
конст одговор = чекати захтев (басеУРЛ).пост("/todo").send(newTodo);
конст ластИтем = респонсе.боди.дата[респонсе.боди.дата.ленгтх-1]
очекивати(одговор.статусЦоде).бити(201);
очекивати(ластИтем.итем).бити(невТодо["ставка"]);
очекивати(ластИтем.завршено).бити(невТодо["завршено"]);
});
});

Овде просљеђујете тодо податке методи сенд() као аргумент. Одговор треба да има статусни код 201 и да садржи све ставке задатака у објекту података. Да бисте тестирали да ли је задатак заиста креиран, проверите да ли се последњи унос у враћеним обавезама подудара са оним који сте послали у захтеву.

Крајња тачка ПУТ /тодос/:ид би требало да врати ажурирану ставку:

апп.пут("/todos/:id", (рек, рес) => {
покушати {
конст ид = рек.парамс.ид
конст тодо = тодос.финд((тодо) => тодо.ид == ид);
иф(!тодо) {
бацитиНоваГрешка(„Тодо није пронађено“)
}
тодо.цомплетед = рек.боди.цомплетед;
повратакрес.статус(201).јсон({
подаци: тодо,
грешка: нула,
});
} улов (грешка) {
повратакрес.статус(500).јсон({
подаци: нула,
грешка: грешка,
});
}
});

Тестирајте одговор на следећи начин:

описати ("Ажурирајте један задатак", () => {
конст невТодо = {
// урадити
}
пре свега(асинц () => {
чекај захтев (басеУРЛ).пост("/todo").сенд (невТодо);
})
после свега(асинц () => {
чекати захтев (басеУРЛ).делете(`/тодо/${невТодо.ид}`)
})
то("треба ажурирати ставку ако постоји", асинц () => {
конст одговор = чекати захтев (басеУРЛ).пут(`/тодос/${невТодо.ид}`).сенд({
завршено: истинито,
});
очекивати(одговор.статусЦоде).бити(201);
очекивати(одговор.тело.дата.завршено).бити(истинито);
});
});

Попуњена вредност у телу одговора треба да буде тачна. Не заборавите да у УРЛ адресу унесете ИД ставке коју желите да ажурирате.

Тестирајте ДЕЛЕТЕ /тодос/:ид крајњу тачку

У индек.јс креирајте крајњу тачку ДЕЛЕТЕ. Требало би да врати податке задатака без обрисане ставке.

апп.делете("/todos/:id", (рек, рес) => {
покушати {
конст ид = рек.парамс.ид
конст тодо = тодос[0]
иф (тодо) {
тодос.сплице(ид, 1)
}
повратакрес.статус(200).јсон({
подаци: тодос,
грешка: нула,
});
} улов (грешка) {
повратакрес.статус(500).јсон({
подаци: нула,
грешка: грешка,
});
}
});

Да бисте тестирали крајњу тачку, можете проверити да ли избрисана ставка још увек постоји у враћеним подацима:

описати ("Избришите један задатак", () => {
конст невТодо = {
// урадити
}
пре свега(асинц () => {
чекај захтев (басеУРЛ).пост("/todo").сенд (невТодо);
})
то("треба избрисати једну ставку", асинц () => {
конст одговор = чекати захтев (басеУРЛ).делете(`/тодос/${невТодо.ид}`);
конст тодос = одговор.тело.подаци
конст постоји = тодос.финд (тодо => {
невТодо.ид == тодоИд
})
очекивати (постоји).тоБе(недефинисан)
});
});

Подаци враћени са крајње тачке ДЕЛЕТЕ не би требало да садрже избрисану ставку. Пошто су враћене ставке у низу, можете користити низ[ид] да проверите да ли је АПИ исправно избрисао ставку. Резултат би требао бити лажан.

Креирање РЕСТ АПИ-ја

У овом чланку сте научили како да тестирате Екпресс Рест АПИ користећи Јест АПИ. Написали сте тестове за ГЕТ, ПУТ, ПОСТ и ДЕЛЕТЕ ХТТП захтеве и видели како да пошаљете податке до крајње тачке у УРЛ-у и захтеву. Требало би да будете у могућности да примените ово знање када тестирате сопствени Рест АПИ.