Hvordan kan jeg enheten test utholdenhet?

stemmer
44

Som en nybegynner i å praktisere testdrevet utvikling, ender jeg ofte opp i et dilemma om hvordan man skal enheten test utholdenhet til en database.

Jeg vet at teknisk dette ville være en integrasjonstest (ikke en enhet test), men jeg ønsker å finne ut de beste strategiene for følgende:

  1. Testing spørringer.
  2. Testing innsatser. Hvordan vet jeg at innsatsen som har gått galt hvis det mislykkes? Jeg kan teste det ved å sette inn, og deretter spørre, men hvordan kan jeg vite at søket var ikke galt?
  3. Testing oppdateringer og sletter - samme som testinnlegg

Hva er den beste praksis for å gjøre disse?


Angående testing SQL: Jeg er klar over at dette kunne gjøres, men hvis jeg bruker en O / R Mapper som NHibernate, det legger noen navne vorter i aliasene brukes til utgangs spørsmål, og som det er litt uforutsigbar jeg er ikke sikker jeg kunne teste for det.

Skal jeg bare, forlate alt og bare stole NHibernate? Jeg er ikke sikker på det er forsvarlig.

Publisert på 05/08/2008 klokken 09:43
kilden bruker
På andre språk...                            


10 svar

stemmer
16

Se inn DB Unit. Det er et Java-bibliotek, men det må være en C # tilsvarende. Den lar deg forberede databasen med et sett av data, slik at du vet hva som er i databasen, så kan du grensesnitt med DB Unit for å se hva som er i databasen. Den kan kjøre mot mange databasesystemer, slik at du kan bruke din faktiske database oppsett, eller bruke noe annet, som HSQL i Java (Java database gjennomføring med et minne alternativ).

Hvis du vil teste denne koden din bruker databasen riktig (som du mest sannsynlig skal gjøre), så dette er veien å gå for å isolere hver test og sikre databasen har ventet data utarbeidet.

Svarte 11/08/2008 kl. 09:40
kilden bruker

stemmer
15

Som Mike Stone sagt , er DbUnit stor for å få databasen til en kjent tilstand før du kjører testene. Når testene er fullført, kan DbUnit sette databasen tilbake til den tilstanden den var i før du kjørte testene.

DbUnit (Java)

DbUnit.NET

Svarte 25/08/2008 kl. 13:22
kilden bruker

stemmer
4

Du gjør enhetstesting av tentamen ut databasetilkoblingen. På denne måten kan du bygge scenarier der spesifikke spørsmål i flyten av et metodekall lykkes eller mislykkes. Jeg pleier å bygge min mock forventninger, slik at den faktiske spørringen teksten blir ignorert, fordi jeg virkelig ønsker å teste feiltoleranse av metoden og hvordan den håndterer selv - detaljene i SQL er irrelevant for dette formål.

Selvfølgelig dette betyr at testen vil faktisk ikke bekrefte at metoden fungerer , fordi SQL kan være galt. Det er der integrasjonstester sparke i. For at jeg forventer at noen andre vil ha en mer grundig svar, som jeg bare begynner å få tak i de selv.

Svarte 05/08/2008 kl. 09:47
kilden bruker

stemmer
3

Jeg har skrevet et innlegg her om enhetstesting datalaget som dekker akkurat dette problemet. Unnskyldninger for (skammelig) plugg, men artikkelen er for lang til å poste her.

Jeg håper det hjelper deg - det har fungert veldig bra for meg i løpet av de siste 6 månedene på 3 aktive prosjekter.

hilsen,

Rob G

Svarte 12/08/2008 kl. 23:23
kilden bruker

stemmer
2

For JDBC baserte prosjekter, kan Acolyte rammeverket brukes: http://acolyte.eu.org . Det gjør det mulig å mockup datatilgang du vil tester, drar nytte av JDBC abstraksjon, uten å måtte håndtere en spesifikk test DB.

Svarte 09/07/2014 kl. 09:20
kilden bruker

stemmer
2

For NHibernate, jeg vil definitivt argumentere bare tentamen ut NHibernate APIfor enhet tester - stol på biblioteket for å gjøre det rette. Hvis du ønsker å sikre at data faktisk går til DB, gjør en integrasjonstest.

Svarte 05/08/2008 kl. 11:20
kilden bruker

stemmer
2

Problemet jeg opplevde da enhetstesting utholdenhet, spesielt uten en ORM og dermed tentamen databasen (tilkobling), er at du ikke vet om dine spørsmål lykkes. Det kan være at du på dine spørsmål er spesielt designet for en bestemt database versjon og bare lykkes med den versjonen. Du vil aldri finne det ut hvis du spotte databasen. Så etter min mening, er enhetstesting utholdenhet bare begrenset bruk. Du bør alltid legge tester som kjører mot målrettet database.

Svarte 05/08/2008 kl. 10:29
kilden bruker

stemmer
1

Jeg pleier å lage et depot og bruke den til å redde min enhet, deretter hente en ny en. Deretter hevder jeg at hentet er lik de frelste.

Svarte 27/08/2008 kl. 21:17
kilden bruker

stemmer
1

Teknisk enhet tester av utholdenhet er ikke Unit tester de er integrasjonstester.

Med C # med mbUnit, du bare bruke SqlRestoreInfo og tilbakeføring attributter

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

Det samme kan gjøres i NUnit, excpet attributtnavnene skiller slighty.

Som for å sjekke om søket var succeful, normalt må du følge den med en annen spørring for å se om databasen er endret slik du forventer.

Svarte 05/08/2008 kl. 11:27
kilden bruker

stemmer
1

Jeg vil også spotte databasen, og kontroller at søkene er som forventet. Det er risiko for at testen sjekker feil sql, men dette ville bli oppdaget i integrasjonstester

Svarte 05/08/2008 kl. 10:19
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more