Opetusohjelma: kuinka kirjoittaa testejä Vapor 2: lla

Tässä opetusohjelmassa esittelen sinulle kuinka testata reittejä aiemmin kirjoittamasi CRUD-oppaan tuloksen perusteella. Jos haluat tehdä CRUD-oppaan ensin ja palata myöhemmin takaisin, löydät sen täältä. Jos haluat ohittaa CRUD-oppaan, voit kloonata tuloksen tähän ja aloittaa rightaway !

Löydät tämän testi-opetusohjelman tuloksen githubista: täältä.

1. Hankkeen rakenne

Sinulla pitäisi olla tällainen projektirakenne:

koe-esimerkki /
├── Paketti
├── Lähteet /
│ ├── Sovellus /
│ │ ├── Config + Setup.swift
│ │ ple Pisara + Setup.swift
│ │ ├── Routes.swift
│ │ └── mallit /
│ │ └── User.swift
│ └── Suorita /
├── Testit /
│ └── AppTests /
│ ├── UserRequestTest.swift
│ └── Utilities.swift
├── Määritä /
├── Julkinen /
├── Riippuvuudet /
└── Tuotteet /

Jos olet kloonannut repon crud-opetusohjelmasta, sinulla on jo tiedosto UserRequestTest.swift, tässä tapauksessa poista kaikki sen sisällä oleva koodi.

Jos loit crud-projektin seuraamalla crud-opetusohjelmaa, sinulla on seuraava projektirakenne:

koe-esimerkki /
├── Paketti
├── Lähteet /
│ ├── Sovellus /
│ │ ├── Config + Setup.swift
│ │ ple Pisara + Setup.swift
│ │ ├── Routes.swift
│ │ └── mallit /
│ │ └── User.swift
│ └── Suorita /
├── Testit /
│ └── AppTests /
│ ├── PostControllerTests.swift
│ ├── RouteTests.swift
│ └── Utilities.swift
├── Määritä /
├── Julkinen /
├── Riippuvuudet /
└── Tuotteet /

Poista tässä tapauksessa (siirrä roskakoriin)
• PostControllerTests.swift
• RouteTests.swift
ja luo tyhjä tiedosto nimeltä
• UserRequestTest.swift

koe-esimerkki /
├── Paketti
├── Lähteet /
│ ├── Sovellus /
│ │ ├── Config + Setup.swift
│ │ ple Pisara + Setup.swift
│ │ ├── Routes.swift
│ │ └── mallit /
│ │ └── User.swift
│ └── Suorita /
├── Testit /
│ └── AppTests /
│ ├── PostControllerTests.swift <- POISTA
│ ├── RouteTests.swift <- POISTA
│ ├── UserRequestTest.swift <- Luo
│ └── Utilities.swift
├── Määritä /
├── Julkinen /
├── Riippuvuudet /
└── Tuotteet /

2. Testi: Käyttäjä luodaan

Sisätestit / AppTestit / UserRequestTest.swift kirjoita:

tuo höyry
Tuo HTTP
tuo XCTest
// Tuo sovellus tarvitaan käyttäjän tallentamiseksi suoraan kuten 'kokeile käyttäjää (käyttäjänimi: "sankari", ikä: 23) .save ()'
@testable import App
luokka UserRequestTest: TestCase {
  // saamme esimerkki pudotuksestamme kokoonpanomme kanssa
  anna pudota = yrittää! Droplet.testable ()
  func testThatUserGetsCreated () heittää {
    /// MARK: VALMISTELU
    anna un = "Tim", ikä = 21
    anna käyttäjä = Käyttäjä (käyttäjänimi: un, ikä: ikä)
  
    anna json = kokeile user.makeJSON ()
    anna reqBody = kokeile vartaloa (json)
    /// MARK: TESTAUS
    olkoon req = Pyyntö (menetelmä: .post, uri: "/ käyttäjä", otsikot: ["Content-Type": "application / json"], runko: reqBody)
    anna res = kokeile drop.testResponse (kohteeseen: req)
    // vastaus on 200
    res.assertStatus (on: .ok)
    // testivastaus on json
    vartija anna resJson = res.json else {
      XCTFail ("Virhe haettaessa jsonia res: \ (res)")
      palata
    }
    kokeile res.assertJSON ("id", läpäisee: {jsonVal in jsonVal.int! = nolla})
    kokeile res.assertJSON ("käyttäjänimi", vastaa: un)
    kokeile res.assertJSON ("ikä", vastaa: ikä)
    /// MERKKI: PUHDISTUS
    vartija anna userId = resJson ["id"] ?. int, anna userToDelete = kokeile User.find (userId) else {
      XCTFail ("Virhe ei onnistunut muuntamaan tunnusta int: ään TAI ei löytänyt käyttäjätunnusta käyttäjää vastauksesta: \ (res)")
      palata
    }
    kokeile userToDelete.delete ()
  }
}

Annan selittää lyhyesti (kommenttien lisäksi) mitä yllä oleva koodi tekee. Olen kehittänyt henkilökohtaisen mallin, jolla rakennan testitoimintoja:

func testThatUserGetsCreated () heittää {
  /// MARK: VALMISTELU
  Tämä merkitsee sen alueen alkua, jolla valmistelen kaikki tarvitsemani tiedot testaamiseksi
  /// MARK: TESTAUS
  Tämä merkitsee alueen alkua, jolla itse testin
  /// MERKKI: PUHDISTUS
  Tämä merkitsee sen alueen alkua, jolla siivoan lopulta luodut tiedot testauksen jälkeen
}

Haluamme testata, luoko reitti / käyttäjä, kun potkut POST-pyynnöllä, lähettämällä kelvollinen JSON, todella käyttäjä.

TOIMIA:
Löysin nimetä toiminnon sen jälkeen, kun ne tekevät erittäin hyödyllistä ja ilmaista, minkä vuoksi kutsumme sitä testiThatUserGetsCreated ().

PREPARING:
Tällä alueella luomme kaksi muuttujaa un (käyttäjänimi) ja ikä (tarkoittaa ikää ). Alustamme käyttäjämme näillä muuttujilla ja teemme hänestä JSON-objektin. Alustamme rungon JSON-Objectilla ja se on se.

TESTAUS:
Luomme pyyntöobjektin, joka kulkee reitille tarvittavan http-menetelmän, URL-osoitteen, otsikon ja rungon. Kun käynnistät kokeilun drop.testResponse (to: req), pyyntömme suoritetaan ja tallennamme tuloksen muuttujaan res.
Nyt voimme testata, sisältääkö vastaus sen, mitä määrittelimme reitillä palautettavaksi käyttäjän onnistuneen luomisen jälkeen.

Määrittelimme, että reitti palauttaa luodun käyttäjän nimellä JSON.

Joten tarkistamme vartijalla, onko vastauksessa json. Jos ei, tiedämme, että jokin meni pieleen, heittäen XCTFail-tiedoston. Sitten tarkistetaan, onko JSON-arvo avaintunnuksessa tyyppi int. Myös jos JSON-arvo avaimen käyttäjänimessä on yhtä suuri kuin muuttujamme ja jos JSON-arvo avainikässä on yhtä suuri kuin ikämuuttujamme. Jos kaikki kulkee, mahtava, puhdistetaan!

SIIVOTA:
Koska käyttäjän luominen onnistui, meillä on merkintä tietokantaamme. Mielestäni testien pitäisi jättää paikkoja paremmin kuin he löysivät ne them
Joten muuntamme JSON-arvon avaintunnuksessa int: ksi ja yritämme löytää käyttäjän, jolla on tunnus. Jos meillä on käyttäjä, suoritamme vain delete () hänelle ja olemme valmiita

3. Suorita ensimmäinen testi

Testin suorittamiseen on useita tapoja ja ne ovat kaikki hienoja. Tässä opetusohjelmassa käytämme höyrytyökalupakkia. Suorita päätelaitteesi projektihakemistossa:

höyrytesti

Se näyttää viileän pallon edestakaisin eteneen muutamassa sekunnissa ja sitten testi läpäisee! Whoop Whoop!

Vihje: Jos haluat selkeämmän lähdön, mene ja suorita sen sijaan: nopea testi

4. Testi: Käyttäjä luetaan

Tämä toiminto on pienempi ja koska tiedät mitä tarkoittaa, mikä tässä on koodi

tuo höyry
Tuo HTTP
tuo XCTest
// Tuo sovellus tarvitaan käyttäjän tallentamiseksi suoraan kuten 'kokeile käyttäjää (käyttäjänimi: "sankari", ikä: 23) .save ()'
@testable import App
luokka UserRequestTest: TestCase {
  // saamme esimerkki pudotuksestamme kokoonpanomme kanssa
  anna pudota = yrittää! Droplet.testable ()
  func testThatUserGetsCreated () heittää {
    ...
  }
  func testThatUserGetsReturned () heittää {
    /// MARK: VALMISTELU
    anna un = "Elon", ikä = 31
    anna käyttäjä = Käyttäjä (käyttäjänimi: un, ikä: ikä)
    // käyttäjän luominen manuaalisesti, koska haluamme testata saadaksemme hänet
    kokeile user.save ()
    vartija anna userId = user.id?.int else {
      XCTFail ("Virhe käyttäjän tunnuksen muuntamisessa int: ksi")
      palata
    }
    /// MARK: TESTAUS
    olkoon req = Pyyntö (menetelmä: .get, uri: "/ user / \ (userId)")
    anna res = kokeile drop.testResponse (kohteeseen: req)
    res.assertStatus (on: .ok)
    kokeile res.assertJSON ("käyttäjänimi", vastaa: un)
    /// MERKKI: PUHDISTUS
    kokeile user.delete ()
  }
}

Voit taas mennä eteenpäin:

höyrytesti

Tai mitä haluan, koska näet kaikki toiminnot, jotka suoritetaan testien suorittamisen yhteydessä:

nopea testi

5. Testi: Käyttäjä päivitetään

Talk on halpaa. Näytä koodi.

tuo höyry
Tuo HTTP
tuo XCTest
// Tuo sovellus tarvitaan käyttäjän tallentamiseksi suoraan kuten 'kokeile käyttäjää (käyttäjänimi: "sankari", ikä: 23) .save ()'
@testable import App
luokka UserRequestTest: TestCase {
  // saamme esimerkki pudotuksestamme kokoonpanomme kanssa
  anna pudota = yrittää! Droplet.testable ()
  func testThatUserGetsCreated () heittää {
    ...
  }
  func testThatUserGetsReturned () heittää {
    ...
  }
  func testThatUserGetsUpdated () heittää {
    /// MARK: VALMISTELU
    anna un = "Steve", ikä = 37
    anna käyttäjä = Käyttäjä (käyttäjänimi: un, ikä: ikä)
    kokeile user.save ()
    /// MARK: TESTAUS
    vartija anna userId = user.id?.int else {
      XCTFail ("Virhe käyttäjän tunnuksen muuntamisessa int: ksi")
      palata
    }
    // muuttaa tietoja
    anna newUn = "Craig"
    user.username = newUn
    anna json = kokeile user.makeJSON ()
    anna reqBody = kokeile vartaloa (json)
    // testikäyttäjä päivitetään
    anna updateUserReq = Pyyntö (menetelmä: .put, uri: "/ user / \ (userId)", otsikot: ["Content-Type": "application / json"], runko: reqBody)
    anna updateUserRes = kokeilla drop.testResponse (kohteeseen: updateUserReq)
    updateUserRes.assertStatus (on: .ok)
    kokeile updateUserRes.assertJSON ("käyttäjänimi", vastaa: newUn)
    /// MERKKI: PUHDISTUS
    kokeile user.delete ()
  }
}

Tiedätkö mitä suorittaa komentorivillä ?

Vihje: nopea testi tai höyrytesti

6. Testi: Käyttäjä poistetaan

Minusta tuntuu, ettei sanoja tarvita, koska kommentoin myös koodini. Mutta jos sinusta tuntuu, että selityksiä puuttuu, kerro siitä ehdottomasti kommenttiosassa!

tuo höyry
Tuo HTTP
tuo XCTest
// Tuo sovellus tarvitaan käyttäjän tallentamiseksi suoraan kuten 'kokeile käyttäjää (käyttäjänimi: "sankari", ikä: 23) .save ()'
@testable import App
luokka UserRequestTest: TestCase {
  // saamme esimerkki pudotuksestamme kokoonpanomme kanssa
  anna pudota = yrittää! Droplet.testable ()
  func testThatUserGetsCreated () heittää {
    ...
  }
  func testThatUserGetsReturned () heittää {
    ...
  }
  func testThatUserGetsUpdated () heittää {
    ...
  }
  func testThatUserGetsDeleted () heittää {
    /// MARK: VALMISTELU
    anna käyttäjä = Käyttäjä (käyttäjänimi: "Jony", ikä: 23)
    kokeile user.save ()
    vartija anna userId = user.id?.int else {
      XCTFail ("Virhe käyttäjän tunnuksen muuntamisessa int: ksi")
      palata
    }
    /// MARK: TESTAUS
    olkoon req = Request (menetelmä:. poista, uri: "/ user / \ (userId)", otsikot: ["Content-Type": "application / json"], runko: Body ())
    anna res = kokeile drop.testResponse (kohteeseen: req)
    res.assertStatus (on: .ok)
    kokeile res.assertJSON ("tyyppi", vastaa: "menestys")
  }
}

Ja nyt viimeinen osuma terminaalissasi!

nopea testi

tai tiedät sen:

höyrytesti

Onnittelut! Olet onnistuneesti suorittanut testit Vaporilla !!

Kiitos paljon lukemisesta! Jos sinulla on ehdotuksia tai parannuksia, ota meihin yhteyttä! Haluaisin kuulla sinusta!

Twitter / Github / Instagram