10 KiB
🧪 PotterAPI – Testovací scénáře, tipy a rady pro Bruno API Client
Tento dokument obsahuje přehled testovacích scénářů, tipů, triků a automatizovaných testů v aplikaci Bruno pro testování REST API PotterAPI.
📋 Stručné shrnutí toho, co v dokumentu najdete:
-
Nastavení prostředí (Environment v Bruno): • Nastavení proměnných baseUrl (http://localhost:3000), username ( ), password ( ).
-
Testovací scénáře pro všechny API služby:
• 🪄 Kouzla (/spells): Pozitivní testy (seznam, detail, nový záznam, úprava, smazání) a negativní testy (duplicity, chybějící Content-Type: application/json hlavička, 422 Joi validace, 404).
• 🧙 Postavy (/characters): Testy s Basic Auth, filtrování podle koleje/role, přidávání, úprava a mazání postav, chybové stavy pro 401 Unauthorized a duplicity.
• 🏰 Koleje, Klobouk a Citáty (/houses, /sortingHat, /quote): Testy pro získání kolejí a citátů.
-
Asertace a Automatizace (Tests & Scripts):
• Příklady JavaScript testů pro záložku Tests v Bruno (kontrola stavových kódů 200, 201, 400, 401, 422, kontrola JSON struktury).
• Skript pro záložku Post Response v Bruno pro automatické uložení vygenerovaného ID z odpovídajícího POST požadavku do proměnné prostředí (bru.setEnvVar("createdSpellId", body. spell.id)).
-
Workflow & Řetězení testů (Chaining):
• Postup, jak nastavit kompletní CRUD cyklus: POST ➡️ GET detail ➡️ PUT ➡️ DELETE ➡️ GET 404.
⚙️ 1. Nastavení Bruno (Environment & Kolekce)
Vytvoření prostředí (Environment)
V aplikaci Bruno si vytvořte nové prostředí (např. Local) s následujícími proměnnými:
| Název proměnné | Hodnota | Popis |
|---|---|---|
baseUrl |
http://localhost:3000 |
Základní URL lokálního serveru |
username |
***** |
Přihlašovací jméno pro Basic Auth |
password |
***** |
Heslo pro Basic Auth |
createdSpellId |
(dynamicky) | Ukládá ID nově vytvořeného kouzla |
createdCharacterId |
(dynamicky) | Ukládá ID nově vytvořené postavy |
Tip
V Bruno můžete v URL i v těle požadavku používat proměnné pomocí zápisu
{{baseUrl}}/spells.
🔑 2. Autentizace v Bruno
Aplikace používá dva druhy autentizace:
-
Basic Auth (
*****/*****):- Vyžadováno pro
/charactersa/login. - Nastavení v Bruno: Na záložce Auth zvolte
Basic Autha zadejteUsername: {{username}}aPassword: {{password}}.
- Vyžadováno pro
-
Content-Type Header Check (
application/json):- Vyžadováno pro
POSTaPUTu/spells(middlewarecheckHeader). - Nastavení v Bruno: Na záložce Headers přidejte
Content-Type: application/json.
- Vyžadováno pro
📋 3. Přehled testovacích scénářů
🪄 A. Kouzla (/spells)
🟢 Pozitivní scénáře (Happy Path)
-
Získání všech kouzel
- Metoda:
GET {{baseUrl}}/spells - Očekávaný stav:
200 OK - Kontrola: Vrátí pole objektů, kde každý objekt má
id,spell,type,effect,isUnforgivable.
- Metoda:
-
Filtrování kouzel podle typu
- Metoda:
GET {{baseUrl}}/spells?type=Curse - Očekávaný stav:
200 OK - Kontrola: Každá položka v poli má
"type": "Curse".
- Metoda:
-
Vytvoření nového kouzla
- Metoda:
POST {{baseUrl}}/spells - Headers:
Content-Type: application/json - Body (JSON):
{ "spell": "Expelliarmus", "type": "Charm", "effect": "Disarms your opponent", "isUnforgivable": "false" } - Očekávaný stav:
201 Created - Kontrola: Vrátí
{ message: "Spell created", spell: { id: "..." } }. HodnotaisUnforgivablevspells.jsonbudefalse(boolean).
- Metoda:
-
Získání konkrétního kouzla podle ID
- Metoda:
GET {{baseUrl}}/spells/{{createdSpellId}} - Očekávaný stav:
200 OK - Kontrola: Vrátí objekt kouzla s odpovídajícím ID.
- Metoda:
-
Úprava kouzla
- Metoda:
PUT {{baseUrl}}/spells/{{createdSpellId}} - Headers:
Content-Type: application/json - Body (JSON):
{ "spell": "Expelliarmus Maxima", "type": "Charm", "effect": "Strongly disarms opponent", "isUnforgivable": false } - Očekávaný stav:
201 Created
- Metoda:
-
Smazání kouzla podle ID
- Metoda:
DELETE {{baseUrl}}/spells/{{createdSpellId}} - Očekávaný stav:
200 OK - Kontrola: Vrátí
{ message: "spell deleted" }.
- Metoda:
🔴 Negativní a Hraniční scénáře
-
Chybějící hlavička Content-Type (POST / PUT)
- Metoda:
POST {{baseUrl}}/spells(bezContent-Type: application/json) - Očekávaný stav:
400 Bad Request - Očekávaná zpráva:
"Sorry Nick you dont have HEADer"
- Metoda:
-
Pokus o vytvoření duplicitního kouzla
- Metoda:
POST {{baseUrl}}/spellss národem kouzla, které již existuje (např."spell": "Alohomora") - Očekávaný stav:
400 Bad Request - Očekávaná zpráva:
"Spell Alohomora already exists"
- Metoda:
-
Neplatná data (Joi validation failure)
- Metoda:
POST {{baseUrl}}/spells - Body (JSON): (příliš krátký název, neplatný typ)
{ "spell": "Ab", "type": "SuperPower", "isUnforgivable": true } - Očekávaný stav:
422 Unprocessable Entity
- Metoda:
-
Vyhledání neexistujícího kouzla
- Metoda:
GET {{baseUrl}}/spells/non-existing-id-999 - Očekávaný stav:
404 Not Found
- Metoda:
🧙 B. Postavy (/characters)
Important
Všechny požadavky na
/charactersvyžadují Basic Auth (****/*****).
🟢 Pozitivní scénáře
-
Získání všech postav
- Metoda:
GET {{baseUrl}}/characters - Auth: Basic Auth
- Očekávaný stav:
200 OK
- Metoda:
-
Filtrování postav podle koleje a role
- Metoda:
GET {{baseUrl}}/characters?house=Gryffindor&role=student - Auth: Basic Auth
- Očekávaný stav:
200 OK
- Metoda:
-
Vytvoření nové postavy
- Metoda:
POST {{baseUrl}}/characters - Auth: Basic Auth
- Headers:
Content-Type: application/json - Body (JSON):
{ "name": "Hermione Granger", "role": "student", "house": "Gryffindor", "school": "Hogwarts School of Witchcraft and Wizardry", "dumbledoresArmy": true, "bloodStatus": "muggle-born", "species": "human" } - Očekávaný stav:
201 Created
- Metoda:
-
Smazání postavy podle ID
- Metoda:
DELETE {{baseUrl}}/characters/{{createdCharacterId}} - Auth: Basic Auth
- Očekávaný stav:
200 OK
- Metoda:
🔴 Negativní scénáře
-
Přístup bez přihlášení (Neplatné/Chybějící Basic Auth)
- Metoda:
GET {{baseUrl}}/characters(bez Auth) - Očekávaný stav:
401 Unauthorized - Očekávané tělo:
{ "message": "Sorry Wizard, can't let you in." }
- Metoda:
-
Duplicitní jméno postavy
- Metoda:
POST {{baseUrl}}/charactersse jménem, které již v databázi je (např."name": "Hannah Abbott") - Očekávaný stav:
400 Bad Request
- Metoda:
🏰 C. Koleje, Moudrý klobouk & Citáty (/houses, /sortingHat, /quote)
- Seznam kolejí:
GET {{baseUrl}}/houses->200 OK(Vrátí 4 koleje) - Detail koleje:
GET {{baseUrl}}/houses/5a05e2b252f039152b96b5a7->200 OK(Gryffindor) - Moudrý klobouk:
GET {{baseUrl}}/sortingHat->200 OK(Vrátí náhodnou kolej) - Náhodný citát:
GET {{baseUrl}}/quote->200 OK(Vrátí citát)
⚡ 4. Testovací skripty & Asertace v Bruno
V Bruno můžete psát testy v záložce Tests (používá knihovnu Chai / JavaScript).
Příklady asertací:
Test 1: Kontrola stavového kódu a struktury odpovědi při vytvoření kouzla
(Záložka Tests u requestu POST /spells):
test("Status code is 201 Created", function() {
expect(res.getStatus()).to.equal(201);
});
test("Response contains success message and spell ID", function() {
const data = res.getBody();
expect(data).to.have.property("message", "Spell created");
expect(data.spell).to.have.property("id");
});
Test 2: Uložení vytvořeného ID do proměnné prostředí (Post-response Script)
(Záložka Script -> Post Response):
if (res.getStatus() === 201) {
const body = res.getBody();
bru.setEnvVar("createdSpellId", body.spell.id);
}
🔗 5. Řetězení testů (Workflow v Bruno)
Díky skriptování můžete vytvořit automatizovaný řetězec testů:
flowchart LR
A["1. POST /spells<br/>(Vytvořit kouzlo)"] -->|"Uloží ID do env"| B["2. GET /spells/:id<br/>(Ověřit vytvoření)"]
B --> C["3. PUT /spells/:id<br/>(Upravit kouzlo)"]
C --> D["4. DELETE /spells/:id<br/>(Smazat kouzlo)"]
D --> E["5. GET /spells/:id<br/>(Ověřit 404)"]
- Krok 1 (
POST /spells): Vytvoří kouzlo a vPost Responseskriptu uložícreatedSpellId. - Krok 2 (
GET /spells/{{createdSpellId}}): Ověří, že kouzlo existuje. - Krok 3 (
PUT /spells/{{createdSpellId}}): Upraví vlastnosti kouzla. - Krok 4 (
DELETE /spells/{{createdSpellId}}): Smaže kouzlo. - Krok 5 (
GET /spells/{{createdSpellId}}): Ověří navrácení kódů404 Not Found.
💡 Tipy a doporučení pro Bruno
- Používejte Bruno Runner:
- V levém panelu můžete kliknout na menu kolekce a zvolit Run. Bruno spustí všechny testy v kolekci za sebou a zobrazí zelené/červené výsledky.
- Ukládání kolekce do Gitu:
- Bruno ukládá kolekce jako čisté
.brusoubory přímo ve vaší složce projektu. Můžete je verzovat v Gitu spolu s kódem backendu!
- Bruno ukládá kolekce jako čisté
- Reset databáze před testy:
- Na začátku testovací sady doporučujeme zavolat
GET {{baseUrl}}/spells/actions/reset, aby byl stavspells.jsonvždy předvídatelný.
- Na začátku testovací sady doporučujeme zavolat
- Záloha dat:
- Zálohuj si veškerá data před testováním i po testování dle potřeby ať o ně nepříjdeš.