Õpetus: kuidas testida Vapor 2 abil

Selles õpetuses näitan teile, kuidas oma marsruute testida, tuginedes varem kirjutatud CRUD-juhendaja tulemusele. Kui soovite kõigepealt teha CRUD-õpetuse ja hiljem tagasi tulla, leiate selle siit. Kui soovite CRUD-juhendi vahele jätta, saate tulemuse siin kloonida ja kohe alustada !

Selle katseõppe tulemuse leiate githubist: siit.

1. Projekti ülesehitus

Teil peaks olema selline projekti struktuur:

testnäide /
├── Pakett.swift
├── Allikad /
│ ├── Rakendus /
│ │ ├── Config + Setup.swift
│ │ ├── Tilk + häälestus.swift
│ │ ├── Routes.swift
│ │ └── mudelid /
│ │ └── Kasutaja.swift
│ └── Käivita /
├── Testid /
│ └── AppTests /
│ ├── UserRequestTest.swift
│ └── Utilities.swift
├── seadistamine /
├── avalik /
├── Sõltuvused /
└── Tooted /

Kui olete repli klooninud õppetükist crud-tutorial, on teil juba fail UserRequestTest.swift, sel juhul kustutage kogu selle sees olev kood.

Kui lõite crud-projekti, järgides crud-õpetust, on teil projekti struktuur selline:

testnäide /
├── Pakett.swift
├── Allikad /
│ ├── Rakendus /
│ │ ├── Config + Setup.swift
│ │ ├── Tilk + häälestus.swift
│ │ ├── Routes.swift
│ │ └── mudelid /
│ │ └── Kasutaja.swift
│ └── Käivita /
├── Testid /
│ └── AppTests /
│ ├── PostControllerTests.swift
│ ├── RouteTests.swift
│ └── Utilities.swift
├── seadistamine /
├── avalik /
├── Sõltuvused /
└── Tooted /

Sel juhul kustutage (teisaldage prügikasti)
• PostControllerTests.swift
• RouteTests.swift
ja looge tühi fail nimega
• UserRequestTest.swift

testnäide /
├── Pakett.swift
├── Allikad /
│ ├── Rakendus /
│ │ ├── Config + Setup.swift
│ │ ├── Tilk + häälestus.swift
│ │ ├── Routes.swift
│ │ └── mudelid /
│ │ └── Kasutaja.swift
│ └── Käivita /
├── Testid /
│ └── AppTests /
│ ├── PostControllerTests.swift <- Kustuta
│ ├── RouteTests.swift <- Kustuta
│ ├── UserRequestTest.swift <- CREATE
│ └── Utilities.swift
├── seadistamine /
├── avalik /
├── Sõltuvused /
└── Tooted /

2. Test: kasutaja luuakse

Sisetestid / AppTests / UserRequestTest.swift kirjutavad:

import aur
impordi HTTP
impordi XCTest
// rakenduse importimine on vajalik kasutaja salvestamiseks otse nagu 'proovida kasutajat (kasutajanimi: "kangelane", vanus: 23) .save ()'
@testable impordi rakendus
klass UserRequestTest: TestCase {
  // meie tilga eksemplari hankimine koos meie konfiguratsiooniga
  lase tilk = proovi! Droplet.testable ()
  func testThatUserGetsCreated () viskab {
    /// MÄRK: VALMISTAMINE
    las un = "Tim", vanus = 21
    let user = Kasutaja (kasutajanimi: un, vanus: vanus)
  
    lase json = proovida kasutajat.makeJSON ()
    lase reqBody = proovida keha (json)
    /// MÄRK: TESTIMINE
    las req = Taotlus (meetod: .post, uri: "/ kasutaja", päised: ["Sisu tüüp": "rakendus / json"], keha: reqBody)
    laske res = proovige drop.testResponse (kuni: req)
    // vastus on 200
    res.assertStatus (on: .ok)
    // testi vastus on json
    valvur lase resJson = res.json else {
      XCTFail ("Viga jsoni otsimisel res: \ (res)")
      tagasi
    }
    proovige res.assertJSON ("id", läbib: {jsonVal in jsonVal.int! = null})
    proovige res.assertJSON ("kasutajanimi", võrdub: un)
    proovige res.assertJSON ("vanus", võrdub: vanus)
    /// MÄRK: PUHASTUS
    valvur lase userId = resJson ["id"] ?. int, lase userToDelete = proovi User.find (userId) else {
      XCTFail ("Viga ei õnnestunud ID-d teisendada sisendiks VÕI ei suutnud vastusest leida kasutajat, kellel on id: \ (res)")
      tagasi
    }
    proovi kasutajatToDelete.delete ()
  }
}

