RESTful API:n testaaminen on tärkeä osa ohjelmistokehityksen prosessia, ja se varmistaa, että sovelluksesi toimii odotetulla tavalla. FastAPI tarjoaa erinomaisia työkaluja testaukseen, kuten TestClient-luokan, jonka avulla voidaan testata API:n loppupisteitä ilman, että palvelinta tarvitsee käynnistää. Tässä osassa käymme läpi, kuinka määritellä testit ja testausympäristö Pytestillä, ja kuinka käyttää FastAPI:n tarjoamia testausominaisuuksia.
Testauksen valmistelu alkaa luomalla conftest.py-moduuli, jossa määritellään testitietokanta ja testitehtävien tiedot. Määrittelemme ensin testitiedoston nimen ja luettelon testitehtävistä:
Tässä esimerkissä testitehtäville määritellään ID, otsikko, kuvaus ja tila. Näistä tiedoista luodaan sitten Pythonin listasta sanakirjoja, joissa tehtävien ID:t muutetaan kokonaisluvuiksi:
Tämän jälkeen voimme määritellä pytest-fixturen, joka valmistaa testitietokannan ennen jokaista testin suorittamista:
Tämä fixture-testi luo tiedoston ja kirjoittaa siihen testitehtävät ennen jokaista testiajoa. patch-komento huolehtii siitä, että oikea tietokantatiedosto käytetään testauksen aikana. Testin suorittamisen jälkeen tiedosto poistetaan automaattisesti.
Kun fixtuuri on määritelty, kaikki testit moduulissa voivat hyödyntää tätä järjestelyä ilman erillistä määrittelyä. Testit kirjoitetaan seuraavaksi käyttäen FastAPI:n TestClient-luokkaa, joka mahdollistaa API-loppupisteiden testaamisen ilman palvelimen käynnistämistä.
Ensimmäinen testattava päätepiste on GET /tasks, joka palauttaa kaikki tietokannan tehtävät:
Tässä testissä varmistetaan, että API palauttaa kaikki tehtävät ja että HTTP-vastauskoodi on 200. Testissä tarkistetaan myös, että palautettu JSON vastaa määriteltyjä testitehtäviä.
Toinen testattava päätepiste on GET /tasks/{task_id}, joka palauttaa yksittäisen tehtävän ID:n perusteella:
Tässä testissä tarkistetaan, että olemassa oleva tehtävä palauttaa oikeat tiedot ja että ei-olemassa oleva tehtävä palauttaa virhekoodin 404.
Seuraavaksi testataan POST /task, joka lisää uuden tehtävän tietokantaan:
Testissä varmistetaan, että uusi tehtävä lisätään oikein tietokantaan ja että sen ID määritellään oikein.
Seuraavaksi testataan PUT /tasks/{task_id}, joka muokkaa olemassa olevaa tehtävää:
Tässä testissä tarkistetaan, että tehtävän tila päivittyy oikein ja että virheellinen tehtävän ID palauttaa virhekoodin 404.
Viimeinen testattava päätepiste on DELETE /tasks/{task_id}, joka poistaa tehtävän tietokannasta:
Tässä testissä tarkistetaan, että poistettu tehtävä ei ole enää tietokannassa.
Kun kaikki testit on kirjoitettu, voidaan ne suorittaa Pytestillä:
Jos kaikki testit menevät läpi, konsolissa näkyy viesti, joka ilmoittaa täydellisesti suoritettuista testeistä.
API:n testaamisen lisäksi on tärkeää huomioida myös monimutkaisempien kyselyiden ja suodattamisen käsittely. RESTful API:n perustoiminnallisuus sisältää usein mahdollisuuden suodattaa dataa eri kriteerien mukaan. Esimerkiksi, voimme lisätä GET /tasks-päätepisteeseen suodattimia, jotka mahdollistavat tehtävien hakemisen tietyillä kriteereillä, kuten tehtävän tilalla tai otsikolla:
Lisäksi voidaan lisätä hakutoiminto, joka mahdollistaa tehtävien etsimisen tietyllä hakusanalla otsikosta tai kuvauksesta:
Tämä mahdollistaa käyttäjien etsiä tehtäviä, joissa hakusana esiintyy joko otsikossa tai kuvauksessa. Näin voidaan tehdä API:sta entistä joustavampi ja käyttäjäystävällisempi.
Miten testata ja debugata FastAPI-sovelluksia tehokkaasti?
FastAPI-sovellusten testaaminen ja debuggaaminen vaativat huolellista ympäristön valmistelua sekä testausprosessin systemaattista rakentamista. Aloittamalla yksinkertaisella sovelluksella, esimerkiksi GET-pyynnöllä reitille /home, voidaan rakentaa testit, jotka varmistavat, että sovellus vastaa oikein ja vakaasti. Projektin rakenne on tärkeää järjestää siten, että testikoodit ja konfiguraatiot on eritelty omiin kansioihinsa, kuten tests-kansioon, ja projektin juureen sijoitetaan pytest.ini-tiedosto, joka ohjaa pytestin toimintaa, muun muassa lisäämällä oikeat polut PYTHONPATHiin testien ajon yhteydessä.
Testikoodissa käytetään asynkronisia testejä hyödyntäen FastAPI:n ja httpx-kirjaston mahdollistamia työkaluja. Esimerkiksi AsyncClient yhdistettynä ASGITransport-kuljetukseen antaa mahdollisuuden testata FastAPI-sovellusta täysin asynkronisesti, mikä vastaa tuotantoympäristön toimintaa. Tällainen lähestymistapa varmistaa, että endpointit vastaavat odotetusti ja palauttavat oikeat statuskoodit ja vastaukset. Testien kerääminen komennolla pytest --collect-only auttaa varmistamaan, että testit löytyvät oikein.
Toisessa vaiheessa voidaan käyttää FastAPI:n omaa TestClient-luokkaa yksikkötestien kirjoittamiseen, joka on synkroninen ja siten usein yksinkertaisempi ja nopeampi kirjoittaa kuin asynkroninen versio. TestClient mahdollistaa HTTP-pyyntöjen simuloinnin suoraan sovellukselle, mikä tekee yksikkötestien kirjoittamisesta helppoa ja suoraviivaista. Yhteisten testikomponenttien, kuten testiclientin, jakaminen useiden testien kesken voidaan järjestää conftest.py-tiedoston avulla, joka on pytestin konventio testitiedostojen yhteisille fikstuureille.
Integraatiotestauksessa tarkastellaan sovelluksen eri komponenttien yhteistoimintaa. Erityisesti, kun sovellus käyttää ulkoisia palveluita tai tietokantoja, integraatiotestit ovat olennaisia. Esimerkiksi SQL-tietokantaan lisättävien ja sieltä luettavien tietueiden testaaminen varmistaa, että sovelluksen tietokantakerros toimii odotetusti. Tietokantayhteyden asettaminen sisältää ORM:n (Object Relational Mapper) konfiguroinnin, kuten SQLAlchemy:n Base-luokan määrittelyn, taulujen mallintamisen luokiksi ja moottorin (engine) luomisen, joka huolehtii yhteyksistä tietokantaan. Lisäksi on tärkeää konfiguroida sessioita hallitseva SessionLocal-luokka, joka mahdollistaa turvallisen ja hallitun istunnon avaamisen ja sulkemisen testien aikana.
Endpointtien kirjoittaminen, jotka käyttävät tietokantayhteyttä, tulee yhdistää testausprosessiin. Tällöin testit eivät pelkästään varmista, että endpoint palauttaa odotetun vastauksen, vaan myös että tiedot tallentuvat ja haetaan oikein tietokannasta. Testien ajaminen pytestillä paljastaa virheet nopeasti ja mahdollistaa kehitystyön sujuvan etenemisen.
Testausympäristön huolellinen rakentaminen, testausfiksuurien käyttö ja erilaisten testausmenetelmien hyödyntäminen parantavat sovelluksen laatua ja ylläpidettävyyttä merkittävästi. On huomioitava, että testaus ei ole vain virheiden löytämistä, vaan myös dokumentointia ja varmuuden luomista sovelluksen toimintakyvystä muutoksista huolimatta.
On tärkeää ymmärtää, että testausprosessin aikana testejä tulee pitää yllä ja päivittää sovelluksen kehittyessä. Lisäksi integraatiotestit vaativat usein erillisen testitietokannan tai transaktioiden hallinnan, jotta testien ajaminen ei vaikuta tuotantotietokantaan. Hyvä testauskäytäntö sisältää myös virheiden ja poikkeusten testaamisen, suorituskyvyn arvioinnin sekä jatkuvan integraation (CI) osana kehitysputkea. Näin varmistetaan, että sovellus kestää käyttökuormaa ja reagoi virhetilanteisiin hallitusti.
Miten luoda ja käyttää FastAPI-reitittimiä ja päätepisteitä?
FastAPI:n käyttöönotto tuo eteen monia etuja, kuten nopean kehityksen ja automaattisen dokumentaation. Yksi sen tärkeimmistä ominaisuuksista on kyky organisoida koodia reitittimien ja päätepisteiden avulla. Tämä lähestymistapa tekee koodista selkeämpää ja helpommin ylläpidettävää. Päätepisteet, jotka määrittelevät, miten HTTP-pyynnöt käsitellään, ovat keskeinen osa FastAPI-sovellusten rakennetta. Tässä käsitellään, miten päätepisteitä ja reitittimiä voi luoda ja käyttää FastAPI:ssa, sekä miten ne tekevät sovelluksesta tehokkaan ja modulaarisen.
Päätepisteet, eli endpointit, määrittävät sovelluksen vuorovaikutuksen paikat. Esimerkiksi GET-pyyntöä varten määritellään tietty URL-osoite, joka käynnistää määritellyn funktion. Esimerkki seuraavassa koodissa luo yksinkertaisen päätepisteen, joka vastaa GET-pyyntöihin juuriosoitteessa:
Tässä esimerkissä @app.get("/") määrittelee päätepisteen, joka vastaa GET-pyyntöihin "/"-osoitteessa. Tämä on yksinkertainen tapa luoda ensimmäinen API-päätepiste, joka palauttaa JSON-vastauksen.
Reitittimet: modulaarisuus ja ylläpidettävyys
Kun sovelluksessa on useita päätepisteitä, jotka sijaitsevat eri tiedostoissa, on suositeltavaa käyttää reitittimiä. Reitittimet mahdollistavat päätepisteiden ryhmittelyn eri moduuleihin, mikä parantaa koodin luettavuutta ja ylläpidettävyyttä. Tämä on erityisen hyödyllistä suurissa sovelluksissa, joissa on monia API-toimintoja. Esimerkiksi voimme luoda yhden reitittimen käyttäjien käsittelemiseen ja toisen reitittimen tuotteiden käsittelemiseen.
Reitittimen luominen tapahtuu seuraavasti. Ensiksi luodaan uusi tiedosto (esim. router_example.py), joka sisältää reitittimen määrittelyn:
Tässä esimerkissä reititin käsittelee GET-pyyntöjä, jotka liittyvät tuotteiden ID:hin. Tämä reititin voidaan liittää pääsovellukseen seuraavasti:
Reitittimen käyttö yksinkertaistaa koodin hallintaa ja antaa mahdollisuuden jakaa sovelluksen eri osat erillisiin tiedostoihin, mikä tekee kehityksestä entistä joustavampaa.
Uvicorn: palvelimen käynnistäminen
Kun sovellus on kirjoitettu, se täytyy käynnistää. FastAPI-sovelluksen käynnistämiseksi käytetään Uvicorn-palvelinta, joka on erittäin nopea ASGI-palvelin. Voit käynnistää palvelimen seuraavasti:
--reload-valitsin mahdollistaa palvelimen automaattisen uudelleenkäynnistyksen, kun koodia muutetaan, mikä on kätevää kehitysvaiheessa. Kun palvelin on käynnissä, voit tarkastella sovelluksen API:ta osoitteessa http://127.0.0.1:8000.
Automaattinen dokumentaatio: Swagger UI ja Redoc
Yksi FastAPI:n huippuominaisuuksista on sen kyky luoda automaattista dokumentaatiota. FastAPI luo automaattisesti kaksi dokumentaatiotyökalua, jotka helpottavat API:n testaamista ja tutkimista. Näitä ovat Swagger UI ja Redoc. Molemmat ovat interaktiivisia käyttöliittymiä, joiden avulla voit testata API-päätepisteitä suoraan selaimessa.
Swagger UI:n käyttö on erityisen hyödyllistä, sillä sen avulla voit suoraan kokeilla luotuja päätepisteitä. Jos haluat kokeilla päätepistettä "/books/{book_id}", mene vain osoitteeseen http://127.0.0.1:8000/docs ja käytä käyttöliittymää testauksessa.
Postman: vaihtoehto Swagger UI:lle
Vaikka Swagger UI on helppokäyttöinen ja kätevä, monimutkaisemmissa testauksissa voi olla tarpeen käyttää toista työkalua, kuten Postmania. Postman on API-asiakas, joka tarjoaa laajat mahdollisuudet API-pyyntöjen rakentamiseen, testaamiseen ja dokumentointiin. Se on erityisen hyödyllinen monimutkaisissa testeissä ja suurissa projekteissa, joissa on useita päätepisteitä. Voit ladata Postmanin Postmanin viralliselta verkkosivustolta ja kokeilla sitä API-pyyntöjen tekemiseen FastAPI-sovellukseen.
Polku- ja kyselyparametrit
API-kehityksessä on tärkeää ymmärtää parametrien käsittely. Parametrit tekevät API:sta dynaamisemman ja joustavamman, sillä ne mahdollistavat käyttäjien syötteen vastaanottamisen ja käsittelemisen. FastAPI tukee monenlaisia parametreja, kuten polkuparametreja ja kyselyparametreja. Polkuparametrit ovat URL-osoitteen osia, jotka voivat muuttua pyyntöjen mukaan. Esimerkiksi "/books/{book_id}"-päätepisteessä {book_id} on polkuparametri.
Tässä esimerkissä luodaan API-päätepiste, joka hakee kirjan tiedot sen ID:n perusteella:
Tässä käytetään polkuparametria book_id, joka on määritetty URL-osoitteessa. FastAPI hoitaa automaattisesti sen, että tämä parametri välitetään oikeassa muodossa funktioon. Jos käyttäjä syöttää ei-numeron, FastAPI antaa virheilmoituksen.
On myös tärkeää huomioida, että FastAPI tarjoaa automaattisen validoinnin tyypintarkistuksen avulla, joka takaa, että API:lle lähetetyt tiedot ovat oikeassa muodossa ja sääntöjen mukaisia.
Tärkeitä lisähuomioita
FastAPI:n avulla API-päätepisteet voidaan määritellä nopeasti ja tehokkaasti, mutta myös niiden testaaminen ja dokumentointi on olennaista sovelluksen kehitykselle. Automaattinen dokumentaatio, kuten Swagger UI ja Redoc, auttaa kehittäjää nopeasti tutustumaan luotuihin päätepisteisiin ja varmistamaan, että ne toimivat oikein. Käyttäjän ja kehittäjän välinen vuorovaikutus helpottuu, kun parametreja voidaan käyttää dynaamisesti, ja FastAPI tarjoaa välineet virheiden käsittelyyn ja tyypintarkistukseen, jotka parantavat sovelluksen luotettavuutta.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский