Įvadas į vieneto bandymą „Python“

Jūs ką tik baigėte rašyti kodo dalį ir galvojate, ką daryti. Ar pateiksite užklausą ir paprašysite komandos draugų peržiūrėti kodą? Arba rankiniu būdu išbandysite kodą?

Turėtumėte atlikti abu šiuos veiksmus, tačiau atlikdami papildomą veiksmą: turite išbandyti kodą, kad įsitikintumėte, jog kodas veikia taip, kaip numatyta.

Vieneto testai gali būti sėkmingi arba nesėkmingi, todėl tai yra puiki technika patikrinti jūsų kodą. Šioje pamokoje aš pademonstruosiu, kaip rašyti vieneto testus „Python“ ir pamatysite, kaip lengva juos įtraukti į savo projektą.

Darbo pradžia

Geriausias būdas suprasti testavimą yra tai, jei tai darote praktiškai. Tuo tikslu faile pavadinimu name_function.py parašysiu paprastą funkciją, kuri užims vardą ir pavardę ir grąžins visą vardą:

#Generate a formatted full name def formatted_name(first_name, last_name): full_name = first_name + ' ' + last_name return full_name.title()

Funkcija formatted_name () paima vardą ir pavardę ir sujungia juos su tarpu, kad būtų suformuotas visas vardas. Tada kiekvieno žodžio pirmoji raidė rašoma didžiąja raide. Norėdami patikrinti, ar šis kodas veikia, turite parašyti kodą, kuriame naudojama ši funkcija. Vietoje names.py parašysiu paprastą kodą, leidžiantį vartotojams įvesti vardą ir pavardę:

from name_function import formatted_name print("Please enter the first and last names or enter x to E[x]it.") while True: first_name = input("Please enter the first name: ") if first_name == "x": print("Good bye.") break last_name = input("Please enter the last name: ") if last_name == "x": print("Good bye.") break result = formatted_name(first_name, last_name) print("Formatted name is: " + result + ".")

Šis kodas importuoja formatuotą_pavadinimą () iš name_function.py ir paleidžiamas, leidžia vartotojui įvesti vardų ir pavardžių serijas ir rodo visus suformatuotus vardus.

Vieneto bandymas ir bandymo atvejai

Standartinėje „Python“ bibliotekoje yra modulis, vadinamas unittest, kuriame yra įrankiai jūsų kodui išbandyti. Įrenginio testavimas tikrina, ar visos konkrečios jūsų funkcijos dalys yra teisingos, o tai žymiai palengvins jų integravimą kartu su kitomis dalimis.

Bandomasis atvejis yra vienetinių bandymų rinkinys, kuris kartu įrodo, kad funkcija veikia taip, kaip numatyta, visose situacijose, kuriose ta funkcija gali atsidurti ir kurią tikimasi, kad ji veiks. Bandymo atveju turėtų būti atsižvelgiama į visas įmanomas įvesties rūšis, kurias funkcija gali gauti iš vartotojų, todėl turėtų apimti testus kiekvienai iš šių situacijų.

Išlaikyti testą

Štai tipinis testų rašymo scenarijus:

Pirmiausia turite sukurti bandomąjį failą. Tada importuokite unittest modulį, apibrėžkite testavimo klasę, kuri paveldima iš unittest.TestCase, ir galiausiai parašykite metodų seriją, kad patikrintumėte visus savo funkcijos elgesio atvejus.

Po šiuo kodu yra eilutės po eilutės paaiškinimas:

import unittest from name_function import formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): result = formatted_name("pete", "seeger") self.assertEqual(result, "Pete Seeger")

Pirmiausia turite importuoti „unittest“ ir norimą išbandyti funkciją „formatted_name“ (). Tada sukursite klasę, pvz., „NamesTestCase“, kurioje bus jūsų formatted_name () funkcijos testai. Ši klasė paveldima iš klasės unittest.TestCase.

„NamesTestCase“ yra vienas metodas, kuriuo išbandoma viena formato_pavadinimas () dalis. Šį metodą galite vadinti test_first_last_name ().

Atminkite, kad kiekvienas metodas, prasidedantis „test_“, bus paleistas automatiškai, kai paleidžiate test_name_function.py.

Taikydami bandymo metodą test_first_last_name (), iškviečiate funkciją, kurią norite išbandyti, ir išsaugote grąžinimo vertę. Šiame pavyzdyje mes iškviesime formatted_name () su argumentais „pete“ ir „seeger“ ir išsaugosime rezultatą gautame kintamajame.

Paskutinėje eilutėje naudosime teiginio metodą. Teigimo metodas patikrina, ar gautas rezultatas sutampa su rezultatu, kurį tikėjotės gauti. Ir šiuo atveju mes žinome, kad funkcija „formatted_name ()“ grąžins visą vardą didžiosiomis raidėmis, todėl tikimės rezultato „Pete Seeger“. Norėdami tai patikrinti, naudojamas „unittest“ metodas „assertEqual ()“.

