mirror of
https://github.com/LukasKanka/api_test.git
synced 2026-11-11 06:34:36 +01:00
docs: add CRUD chaining guide for Bruno tests
- Complete step-by-step guide for creating CRUD test chains - Examples for /spells and /characters endpoints - Includes troubleshooting section - References to Bruno documentation Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
ada38f5dc5
commit
5429e9a1ce
1 file changed
+335
@@ -0,0 +1,335 @@
|
|||||||
|
# 🔗 CRUD Testovací Řetězec v Bruno – Kompletní průvodce
|
||||||
|
|
||||||
|
CRUD (Create, Read, Update, Delete) řetězení umožňuje **testovat celý životní cyklus** jednoho záznamu napříč více požadavky. V Bruno se to dělá pomocí **sdílených proměnných prostředí** a **post-response skriptů**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Princip řetězení v Bruno
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /spells → Vytvoří kouzlo → Uloží ID do proměnné
|
||||||
|
↓
|
||||||
|
GET /spells/:id → Získá kouzlo → Ověří vytvoření
|
||||||
|
↓
|
||||||
|
PUT /spells/:id → Upraví kouzlo → Ověří úpravu
|
||||||
|
↓
|
||||||
|
DELETE /spells/:id → Smaže kouzlo → Ověří smazání
|
||||||
|
↓
|
||||||
|
GET /spells/:id → Získá kouzlo → Ověří 404 (smazáno)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Klíčové prvky:**
|
||||||
|
- `bru.setEnvVar("variableName", value)` – Ukládá hodnotu do proměnných prostředí
|
||||||
|
- `{{variableName}}` – Používá uloženou hodnotu v dalších požadavcích
|
||||||
|
- **Pořadí (seq)** – Určuje, v jakém pořadí se testy spouštějí
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Krok za krokem: CRUD pro /spells
|
||||||
|
|
||||||
|
### Předpoklady
|
||||||
|
- Backend PotterAPI běží na `localhost:3000`
|
||||||
|
- Kolekce `PotterAPI` existuje
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 1: Vytvoř složku pro CRUD testy
|
||||||
|
```bash
|
||||||
|
mkdir -p apiTest/PotterAPI/CRUD
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 2: Vytvoř folder.yml
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/folder.yml
|
||||||
|
info:
|
||||||
|
name: CRUD - Spells
|
||||||
|
type: folder
|
||||||
|
seq: 10
|
||||||
|
|
||||||
|
request:
|
||||||
|
auth: inherit
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 3: Vytvoř test pro CREATE (POST)
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/1-CREATE-spell.yml
|
||||||
|
info:
|
||||||
|
name: CREATE - Create new spell
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: POST
|
||||||
|
url: http://localhost:3000/spells
|
||||||
|
auth: inherit
|
||||||
|
headers:
|
||||||
|
- name: Content-Type
|
||||||
|
value: application/json
|
||||||
|
body:
|
||||||
|
raw: |-
|
||||||
|
{
|
||||||
|
"spell": "Lumos Maximus",
|
||||||
|
"type": "Charm",
|
||||||
|
"effect": "Creates bright light",
|
||||||
|
"isUnforgivable": false
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
# Uloží ID nově vytvořeného kouzla
|
||||||
|
- type: post-response
|
||||||
|
code: |-
|
||||||
|
if (res.getStatus() === 201) {
|
||||||
|
const body = res.getBody();
|
||||||
|
bru.setEnvVar("createdSpellId", body.spell.id);
|
||||||
|
bru.setEnvVar("createdSpellName", body.spell.spell);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Testy pro vytvoření
|
||||||
|
- type: tests
|
||||||
|
code: |-
|
||||||
|
test("Status code is 201 Created", function() {
|
||||||
|
expect(res.getStatus()).to.equal(201);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Response contains spell with id", function() {
|
||||||
|
const body = res.getBody();
|
||||||
|
expect(body.spell).to.have.property("id");
|
||||||
|
expect(body.spell.id).to.be.a("string");
|
||||||
|
});
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 4: Vytvoř test pro READ (GET)
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/2-READ-spell.yml
|
||||||
|
info:
|
||||||
|
name: READ - Get created spell
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: GET
|
||||||
|
url: http://localhost:3000/spells/{{createdSpellId}}
|
||||||
|
auth: inherit
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
- type: tests
|
||||||
|
code: |-
|
||||||
|
test("Status code is 200 OK", function() {
|
||||||
|
expect(res.getStatus()).to.equal(200);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Response contains the created spell", function() {
|
||||||
|
const body = res.getBody();
|
||||||
|
expect(body.spell).to.equal(bru.getEnvVar("createdSpellName"));
|
||||||
|
expect(body.id).to.equal(bru.getEnvVar("createdSpellId"));
|
||||||
|
});
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 5: Vytvoř test pro UPDATE (PUT)
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/3-UPDATE-spell.yml
|
||||||
|
info:
|
||||||
|
name: UPDATE - Update spell
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: PUT
|
||||||
|
url: http://localhost:3000/spells/{{createdSpellId}}
|
||||||
|
auth: inherit
|
||||||
|
headers:
|
||||||
|
- name: Content-Type
|
||||||
|
value: application/json
|
||||||
|
body:
|
||||||
|
raw: |-
|
||||||
|
{
|
||||||
|
"spell": "Lumos Maximus Updated",
|
||||||
|
"type": "Charm",
|
||||||
|
"effect": "Creates very bright light",
|
||||||
|
"isUnforgivable": false
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
- type: post-response
|
||||||
|
code: |-
|
||||||
|
if (res.getStatus() === 201) {
|
||||||
|
bru.setEnvVar("createdSpellName", "Lumos Maximus Updated");
|
||||||
|
}
|
||||||
|
|
||||||
|
- type: tests
|
||||||
|
code: |-
|
||||||
|
test("Status code is 201 Updated", function() {
|
||||||
|
expect(res.getStatus()).to.equal(201);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Response contains updated spell", function() {
|
||||||
|
const body = res.getBody();
|
||||||
|
expect(body.spell).to.equal("Lumos Maximus Updated");
|
||||||
|
});
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 6: Vytvoř test pro DELETE
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/4-DELETE-spell.yml
|
||||||
|
info:
|
||||||
|
name: DELETE - Delete spell
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: DELETE
|
||||||
|
url: http://localhost:3000/spells/{{createdSpellId}}
|
||||||
|
auth: inherit
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
- type: tests
|
||||||
|
code: |-
|
||||||
|
test("Status code is 200 OK", function() {
|
||||||
|
expect(res.getStatus()).to.equal(200);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Response contains delete message", function() {
|
||||||
|
const body = res.getBody();
|
||||||
|
expect(body.message).to.equal("spell deleted");
|
||||||
|
});
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Krok 7: Vytvoř test pro ověření smazání
|
||||||
|
```yaml
|
||||||
|
# apiTest/PotterAPI/CRUD/5-VERIFY-deleted.yml
|
||||||
|
info:
|
||||||
|
name: VERIFY - Check spell is deleted
|
||||||
|
type: http
|
||||||
|
seq: 5
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: GET
|
||||||
|
url: http://localhost:3000/spells/{{createdSpellId}}
|
||||||
|
auth: inherit
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
- type: tests
|
||||||
|
code: |-
|
||||||
|
test("Status code is 404 Not Found", function() {
|
||||||
|
expect(res.getStatus()).to.equal(404);
|
||||||
|
});
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Jak to spustit
|
||||||
|
|
||||||
|
### Spuštění celého CRUD řetězce
|
||||||
|
```bash
|
||||||
|
cd apiTest/PotterAPI
|
||||||
|
npx @usebruno/cli run CRUD -r
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Pokročilé techniky
|
||||||
|
|
||||||
|
### 1. Více řetězců v jedné kolekci
|
||||||
|
Můžeš vytvořit několik nezávislých CRUD řetězců (např. pro různé typy kouzel).
|
||||||
|
|
||||||
|
### 2. Sdílené proměnné napříč kolekcemi
|
||||||
|
Proměnné prostředí (`bru.setEnvVar`) jsou **globální** pro celou kolekci.
|
||||||
|
|
||||||
|
### 3. Čištění po testu
|
||||||
|
Pro idempotentní testy (které lze opakovat):
|
||||||
|
```javascript
|
||||||
|
// V poslední fázi řetězce
|
||||||
|
bru.setEnvVar("createdSpellId", null);
|
||||||
|
bru.setEnvVar("createdSpellName", null);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 Kompletní příklad pro /characters
|
||||||
|
|
||||||
|
**⚠️ Důležité:** `/characters` endpoint vyžaduje **Basic Auth**!
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 1-CREATE-character.yml
|
||||||
|
http:
|
||||||
|
method: POST
|
||||||
|
url: http://localhost:3000/characters
|
||||||
|
auth: inherit
|
||||||
|
headers:
|
||||||
|
- name: Content-Type
|
||||||
|
value: application/json
|
||||||
|
body:
|
||||||
|
raw: |-
|
||||||
|
{
|
||||||
|
"name": "Test Character",
|
||||||
|
"role": "student",
|
||||||
|
"house": "Gryffindor",
|
||||||
|
"school": "Hogwarts"
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
scripts:
|
||||||
|
- type: post-response
|
||||||
|
code: |-
|
||||||
|
if (res.getStatus() === 201) {
|
||||||
|
const body = res.getBody();
|
||||||
|
bru.setEnvVar("createdCharacterId", body.character.id);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Řešení problémů
|
||||||
|
|
||||||
|
| Problém | Příčina | Řešení |
|
||||||
|
|---------|---------|--------|
|
||||||
|
| Proměnná je `undefined` | Špatné pořadí `seq` | Zkontroluj, že CREATE má `seq: 1` |
|
||||||
|
| 404 na CREATE | Špatná URL | Zkontroluj, že URL je `http://localhost:3000/spells` |
|
||||||
|
| 400 na CREATE | Duplicitní data | Použij unikátní názvy |
|
||||||
|
| Testy selhávají | Backend neběží | Spusť `npm run start:potter-api` |
|
||||||
|
| "You can run only..." | Špatný adresář | Spusť z `apiTest/PotterAPI/` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Dokumentace
|
||||||
|
|
||||||
|
- [Bruno - Environment Variables](https://www.usebruno.com/docs/collections/environments)
|
||||||
|
- [Bruno - Scripting](https://www.usebruno.com/docs/scripting)
|
||||||
|
- [Chai Assertions](https://www.chaijs.com/api/bdd/)
|
||||||
Reference in new issue
Block a user