Johdanto yksikkötestaukseen Pythonissa

Olet juuri kirjoittanut koodinpätkän ja mietit mitä tehdä. Lähetätkö vetopyynnön ja pyydätkö joukkuetovereitasi tarkistamaan koodin? Vai testaatko koodin manuaalisesti?

Sinun tulisi tehdä nämä molemmat asiat, mutta lisätoiminnolla: sinun on testattava koodi yksitellen varmistaaksesi, että koodi toimii tarkoitetulla tavalla.

Yksikkötestit voivat läpäistä tai epäonnistua, ja se tekee niistä loistavan tekniikan koodisi tarkistamiseen. Tässä opetusohjelmassa esittelen kuinka testata yksiköt Pythonissa ja näet kuinka helppoa on saada ne käyntiin omassa projektissasi.

Päästä alkuun

Paras tapa ymmärtää testausta on, jos teet sen käytännössä. Tätä tarkoitusta varten kirjoitan tiedostoon name_function.py yksinkertaisen funktion, joka ottaa etu- ja sukunimen ja palauttaa koko nimen:

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

Funktio formatted_name () ottaa etu- ja sukunimen ja yhdistää ne välilyönnillä muodostaakseen koko nimen. Sitten se kirjoittaa isoilla kirjaimilla jokaisen sanan. Jos haluat tarkistaa, että tämä koodi toimii, sinun on kirjoitettava koodi, joka käyttää tätä toimintoa. Kirjoitan kansioon names.py yksinkertaisen koodin, jonka avulla käyttäjät voivat kirjoittaa etu- ja sukunimensä:

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 + ".")

Tämä koodi tuo muotoiltu_nimi () name_function.py: stä ja käynnissä, antaa käyttäjän antaa sarjan etu- ja sukunimiä ja näyttää alustetut täydelliset nimet.

Yksikkötesti ja testitapaukset

Pythonin tavallisessa kirjastossa on unittest-moduuli, joka sisältää työkaluja koodisi testaamiseen. Yksikkötestaus tarkistaa, ovatko toiminnon kaikki tietyt osat oikein, mikä helpottaa niiden integrointia muiden osien kanssa.

Testitapaus on kokoelma yksikkötestejä, jotka yhdessä osoittavat, että toiminto toimii tarkoitetulla tavalla useissa tilanteissa, joissa toiminto voi joutua ja että sen odotetaan käsittelevän. Testitapauksessa tulisi ottaa huomioon kaikki mahdolliset syötteet, jotka toiminto voisi saada käyttäjiltä, ​​ja siksi sen tulisi sisältää testit edustamaan kaikkia näitä tilanteita.

Kokeen läpäiseminen

Tässä on tyypillinen skenaario testien kirjoittamiseen:

Ensin sinun on luotava testitiedosto. Tuo sitten unittest-moduuli, määritä testiluokka, joka periytyy unittest.TestCase-ohjelmasta, ja viimeiseksi, kirjoita sarja menetelmiä testataksesi kaikki toiminnon käyttäytymisen tapaukset.

Seuraavan koodin alla on rivi riviltä:

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

Ensin sinun on tuotava unittest ja testattava toiminto formated_name (). Sitten luot luokan, esimerkiksi NamesTestCase, joka sisältää testit muotoiltu_nimi () -funktiolle. Tämä luokka perii luokan unittest.TestCase.

NamesTestCase sisältää yhden menetelmän, joka testaa yhden osan muodosta_nimi (). Voit kutsua tätä menetelmää test_first_last_name ().

Muista, että jokainen menetelmä, joka alkaa "test_", suoritetaan automaattisesti, kun suoritat test_name_function.py.

Testimenetelmässä test_ensimmäinen_nimi () kutsutaan testattavaksi funktioksi ja tallennetaan palautusarvo. Tässä esimerkissä kutsutaan muotoiltu_nimi () argumenteilla "pete" ja "seeger" ja tallennetaan tulos tuloksena olevaan muuttujaan.

Viimeisellä rivillä käytämme assert-menetelmää. Vahvistusmenetelmä varmistaa, että saamasi tulos vastaa odotettua tulosta. Ja tässä tapauksessa tiedämme, että muotoiltu_nimi () -funktio palauttaa koko nimen isoilla kirjaimilla, joten odotamme tuloksen "Pete Seeger". Tämän tarkistamiseksi käytetään unittestin assertEqual () -menetelmää.

self.assertEqual(result, “Pete Seeger”)

Tämä rivi tarkoittaa pohjimmiltaan: Vertaa tuloksena olevan muuttujan arvoa “Pete Seeger” -arvoon ja jos ne ovat yhtä suuret, se on OK, mutta jos niitä ei ilmoiteta minulle.

Suoritettaessa test_name_function.py oletetaan saavan OK, mikä tarkoittaa, että testi on läpäissyt.

Ran 1 test in 0.001s OK

Testin epäonnistuminen

Osoittaakseni, miltä epäonnistunut testi näyttää, muokkaan funktiota formatted_name () sisällyttämällä uuden keskimmäisen nimen argumentin.

Joten aion kirjoittaa funktion uudestaan:

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

Tämä muotoiltu_nimi () toimii ihmisillä, joilla on keskinimi, mutta kun testaat sitä, huomaat, että toiminto on rikki ihmisille, joilla ei ole keskimmäistä nimeä.

Joten kun suoritat test_name_function.py, saat tuotoksen, joka näyttää tältä:

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)

Lähdössä näet tietoja, jotka kertovat sinulle kaiken mitä sinun tarvitsee tietää missä testi epäonnistuu:

  • Tuloksen ensimmäinen kohde on virhe, joka kertoo sinulle, että ainakin yksi testi testitapauksessa johti virheeseen.
  • Seuraavaksi näet tiedoston ja menetelmän, jossa virhe tapahtui.
  • Sen jälkeen näet rivin, jossa virhe tapahtui.
  • Ja millainen virhe se on, tässä tapauksessa puuttuu yksi argumentti “middle_name”.
  • Näet myös ajotestien määrän, testien suorittamiseen tarvittavan ajan ja tekstiviestin, joka edustaa testien tilaa ja esiintyvien virheiden määrää.

Mitä tehdä, kun testi on epäonnistunut

Hyväksytty testi tarkoittaa, että toiminto toimii sen perusteella, mitä siitä odotetaan. Epäonnistunut testi tarkoittaa kuitenkin, että sinua on hauskempaa.

Olen nähnyt pari ohjelmoijaa, jotka haluavat vaihtaa testiä koodin parantamisen sijaan - mutta älä tee sitä. Vietä hieman enemmän aikaa ongelman korjaamiseen, koska se auttaa sinua ymmärtämään koodia paremmin ja säästämään aikaa pitkällä aikavälillä.

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
Ja tämän halusin näyttää sinulle: On aina parempi tehdä koodiin muutoksia testiesi mukaiseksi kuin toisinpäin. Nyt on tullut aika lisätä uusi testi nimille, joilla on keskimmäinen nimi.

Uusien testien lisääminen

Kirjoita uusi menetelmä NamesTestCase-luokkaan, joka testaa keskimmäisiä nimiä:

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

Testin suorittamisen jälkeen molempien testien on läpäistävä:

Ran 2 tests in 0.001s OK
Rintaliivit gjort!

Hyvin tehty!

Olet kirjoittanut testisi tarkistaaksesi, toimiiko toiminto nimillä, joissa on keskimmäinen nimi tai ei. Pysy kuulolla osaan 2, jossa puhun lisää testauksesta Pythonissa.

Kiitos, että luit! Katso lisää tällaisia ​​artikkeleita freeCodeCamp -profiililtani: //www.freecodecamp.org/news/author/goran/ ja muita hauskoja juttuja, jotka rakennan GitHub-sivullesi: //github.com/GoranAviani