self.assertEqual(result, “Pete Seeger”)

Ši eilutė iš esmės reiškia: Palyginkite gauto kintamojo vertę su „Pete Seeger“ ir jei jie yra lygūs, viskas gerai, bet jei manęs apie tai nepraneša.

Tikėtina, kad paleisdami test_name_function.py gausite gerai, o tai reiškia, kad testas išlaikytas.

Ran 1 test in 0.001s OK

Nepavyko atlikti bandymo

Norėdamas parodyti, kaip atrodo nesėkmingas testas, pakeisiu funkciją formatted_name () įtraukdamas naują vidurinio vardo argumentą.

Taigi aš perrašysiu funkciją taip, kad atrodytų taip:

#Generate a formatted full name including a middle name def formatted_name(first_name, last_name, middle_name): full_name = first_name + ' ' + middle_name + ' ' + last_name return full_name.title()

This version of formatted_name() will work for people with middle names, but when you test it you will see that the function is broken for people who don’t have a middle name.

So when you run the test_name_function.py you will get the output that looks something like this:

Error Traceback (most recent call last): File “test_name_function.py”, line 7, in test_first_last_name result = formatted_name(“pete”, “seeger”) TypeError: formatted_name() missing 1 required positional argument: ‘middle_name’ Ran 1 test in 0.002s FAILED (errors=1)

In the output you will see information that will tell you all you need to know where the test fails:

  • First item in the output is the Error telling you that at least one test in test case resulted in an error.
  • Next you’ll see the file and method in which the error occurred.
  • After that you will see the line in which the error occurred.
  • And what kind of error it is, in this case we are missing 1 argument “middle_name”.
  • Taip pat pamatysite bandymų skaičių, laiką, reikalingą bandymams užbaigti, ir tekstinį pranešimą, kuris nurodo testų būseną su įvykusių klaidų skaičiumi.

Ką daryti, kai bandymas nepavyko

Išlaikytas testas reiškia, kad funkcija elgiasi pagal tai, ko iš jos tikimasi. Tačiau nesėkmingas testas reiškia, kad jūsų laukia smagiau.

Mačiau keletą programuotojų, kurie nori pakeisti testą, o ne tobulinti kodą - bet to nepadarykite. Skirkite šiek tiek daugiau laiko problemai išspręsti, nes tai padės geriau suprasti kodą ir ilgainiui sutaupyti laiko.

In this example, our function formatted_name() first required two  parameters, and now as it is rewritten it requires one extra: a middle name. Adding a middle name to our function broke the desired behavior of  it. Since the idea is not to make changes to the tests, the best solution is to make middle name optional.

After we do this the idea is to make the tests pass when the first and last name are used, for example “Pete Seeger”, as well as when first, last and middle names are used, for example “Raymond Red Reddington”. So  let’s modify the code of formatted_name() once again:

#Generate a formatted full name including a middle name def formatted_name(first_name, last_name,): if len(middle_name) > 0: full_name = first_name + ' ' + middle_name + ' ' + last_name else: full_name = first_name + ' ' + last_name return full_name.title()

Now the function should work for names with and without the middle name.

And to make sure it still works with “Pete Seeger” run the test again:

Ran 1 test in 0.001s OK
Tai aš ketinau jums parodyti: visada geriau pakeisti kodą, kad jis atitiktų jūsų testus, nei kitaip. Atėjo laikas pridėti naują pavadinimų, kurie turi antrąjį vardą, testą.

Pridedami nauji testai

Parašykite naują metodą „NamesTestCase“ klasei, kuris patikrins vidurinius vardus:

import unittest from name_function import formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): result = formatted_name("pete", "seeger") self.assertEqual(result, "Pete Seeger") def test_first_last_middle_name(self): result = formatted_name("raymond", "reddington", "red") self.assertEqual(result, "Raymond Red Reddington")

Kai atliksite testą, abu testai turėtų būti išlaikyti:

Ran 2 tests in 0.001s OK
Liemenėlės gjortas!

Šauniai padirbėta!

Jūs parašėte testus, norėdami patikrinti, ar funkcija veikia naudojant pavadinimus su viduriniu vardu arba be jo. Sekite 2 dalį, kur aš pakalbėsiu daugiau apie bandymą „Python“.

Ačiū, kad skaitėte! Peržiūrėkite daugiau panašių straipsnių mano „freeCodeCamp“ profilyje: //www.freecodecamp.org/news/author/goran/ ir kitų įdomių dalykų, kuriuos kuriu savo „GitHub“ puslapyje: //github.com/GoranAviani