Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Praksa dobre integracije

Rad sa virtuelnim okruženjima

Preporučujemo upotrebu virtualenv okruženja, kao i upotrebu easy_install (ili pip) za instalaciju zavisnosti vaših aplikacija, kao i samog pytest paketa. Na taj način ćete dobiti mnogo reproduktivnije okruženje. Dobra alatka koja će vam pomoći da automatizujete testove prema višestrukoj konfiguraciji zavisnosti ili Python interpretatoru jeste tox.

Koristite tox i servere kontinuirane integracije

Ako često objavljujete kod u javnost možda ćete želeti da pogledate tox, alatku za virtualenv test automatizaciju i njenu pytest podršku. Osnovna ideja je da se generiše JUnitXML fajl kroz --junitxml=PATH opciju i da se dobije server kontinuirane integracije kao što Jenkins to uzima i generiše izveštaje.

Kreirajte py.test samostalni skript

Ako ste održavalac ili programer aplikacija i ako želite da drugi mogu lako da sprovode testove, možete generisati potpuno samostalni “py.test” skript:

py.test --genscript=runtests.py

generiše runtests.py skript koji je potpuno funkcionalan osnovni py.test skript i koji nepromenjeno radi u programima Python2 i Python3. Možete reći ljudima da preuzmu skript i zatim da ga, na primer, pokrenu ovako:

python runtests.py

Integracija uz distutils / python setup.py test

Možete integrisati test rad u vaše projekte bazirane na distutils-u ili alatkama za podešavanje. Koristite genscript metod za generisanje samostalnog py.test skripta:

py.test --genscript=runtests.py

i učinite ovaj skript delom vaše distribucije, a zatim ga dodajte vašem setup.py fajlu:

from distutils.core import setup, Command
# you can also import from setuptools

class PyTest(Command):
    user_options = []
    def initialize_options(self):
        pass
    def finalize_options(self):
        pass
    def run(self):
        import sys,subprocess
        errno = subprocess.call([sys.executable, 'runtests.py'])
        raise SystemExit(errno)
setup(
    #...,
    cmdclass = {'test': PyTest},
    #...,
)

Аko sada otkucate:

python setup.py test

to će izvršiti vaše testove pomoću runtests.py. S obzirom da je to samostalna verzija py.test nije potrebna nikakva prethodna instalacija za pozivanje test komande. Takođe možete preneti dodatne argumente na pozive pod-procesa kao što su test direktorijum ili druge opcije.

Integracija sa setuptools/distribute test komandama

Distribute/Setuptools podržava zahteve testa, što znači da je veoma lako proširiti njegove test komande za podršku rada pytest-a iz zahteva testa:

from setuptools.command.test import test as TestCommand
import sys

class PyTest(TestCommand):
    def finalize_options(self):
        TestCommand.finalize_options(self)
        self.test_args = []
        self.test_suite = True
    def run_tests(self):
        #import here, cause outside the eggs aren't loaded
        import pytest
        errno = pytest.main(self.test_args)
        sys.exit(errno)

setup(
    #...,
    tests_require=['pytest'],
    cmdclass = {'test': PyTest},
    )

Sada, ako pokrenete:

python setup.py test

to će preuzeti py.test ako je potrebno i zatim pokrenuti py.test kao što biste to i očekivali.

Sporazumi za Python test otkriće

py.test realizuje sledeća standardna test otkrića:

  • zbirka počinje od početnih argumenata komandne linije, što mogu biti direktorijumi, imena fajlova ili test id-i.
  • uključivanje povezanih linkova i informacija (rekurzija) u direktorijume, osim ako se ne podudaraju sa norecursedirs
  • test_*.py ili *_test.py fajlovi, koje uvodi ime njihovih paketa.
  • Test prefiksovani test razredi (bez __init__ metoda)
  • test_ prefiksovane test funkcije ili metodi jesu test stavke

Za primere kako prilagoditi vaša test otkrića Izmena standarnog (Python) test otkrića.

U okviru Python modula, py.test takođe otkriva testove koristeći standardnu unittest.TestCase tehniku nasleđivanja.

Izbor prikaza testa / pravila uvoza

py.test podržava uobičajene test prikaze:

  • umetanje test direktorijuma u vaš paket aplikacije, što je korisno ako želite da zadržite (jedinice) testove i stvarno testirani kod blisko povezane:

    mypkg/
        __init__.py
        appmodule.py
        ...
        test/
            test_app.py
            ...
  • postavljanje testova u dodatni direktorijum van koda vaše stvarne aplikacije, što je korisno ako imate mnogo funkcionalnih testova ili ako želite da zadržite testove odvojene od koda stvarne aplikacije:

    mypkg/
        __init__.py
        appmodule.py
    tests/
        test_app.py
        ...

U oba slučaja obično treba da se uverite da se mypkg može uvesti, na primer korišćenjem python setup.py develop metoda alatki za podešavanje.

Možete pokrenuti vaše testove usmeravanjem na njih:

py.test tests/test_app.py       # for external test dirs
py.test mypkg/test/test_app.py  # for inlined test dirs
py.test mypkg                   # run tests in all below test directories
py.test                         # run all tests below current dir
...

Napomena

Ako py.test pronađe “a/b/test_module.py” test fajl za vreme rekurzije u sistemskom fajlu, on odlučuje uvozna imena kao što sledi:

  • nalazi basedir – to je prvi direktorijum “na gore” (prema korenu) koji ne sadrži __init__.py. Ako i a i b direktorijumi sadrže __init__.py osnovni direktorijum (basedir) će biti roditelj direktorijuma od a.
  • izvodi sys.path.insert(0, basedir) kako bi činio test modul spremnim za uvoz pod potpuno kvalifikovanim uvoznim imenom.
  • import a.b.test_module gde se putanja određuje konvertovanjem separatora putanje / u ”.” karaktere. To znači da morate pratiti sporazum povezivanja imena direktorijuma i fajlova direktno na uvozna imena.

Razlog za ovu unekoliko raširenu tehniku uvoza je taj što u većim projektima moduli višestrukih testova mogu da uvoze jedan iz drugog i da na taj način uslove da kanonička imena pomognu sprečavanje iznenađenja kao što je, recimo, to da se test modul uveze dva puta.





Published (Last edited): 17-06-2013 , source: http://pytest.org/latest/goodpractises.html