PyUnit Tutorial: Python Enhedstestramme (med eksempel)

โšก Smart opsummering

Python Enhedstestning kontrollerer smรฅ enheder af din kode isoleret for at opdage fejl tidligt. Her lรฆrer du enhedstestningsteknikker, PyUnit (unittest) frameworket, dets nรธgleklasser, hvordan man designer en testcase og et fungerende eksempel.

  • ๐Ÿงช Hvad er det: Enhedstestning verificerer smรฅ, isolerede kodeenheder for at opdage fejl tidligt.
  • ๐Ÿ”ฌ Teknikker: TDD, stubs og mock-koder isolerer kode, sรฅ enhederne tester uafhรฆngigt.
  • ๐Ÿ PyUnit: Pythons indbyggede unittest-modul (PyUnit) er en port af JUnit.
  • ๐Ÿงฑ Nรธgleklasser: TestCase, TestSuite, TestLoader, TextTestRunner og TestResults.
  • ๐Ÿค– AI-hjรฆlp: AI-vรฆrktรธjer som Copilot genererer unittest-testcases รธjeblikkeligt.

Python Enhedstest

Hvad er enhedstestning?

Enhedstest in Python er gjort for at identificere fejl tidligt i udviklingsstadiet af applikationen, nรฅr fejl er mindre tilbagevendende og billigere at rette.

En enhedstest er en scriptet kodeniveautest designet i Python at verificere en lille "enhed" af funktionalitet. Unit test er en objektorienteret ramme baseret pรฅ testarmaturer.

Python Enhedstestteknikker

Python Unit Testing involverer hovedsageligt at teste et bestemt modul uden at fรฅ adgang til nogen afhรฆngig kode. Udviklere kan bruge teknikker som stubs og mocks til at adskille kode i "enheder" og kรธre test pรฅ enhedsniveau pรฅ de individuelle stykker.

  • Testdrevet udvikling TDD: Enhedstest skal udfรธres sammen med Python, og til det bruger udviklere Test-Driven Development-metoden. I TDD-metoden designer du fรธrst Python Enhedstest, og fรธrst derefter fortsรฆtter du med at skrive koden, der implementerer denne funktion.
  • Stubbe og hรฅner: Det er to hovedteknikker, der simulerer falske metoder, der bliver testet. EN Stub bruges til at udfylde en vis afhรฆngighed, der krรฆves for at enhedstesten kan kรธre korrekt. EN Mock pรฅ den anden side er en falsk genstand, som kรธrer de test, hvor vi sรฆtter assert.

    Intentionerne med begge metoder er de samme for at eliminere test af alle afhรฆngigheder af en klasse eller funktion.

Python Enhedstestramme

For at gรธre Unit Testing-processen lettere og forbedre kvaliteten af โ€‹โ€‹dit projekt, anbefales det Python Enhedstestramme. Enhedstestningsrammen omfatter

Python Enhedstestteknikker

  • PyUnit: PyUnit understรธtter inventar, testcases, testsuiter og en testlรธber til automatiseret test af koden. I PyUnit kan du organisere testcases i suiter med det samme inventar
  • Nรฆse: Nose's indbyggede plug-ins hjรฆlper dig med output capture, kodedรฆkning, doctests osv. Nose syntaks er ret enklere og reducerer barriererne for at skrive test. Det strรฆkker sig Python unittest for at gรธre test nemmere.
  • Doktest: Doctest test script gรฅr i docstring med lille funktion i bunden af โ€‹โ€‹filen. Doctest giver dig mulighed for at teste din kode ved at kรธre eksempler inkluderet i dokumentationen og verificere, at de returnerede de forventede resultater. Use-casen af โ€‹โ€‹doctest er mindre detaljeret og fanger ikke sรฆrlige tilfรฆlde. De er nyttige som en udtryksfuld dokumentation af hovedanvendelsen af โ€‹โ€‹et modul og dets komponenter.

Enhedstest med PyUnit

Pyunit er en Python havn af JUnit. Som en del af Pyunit er der i unittest-modulet fem nรธgleklasser.