Selgitan lühidalt (lisaks kommentaaridele), mida ülaltoodud kood teeb. Olen välja töötanud isikliku mustri, kuidas testi funktsioone struktureerida:

func testThatUserGetsCreated () viskab {
  /// MÄRK: VALMISTAMINE
  See tähistab selle ala algust, kus ma koostan kõik andmed, mida ma testimiseks vajan
  /// MÄRK: TESTIMINE
  See tähistab selle ala algust, kus ma tegelikult testida saan
  /// MÄRK: PUHASTUS
  See tähistab selle ala algust, kus ma pärast testimist lõplikult loodud andmed puhastan
}

Tahame testida, kas meie marsruut / kasutaja, kui vallandati kehtiva JSON-i saatmise POST-päringuga, loob tõesti kasutaja.

FUNKTSIOON:
Leidsin, et panin funktsiooni nimeks selle järgi, mida nad teevad, väga kasulik ja väljendusrikas, mistõttu kutsume seda funktsiooniks testThatUserGetsCreated ().

VALMISTAMINE:
Selles valdkonnas loome kaks muutujat un (kasutajanimi) ja vanus (tähistab vanust ). Me lähtestame oma kasutaja nende muutujatega ja teeme temast JSON-objekti. Me lähtestame keha JSON-Objektiga ja see on see.

TESTIMINE:
Loome päringuobjekti, mis läbib http-meetodit, marsruudi jaoks vajalikku URL-i, päist ja keha. Sisselülitades proovi drop.testResponse (to: req) meie taotlus täidetakse ja salvestame tulemuse muutujasse res.
Nüüd saame testida, kas vastus sisaldab seda, mille määratlesime marsruudil, mille naasta pärast kasutaja edukat loomist.

Me määratlesime, et marsruut tagastab loodud kasutaja JSON-na.

Seega kontrollime valvega, kas vastus sisaldab jsoni. Kui ei, siis me teame, et midagi läks valesti, visates sellega XCTFaili. Seejärel kontrollime, kas võtme ID JSON-väärtus on int tüüpi. Samuti siis, kui JSON-väärtus võtme kasutajanimes on võrdne meie muutujaga ja kui JSON-väärtus võtme vanuses on võrdne meie vanuse muutujaga. Kui kõik möödub, fantastiliselt, koristagem!

KORISTA ÄRA:
Kuna kasutaja on edukalt loodud, on meie andmebaasis kirje. Arvan, et testid peaksid kohad paremini lahkuma kui nad leidsid
Seega teisendame JSON-väärtuse võtme id sisendiks ja proovime leida ID-ga kasutaja. Kui meil on kasutaja, siis teostame lihtsalt kustutamise () temaga ja oleme valmis

3. Tehke meie esimene test

Testi täitmiseks on mitu võimalust ja need on kõik lahedad. Selles õpetuses kasutame aurutööriistade komplekti. Käivitage oma projektikataloogi terminalis:

aurutesti

See näitab teile lahedat palli, mis kulgeb mõne sekundi jooksul edasi-tagasi, ja siis teie katse saab läbi! Kuule lust!

Vihje: kui soovite rohkem sõnalist väljundit, minge ja täitke selle asemel: kiire test

4. Test: Kasutajat loetakse

See funktsioon on väiksem ja kuna teate, mida siin tähendab kood

import aur
impordi HTTP
impordi XCTest
// rakenduse importimine on vajalik kasutaja salvestamiseks otse nagu 'proovida kasutajat (kasutajanimi: "kangelane", vanus: 23) .save ()'
@testable impordi rakendus
klass UserRequestTest: TestCase {
  // meie tilga eksemplari hankimine koos meie konfiguratsiooniga
  lase tilk = proovi! Droplet.testable ()
  func testThatUserGetsCreated () viskab {
    ...
  }
  func testThatUserGetsReturned () viskab {
    /// MÄRK: VALMISTAMINE
    las un = "Elon", vanus = 31
    let user = Kasutaja (kasutajanimi: un, vanus: vanus)
    // kasutaja käsitsi loomine, kuna soovime tema saamist testida
    proovi kasutajat.save ()
    valvur lase userId = user.id?.int else {
      XCTFail ("Viga kasutajatunnuse teisendamisel int-ks")
      tagasi
    }
    /// MÄRK: TESTIMINE
    las req = Taotlus (meetod: .get, uri: "/ user / \ (userId)")
    laske res = proovige drop.testResponse (kuni: req)
    res.assertStatus (on: .ok)
    proovige res.assertJSON ("kasutajanimi", võrdub: un)
    /// MÄRK: PUHASTUS
    proovi user.delete ()
  }
}

Võite jälle minna:

aurutesti

Või mida ma eelistan, kuna näete kõiki funktsioone, mis testide käivitamisel täidetakse:

kiire test

5. Test: kasutajat värskendatakse

Rääkimine on odav. Näita mulle koodi.

import aur
impordi HTTP
impordi XCTest
// rakenduse importimine on vajalik kasutaja salvestamiseks otse nagu 'proovida kasutajat (kasutajanimi: "kangelane", vanus: 23) .save ()'
@testable impordi rakendus
klass UserRequestTest: TestCase {
  // meie tilga eksemplari hankimine koos meie konfiguratsiooniga
  lase tilk = proovi! Droplet.testable ()
  func testThatUserGetsCreated () viskab {
    ...
  }
  func testThatUserGetsReturned () viskab {
    ...
  }
  func testThatUserGetsUpdated () viskab {
    /// MÄRK: VALMISTAMINE
    las un = "Steve", vanus = 37
    let user = Kasutaja (kasutajanimi: un, vanus: vanus)
    proovi kasutajat.save ()
    /// MÄRK: TESTIMINE
    valvur lase userId = user.id?.int else {
      XCTFail ("Viga kasutajatunnuse teisendamisel int-ks")
      tagasi
    }
    // muuda andmeid
    lase newUn = "Craig"
    user.username = newUn
    lase json = proovida kasutajat.makeJSON ()
    lase reqBody = proovida keha (json)
    // testkasutajat värskendatakse
    lase updateUserReq = Taotlus (meetod: .put, uri: "/ user / \ (userId)", päised: ["Content-Type": "application / json"], body: reqBody)
    lase updateUserRes = proovida drop.testResponse (aadressile: updateUserReq)
    updateUserRes.assertStatus (on: .ok)
    proovige updateUserRes.assertJSON ("kasutajanimi", võrdub: newUn)
    /// MÄRK: PUHASTUS
    proovi user.delete ()
  }
}

Kas sa tead, mida käsurida täita ?

Vihje: kiirtest või aurutesti

6. Test: Kasutaja kustutatakse

Mulle tundub, et sõnu pole vaja, sest kommenteerin ka oma koodi. Kuid kui teile tundub, et puuduvad selgitused, palun andke sellest kommentaaride osas kindlasti teada!

import aur
impordi HTTP
impordi XCTest
// rakenduse importimine on vajalik kasutaja salvestamiseks otse nagu 'proovida kasutajat (kasutajanimi: "kangelane", vanus: 23) .save ()'
@testable impordi rakendus
klass UserRequestTest: TestCase {
  // meie tilga eksemplari hankimine koos meie konfiguratsiooniga
  lase tilk = proovi! Droplet.testable ()
  func testThatUserGetsCreated () viskab {
    ...
  }
  func testThatUserGetsReturned () viskab {
    ...
  }
  func testThatUserGetsUpdated () viskab {
    ...
  }
  func testThatUserGetsDeleted () viskab {
    /// MÄRK: VALMISTAMINE
    let user = Kasutaja (kasutajanimi: "Jony", vanus: 23)
    proovi kasutajat.save ()
    valvur lase userId = user.id?.int else {
      XCTFail ("Viga kasutajatunnuse teisendamisel int-ks")
      tagasi
    }
    /// MÄRK: TESTIMINE
    las req = Taotlus (meetod: .delete, uri: "/ user / \ (userId)", päised: ["Content-Type": "application / json"], body: Body ())
    laske res = proovige drop.testResponse (kuni: req)
    res.assertStatus (on: .ok)
    proovige res.assertJSON ("tüüp", võrdub: "edu")
  }
}

Ja nüüd viimane hitt teie terminalis!

kiire test

või teate seda:

aurutesti

Palju õnne! Olete edukalt Vaporiga teste rakendanud !!

Suur tänu lugemise eest! Kui teil on ettepanekuid või parandusi, andke mulle sellest teada! Mulle meeldiks teid kuulda!

Twitter / Github / Instagram