Det korte svar er at Læs The Fine Manual-indgang om databasetest i PHPUnit-manualen .
Og nu det lange svar ...
Den første ting at huske om enhedstestning er, at den skal udføres isoleret fra alle andre komponenter. Ofte forenkles dette mål ved hjælp af IoC-teknikker (inversion of control) såsom afhængighedsinjektion . Når dine klasser eksplicit beder om deres afhængigheder i konstruktørmetoderne, er det en simpel operation at hån disse afhængigheder, så du kan teste den resterende kode isoleret.
At teste kode, der interagerer med modeller, er dog lidt anderledes. Normalt er det ikke praktisk eller tilrådeligt at injicere dine modeller i den klasse, hvor du skal have adgang til dem. Dine modeller er generelt "dum" datastrukturer, der afslører begrænsede eller ingen muligheder. Som følge heraf er det generelt acceptabelt (med hensyn til testbarhed) at instantiere dine modeller på farten i dine ellers injicerede klasser. Desværre gør dette test af databasekode vanskelig, fordi, som PHPUnit-dokumentationen bemærker:
Så hvordan isolerer og tester man kode, der interagerer med databasen, hvis modellerne ikke er direkte injiceret? Den nemmeste måde at gøre dette på er at bruge testarmaturer .
Da du helt sikkert allerede bruger PDO
eller et ORM-bibliotek, der bygger på PDO
(ikke?), at opsætte armaturerne er så simpelt som at se en grundlæggende SQLite-database eller XML-fil med data for at imødekomme dine testcases og bruge den specielle databaseforbindelse, når du tester koden, der interagerer med databasen. Du kan angive denne forbindelse i din PHPUnit bootstrap-fil, men det er nok mere semantisk passende at opsætte en PHPUnit Database TestCase
.
De generelt accepterede bedste praksis-trin til test af DB-kode (disse er også gentaget i PHPUnit-dokumentationen om DB-test):
- Konfigurer armaturet
- Træningssystem under test
- Bekræft resultatet
- Teardown
Så for at opsummere, alt hvad du skal gøre er at oprette en "dummy" database-armatur og få din kode til at interagere med de kendte data i stedet for en faktisk database, du ville bruge i produktionen. Denne metode giver dig mulighed for med succes at isolere koden under test, fordi den omhandler kendte data, og det betyder, at du kan komme med specifikke/testbare påstande om resultaterne af dine databaseoperationer.
OPDATERING
Bare fordi det er en usædvanlig nyttig guide til hvad ikke at gøre i din kode, hvis du vil fremme testbarhed, tilføjer jeg et link til Misko Heverys Sådan skriver man 3v1L, utestbar kode . Det er ikke involveret med databasetest i særdeleshed, men det er alligevel nyttigt. God test!
OPDATERING 2
Jeg ville svare på kommentaren om at udsætte modeltestning, fordi den eksisterende kodebase ikke implementerer PDO
til databaseadgang:
Dine modeller behøver ikke bruge PDO for at implementere PHPUnits DbUnit-udvidelse.
Det vil gøre dit liv en smule lettere, hvis du bruger PDO, men du er ikke forpligtet til at gøre det. Lad os f.eks. sige, at du har bygget din applikation med PHPs indbyggede pg_*
PostgreSQL-funktioner. PHPUnit giver dig stadig mulighed for at specificere fixtures, og det kan stadig genopbygge dem for hver test -- du skal blot pege din forbindelse, når du udfører test til den samme ressource, som DbUnit-udvidelsen bruger til sin fixtur.