PyUnit handledning: Python Enhetstestningsramverk (med exempel)

⚡ Smart sammanfattning

Python Enhetstestning kontrollerar små enheter i din kod isolerat för att upptäcka buggar tidigt. Här lär du dig tekniker för enhetstestning, PyUnit-ramverket (unittest), dess nyckelklasser, hur man utformar ett testfall och ett fungerande exempel.

  • 🧪 Vad det är: Enhetstestning verifierar små, isolerade kodenheter för att upptäcka buggar tidigt.
  • 🔬 Tekniker: TDD, stubs och mock-kod isolerar kod så att enheterna testas oberoende av varandra.
  • 🐍 PyUnit: Pythons inbyggda unittest-modul (PyUnit) är en port av JUnit.
  • 🧱 Viktiga klasser: TestCase, TestSuite, TestLoader, TextTestRunner och TestResults.
  • 🤖 AI-hjälp: AI-verktyg som Copilot genererar enhetstestfall direkt.

Python Enhetstestning

Vad är enhetstestning?

Enhetstestning in Python görs för att identifiera buggar tidigt i utvecklingsstadiet av applikationen när buggar är mindre återkommande och billigare att åtgärda.

Ett enhetstest är ett skriptkodnivåtest designat i Python för att verifiera en liten "enhet" av funktionalitet. Unit test är ett objektorienterat ramverk baserat på testfixturer.

Python Enhetstestningstekniker

Python Enhetstestning innebär huvudsakligen att man testar en viss modul utan att komma åt någon beroende kod. Utvecklare kan använda tekniker som stubbar och hånar för att separera kod i "enheter" och köra enhetsnivåtestning på de enskilda bitarna.

  • Testdriven utveckling TDD: Enhetstestning bör göras tillsammans med Python, och för det använder utvecklarna testdriven utvecklingsmetod. I TDD-metoden designar du först Python Enhetstester och först då fortsätter du att skriva koden som kommer att implementera denna funktion.
  • Stubbar och hånar: De är två huvudtekniker som simulerar falska metoder som testas. A Stump används för att fylla i ett visst beroende som krävs för att enhetstestet ska fungera korrekt. A Falsk å andra sidan är ett falskt föremål som kör testerna där vi sätter påstå.

    Intentionerna med båda metoderna är desamma för att eliminera testning av alla beroenden för en klass eller funktion.

Python Enhetstestramverk

För att göra Unit Testing-processen enklare och förbättra kvaliteten på ditt projekt, rekommenderas det Python Enhetstestramverk. Enhetstestningsramverket inkluderar

Python Enhetstestningstekniker

  • PyUnit: PyUnit stöder fixturer, testfall, testsviter och en testlöpare för automatiserad testning av koden. I PyUnit kan du organisera testfall i sviter med samma fixturer
  • Näsa: Nose's inbyggda plugin-program hjälper dig med output capture, kodtäckning, doctests, etc. Nose syntax är ganska enklare och minskar hindren för att skriva tester. Den sträcker sig Python unittest för att göra testningen enklare.
  • Doktest: Doctest testskript går i docstring med liten funktion längst ner i filen. Doctest låter dig testa din kod genom att köra exempel som ingår i dokumentationen och verifiera att de gav de förväntade resultaten. Användningsfallet för doctest är mindre detaljerat och fångar inga speciella fall. De är användbara som en uttrycksfull dokumentation av det huvudsakliga användningsfallet för en modul och dess komponenter.

Enhetstestning med PyUnit

Pyunit är en Python hamn av JUnit. Som en del av Pyunit finns det fem nyckelklasser i unittest-modulen.

Enhetstestning med PyUnit

  • TestCase-klass: TestCase-klassen bär testrutinerna och levererar krokar för att göra varje rutin och städa upp därefter
  • TestSuite klass: Den fungerar som en insamlingsbehållare, och den kan ha flera testcaseobjekt och flera testsuites-objekt
  • TestLoader klass: Den här klassen laddar testfall och sviter definierade lokalt eller från en extern fil. Den sänder ut en testsuite-objekt som har dessa sviter och fall
  • TextTestRunner klass: För att köra testerna tillgodoser den en standardplattform för att utföra testerna
  • Klassen Testresultat: Den erbjuder en standardbehållare för testresultaten

Designa ett testfall för Python Testa med PyUnit

Ett enhetstest tillhandahåller en basklass, testfall, som kan användas för att skapa nya testfall. För att utforma testfallet finns det tre uppsättningar av metoder som används

Designa ett testfall för Python

unittest.TestCase

setUp()
teardown()

skipTest(aMesg:string)
fail(aMesg:string)

id():string
shortDescription():string

I det första setet finns för- och eftertestkrokarna. Metoden setup() börjar före varje testrutin, teardown() efter rutinen.

Den andra uppsättningen av metoder styr testexekveringen. Båda metoderna tar en meddelandesträng som indata, och båda avbryter ett pågående test. Men skiptest()-metoden avbryter det aktuella testet medan fail()-metoden misslyckas helt.

Den sista eller tredje metoden hjälper till att bestämma testet. Metoden id() returnerar en sträng som består av namnet på testcaseobjektet och testrutinen. Och metoden kortDescription() returnerar docstr-kommentaren vid initieringen av varje testrutin.

Python Exempel på enhetstest

Exemplet nedan testar en enkel add()-funktion med modulen unittest. Varje metod som namnges med ett test_-prefix körs automatiskt och assertEqual kontrollerar resultatet mot det förväntade värdet.

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_positive(self):
        self.assertEqual(add(2, 3), 5)

    def test_add_negative(self):
        self.assertEqual(add(-1, -1), -2)

if __name__ == "__main__":
    unittest.main()

Spara koden och kör den med python filename.py. Unittest-köraren rapporterar hur många tester som klarades eller misslyckades.

Fördelar med att använda Python Enhetstestning

  • Det hjälper dig att upptäcka buggar tidigt i utvecklingscykeln
  • Det hjälper dig att skriva bättre program
  • Det synkroniseras enkelt med andra testmetoder och verktyg
  • Det kommer att ha många färre buggar
  • Det är lättare att modifiera i framtiden med mycket mindre konsekvens

Vanliga frågor

Enhetstestning verifierar en liten kodenhet, som en funktion, isolerat. Den upptäcker buggar tidigt i utvecklingen, när de är billigare och enklare att åtgärda.

PyEnhet är Pythons inbyggda ramverk för enhetstestning, tillgängligt som unittest-modulen. Det är en portering av JUnit och stöder fixturer, testfall, sviter och en testkörare.

Underklassen unittest.TestCase, skriv metoder som börjar med test_ och använd påståenden som assertEqual inuti dem. Kör filen med unittest.main() för att köra alla tester.

setUp() körs före varje testmetod för att förbereda fixturer, medan tearDown() körs efter varje test för att rensa upp. Tillsammans håller de tester oberoende och repeterbara.

Stubbar tillhandahåller fasta data som ett test är beroende av, medan mockar är falska objekt som man kan hävda något mot. Båda ersätter verkliga beroenden så en enhet testas isolerat.

AI-assistenter som GitHub Copilot genererar enhetstestfall från en funktion, föreslår edge-fall och assertioner och skapar mock-test för beroenden medan du skriver kod.

Ja. AI-drivna verktyg kan automatisera generering av testsviter, producera assertioner för förväntade utdata och öka kodtäckningen genom att föreslå tester för otestade grenar.

enhetstest är Pythons inbyggda ramverk som använder klasser och assert-metoder, medan pytest är ett tredjepartsbibliotek med enklare assert-satser och kraftfulla fixturer. Båda kör enhetstester.

Sammanfatta detta inlägg med: