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: