Testarea proiectelor Python cu Tox

  • 2 minute de citit
  • 6 exemple de cod

Disponibil și în English

Pe această pagină

Salut 👋

În acest articol îți arăt cum să testezi proiectele tale Python cu Tox.

Introducere

Tox este un instrument pentru automatizarea testării în Python, scopul lor fiind standardizarea procesului de testare. Poate fi folosit ca să testezi ușor proiectul tău cu mai mulți interpretori Python și să rulezi diverse comenzi.

Primii pași

Ca să începi, tot ce trebuie să adaugi în proiect este un fișier tox.ini. Pentru a simplifica rularea testelor, vom folosi următorul Dockerfile, care conține interpretori Python pentru 3.6 și 3.7

FROM ubuntu:20.04RUN apt update && apt install -y software-properties-common \               && add-apt-repository ppa:deadsnakes/ppa \               && apt install -y python3.6 && apt install -y python3.7 \               && apt install -y python3-pip && pip3 install toxVOLUME /codeWORKDIR /codeENTRYPOINT tox

Un fișier tox.ini care testează cu python 3.6 și python 3.7 arată așa:

# conținutul fișierului: tox.ini , se pune în același director cu setup.py[tox]skip_missing_interpreters = Trueenvlist = py36,py37[testenv]# instalează pytest în virtualenv unde vor fi executate comenziledeps =    pytest==6.2.1    pytest-cov==2.11.1    responses==0.13.3commands =    # NOTE: poți rula aici orice instrument din linia de comandă – nu doar teste    pytest[testenv:bamboo]commands =  pytest —junitxml=results.xml \    —cov=your-module—cov-config=tox.ini —cov-report=xml    coverage2clover -i coverage.xml -o clover.xmldeps =    {[testenv]deps}    coverage2clover

Avem două medii: testenv și testenv:bamboo, al doilea fiind folosit pentru raportarea acoperirii codului în Bamboo, prin clover. Ca să rulezi Tox cu un mediu specific, scrii tox -e bamboo.

Ca să rulezi testele prin Dockerfile, mai întâi construiești containerul cu: docker build . -f Dockerfile -t tox

Apoi, rulezi containerul cu docker run -v “$(pwd)”:”/code” tox -e bamboo ca să testezi cu mediul Bamboo sau doar docker run -v “$(pwd)”:”/code” tox pentru mediul implicit.

Exemplu practic

Iată un exemplu pe care îl poți urmări pas cu pas. Avem următoarele fișiere:

@denis ➜ tox_article ls__pycache__  tests.py  tox.ini
# @denis ➜ tox_article cat tests.pyimport unittestclass 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(), ['hello', 'world'])        # verifică faptul că s.split eșuează când separatorul nu este un șir de caractere        with self.assertRaises(TypeError):            s.split(2)if __name__ == '__main__':    unittest.main()%
# @denis ➜ tox_article cat tox.ini[tox]skip_missing_interpreters = Trueenvlist = py36,py37skipsdist = True[testenv]commands =    python -m unittest%

Rularea Tox în imaginea noastră Docker va produce următorul rezultat:

@denis ➜ tox_article docker run -v "$(pwd)":"/code" toxpy36 create: /code/.tox/py36py36 run-test-pre: PYTHONHASHSEED='520882151'py36 run-test: commands[0] | python -m unittest...----------------------------------------------------------------------Ran 3 tests in 0.000sOKpy37 create: /code/.tox/py37py37 run-test-pre: PYTHONHASHSEED='520882151'py37 run-test: commands[0] | python -m unittest...----------------------------------------------------------------------Ran 3 tests in 0.000sOK___________________________________ summary ____________________________________  py36: commands succeeded  py37: commands succeeded  congratulations :)

Aceleași teste sunt rulate de două ori, mai întâi cu Python 3.6 și apoi cu Python 3.7.

Mulțumesc că ai citit și succes la testat! 🔧