Test Metrics.

Python Code Coverage

Python on yksi suosituimmista ohjelmointikielistä tällä hetkellä. Yleiskäyttöisyytensä vuoksi Pythonilla on sovelluksia erilaisissa ohjelmistokehityksen käyttötapauksissa yksinkertaisista skripteistä verkkopalvelimiin ja Djangon kaltaisiin kehyksiin.

Mutta kuten muillakin ohjelmointikielillä, testaaminen on edelleen yksi tärkeimmistä ohjelmistokehityksen osa-alueista Pythonilla.

Tässä postauksessa näemme muutamia työkaluja, joilla voi mitata ja kirjoittaa testitapausten kattavuutta Python-koodille.

Unittest

Pythonin standardikirjastoon on valmiiksi rakennettu moduuli nimeltä unittest. JUnitin ja muiden tärkeimpien ohjelmointikielten yksikkötestauskehysten innoittamana unittest on testauskehys, jonka avulla voit automatisoida testejä, asettaa jaetun asennus- ja sammutuskoodin testejä varten ja paljon muuta.

Yksi unittestin tärkeistä ominaisuuksista on testikiinnitys eli yhden tai useamman testin suorittamiseen tarvittavat asetukset ja niihin liittyvät siivoustoimet. Tekstikiinnityksen avulla toiminnot, kuten väliaikaisten tai välitietokantojen ja hakemistojen luominen tai palvelinprosessin käynnistäminen, voidaan hoitaa yhdessä paikassa.

Katsotaanpa muutamia esimerkkitestitapauksia ja katsotaan, miten ne toteutetaan unittestin avulla:

import unittest

class TestStringMethods(unittest.TestCase):

def test_upper(self):
self.assertEqual(’foo’.upper(), ’FOO’)

def test_isupper(self):
self.assertTrue(’FOO’.isupper())
self.assertFalse(’Foo’.isupper())

def test_split(self):
s = ’hello world’
self.assertEqual(s.split(), )
# tarkista, että s.split epäonnistuu, kun erotin ei ole merkkijono
with self.assertRaises(TypeError):
s.split(2)

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

Luo testitapaus alaluokittelemalla unittest.TestCase. Sitten voit määritellä yksittäisiä testejä metodeilla. Huomaa, että testitapausten nimien tulee alkaa sanalla test. Tämä nimeämiskäytäntö kertoo testin suorittajalle, mitkä metodit edustavat testejä.

Testin suorittaja on komponentti, joka orkestroi testien suorittamisen ja tarjoaa tuloksen käyttäjälle. Sen toteutus vaihtelee ja se voi käyttää graafista käyttöliittymää, tekstimuotoista käyttöliittymää tai palauttaa erikoisarvon, joka ilmaisee testien suorittamisen tulokset.

Pytest

Pytest on kolmannen osapuolen Python-testauskehys. Sen tarkoituksena on tarjota kehys testien tehokkaaseen kirjoittamiseen poistamalla kaikki testien luomiseen liittyvät yleiskustannukset. Pytestiä tukevat Python 2.7, 3.4, 3.5, 3.6, Jython, PyPy-2.3 Unix/Posixilla ja Windowsilla.

Katsotaanpa, miten Pytestin kanssa pääsee alkuun.Lataa ensin uusin versio ja asenna se pipin avulla:

pip install -U pytest

Voit tarkistaa asennetun version seuraavasti:

pytest -version

Nyt otetaan esimerkkifunktio ja siihen liittyvä testitapaus.

# content of test_sample.py
def func(x):
return x + 1def test_answer():
assert func(3) == 5

Funktio func ottaa syötteen x ja palauttaa arvon x + 1. Testitapauksessa vakuutetaan, jos funktio func ottaa syötteen 3 ja palauttaa 5. Tämän testitapauksen odotetaan epäonnistuvan. Testin suorittamiseksi kirjoitetaan yksinkertaisesti pytest hakemistoon, jossa on tiedosto test_sample.py.

$ pytest
=========================== testisessio käynnistyy ============================
alusta linux – Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
juurihakemisto: $REGENDOC_TMPDIR, inifile:
kokoontui:
kerättiin: 1 kpl:n itemtest_sample.py F ================================= FAILURES =================================
_______________________________ test_answer ________________________________

def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)

testi_esimerkki.py:5: AssertionError
========================= 1 failed in 0.12 seconds =========================

Coverage.py

Coverage.py on yksi suosituimmista koodin kattavuuden työkaluista Pythonille. Se käyttää kattavuuden mittaamiseen Pythonin standardikirjastossa olevia koodianalyysityökaluja ja jäljityskoukkuja. Se toimii CPythonin, PyPyn, Jythonin ja IronPythonin pääversioissa. Voit käyttää Coverage.py:tä sekä unittestin että Pytestin kanssa.

Voit joko ladata Coveragen uusimman version ja asentaa sen manuaalisesti tai asentaa sen pipillä as:

$ pip install coverage

Jatka nyt ohjelmasi Coveragella as

$ coverage run my_program.py arg1 arg2

Seuraavaksi saat kattavuusdataa suorittamalla

$ coverage report -m

Tässä on esimerkki kattavuusdatan tulosteesta

$ coverage report -m
Name Stmts Miss Kattavuus Puuttuu Puuttuu
——————-
my_program.py 20 4 80% 33-35, 39
my_other_module.py 56 6 89% 17-23
——————-
TOTAL 76 10 87%

Generoi raportti html-tiedostona:

$ coverage html

Tässä on esimerkki HTML-raportista, jollaisen Coverage.py tuottaa. Se sisältää Module, statements, missing, excluded, branches, partial ja coverage.

Pytest-cov

Pytest-cov on Python-lisäosa kattavuusraporttien tuottamiseen. Coverage-komennon tukemien toiminnallisuuksien lisäksi se tukee myös keskitettyä ja hajautettua testausta. Se tukee myös aliprosessien kattavuutta.

Kun olet kirjoittanut testitapaukset Pytestin vaatimalla tavalla, voit käyttää Pytest-covia kaikkien testien ajamiseen ja kattavuusraporttien laatimiseen.

Aloittaaksesi asenna Pytest-cov seuraavasti:

$ pip install pytest-cov

Keskitetty testaus

Keskitetty testaus raportoi pääprosessin ja sen kaikkien aliprosessien yhteenlasketun kattavuuden. Voit suorittaa keskitettyä testausta käyttämällä,

$ py.test -cov= tests/

Hajautettu testaus

Asenna Pytest-xdist, hajautetun järjestelmän tukea varten:

$ pip install pytest-xdist

Hajautettua testausta voidaan tehdä kahdessa tilassa, dist asetettuna kuormitukseen ja jokaiselle. Kun asetus on load, kaikkien orjien yhteenlaskettu kattavuus raportoidaan hajautetun testauksen aikana. Orjat voivat olla hajautettu mille tahansa määrälle isäntiä, ja jokainen orja voi sijaita missä tahansa tiedostojärjestelmässä. Jokaisen orjan aliprosessit mitataan.

Jokaista hajautettua testausta varten pytest-cov raportoi kummassakin tilassa myös kaikkien orjien yhteenlasketun kattavuuden. Koska jokainen orja suorittaa kaikki testit, tämä mahdollistaa yhdistetyn kattavuusraportin tuottamisen useista ympäristöistä

Yhteenveto

Tässä postauksessa tutustuimme erilaisiin Python-yksikkötestauksen ja koodin kattavuuden kehyksiin. Vaikka nämä kehykset tekevät testausprosessista helppoa, sinun on silti kirjoitettava testit. Seuraavassa on muutamia parhaita käytäntöjä, jotka kannattaa ottaa huomioon yksikkötestejä kirjoittaessa.

  • Käytä pitkiä, kuvaavia nimiä. Näin vältytään usein oppien tarpeelta testimenetelmissä.
  • Testien tulisi olla eristettyjä. Älä ole vuorovaikutuksessa oikean tietokannan tai verkon kanssa. Käytä erillistä testitietokantaa, joka puretaan tai käyttää mock-objekteja.
  • Keskity yhteen pieneen pätkään toiminnallisuutta.
  • Testien pitäisi olla nopeita, mutta hidas testi on parempi kuin ei testiä.
  • Usein on järkevää, että on yksi testitapausluokka yhdelle luokalle tai mallille.

Vastaa

Sähköpostiosoitettasi ei julkaista.