Enhedstest med PyUnit

  • TestCase klasse: TestCase-klassen bรฆrer testrutinerne og leverer kroge til at lave hver rutine og derefter rydde op
  • TestSuite klasse: Den henvender sig som en indsamlingsbeholder, og den kan have flere testcase-objekter og flere testsuite-objekter
  • TestLoader klasse: Denne klasse indlรฆser testcases og suiter defineret lokalt eller fra en ekstern fil. Det udsender en testsuite-objekter, der besidder disse suiter og sager
  • TextTestRunner klasse: For at kรธre testene henvender den sig til en standardplatform til at udfรธre testene
  • Klassen Testresultater: Den tilbyder en standardbeholder til testresultaterne

Design af en testcase til Python Test med PyUnit

En enhedstest giver en basisklasse, testcase, som kan bruges til at oprette nye testcases. Til design af testcasen er der tre sรฆt metoder, der anvendes

Design af en testcase til Python

unittest.TestCase

setUp()
teardown()

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

id():string
shortDescription():string

I det fรธrste sรฆt er pre og post test krogene. Setup()-metoden begynder fรธr hver testrutine, teardown() efter rutinen.

Det andet sรฆt metode kontrollerer testudfรธrelsen. Begge metoder tager en meddelelsesstreng som input, og begge annullerer en igangvรฆrende test. Men skiptest()-metoden afbryder den aktuelle test, mens fail()-metoden fejler den fuldstรฆndigt.

Den sidste eller tredje metode hjรฆlper med at bestemme testen. Metoden id() returnerer en streng bestรฅende af navnet pรฅ testcase-objektet og af testrutinen. Og metoden kortDescription() returnerer docstr-kommentaren ved initieringen af โ€‹โ€‹hver testrutine.

Python Eksempel pรฅ enhedstest

Eksemplet nedenfor tester en simpel add()-funktion med unittest-modulet. Hver metode navngivet med et test_-prรฆfiks kรธrer automatisk, og assertEqual kontrollerer resultatet mod den forventede vรฆrdi.

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()

Gem koden og kรธr den med python filename.py. Unittest-runneren rapporterer, hvor mange tests der bestod eller mislykkedes.

Fordele ved at bruge Python Enhedstest

  • Det hjรฆlper dig med at opdage fejl tidligt i udviklingscyklussen
  • Det hjรฆlper dig med at skrive bedre programmer
  • Det synkroniserer nemt med andre testmetoder og vรฆrktรธjer
  • Det vil have mange fรฆrre fejl
  • Det er lettere at รฆndre i fremtiden med meget mindre konsekvens

Ofte Stillede Spรธrgsmรฅl

Enhedstestning verificerer en lille kodeenhed, som en funktion, isoleret. Den fanger fejl tidligt i udviklingen, nรฅr de er billigere og nemmere at rette.

PyUnit er Python's indbyggede enhedstestningsramme, tilgรฆngelig som unittest-modulet. Det er en portering af JUnit og understรธtter fixtures, testcases, suites og en testrunner.

Underklassen unittest.TestCase, skriv metoder der starter med test_, og brug assertions som assertEqual i dem. Kรธr filen med unittest.main() for at udfรธre alle tests.

setUp() kรธrer fรธr hver testmetode for at forberede fixtures, mens tearDown() kรธrer efter hver test for at rydde op. Sammen holder de testene uafhรฆngige og gentagelige.

Stubs leverer faste data, som en test afhรฆnger af, mens mock-objekter er falske objekter, man kan pรฅstรฅ sig afhรฆngige af. Begge erstatter reelle afhรฆngigheder, sรฅ en enhed testes isoleret.

AI-assistenter som GitHub Copilot genererer unittest-testcases fra en funktion, foreslรฅr edge-cases og assertions og opretter mocks til afhรฆngigheder, mens du skriver kode.

Ja. AI-drevne vรฆrktรธjer kan automatisere generering af testpakker, producere assertions for forventede output og รธge kodedรฆkningen ved at foreslรฅ tests til utestede grene.

enhedstest er Python's indbyggede framework, der bruger klasser og assert-metoder, mens pytest er et tredjepartsbibliotek med enklere assert-sรฆtninger og kraftfulde fixtures. Begge kรธrer enhedstests.

Opsummer dette indlรฆg med: