au tot felul de lacune (explicații pe parcurs) Nose a pornit de la o versiune antica de pytest (0.8) [1]_ Pytest s‑a schimbat mult, merită revăzut dacă te‑ai uitat la el acu câțiva ani. [1] h昊p://pytest.org/latest/faq.html#what‑s‑this‑magic‑with‑pytest‑historic‑notes
organizate diferit: Teste doar cu simple funcții și aserții Fixtures, markers, hooks Multe facilități builtin (care există ca și plugin‑uri în Nose) Suportă teste scrise în stil vechi, cu nose (suport partial) și uni昊est
var == [1, 2, 4] ============================== FAILURES =============================== _____________________________ test_assert _____________________________ tests\test_assert.py:6: in test_assert assert var == [1, 2, 3] E assert [1, 2, 4] == [1, 2, 3] E At index 2 diff: 4 != 3 E Full diff:
E Left contains more items, first extra item: '<svg height="37mm" v ="fill:#000000;fill‐opacity:1;fill‐rule:nonzero;stroke:none" /></svg>' E Full diff: E + ['foobar'] E ‐ ["<?xml version='1.0' encoding='UTF‐8'?>\n", E ‐ '<svg height="37mm" version="1.1" viewBox="0 0 37 37" width="3 E ‐ 'xmlns="http://www.w3.org/2000/svg"><path d="M 10 32 L 10 33 L E ‐ '32 z M 23 8 L 23 9 L 24 9 L 24 8 z M 21 24 L 21 25 L 22 25 L E ‐ '23 L 26 24 L 27 24 L 27 23 z M 27 30 L 27 31 L 28 31 L 28 30 ... Fixturi [1] În loc de setUp și tearDown sau pentru orice fel de dependință Injecție automata („dependency injection”) Și nu, ʺfixtureʺ nu înseamnă ce înseamnă în Django („data fixtures”) Exemplu: @pytest.fixture def myfixture(request):
2, 3] [1] La țară mere, în zece ani o să fie în DEX ca și „adídas” (DEX ʹ09) Fixturi ﴾finalizatoare﴿ Finalizatorul e echivalentul tearDown din unittest . Cel mai simplu e cu pytest.yield_fixture : @pytest.yield_fixture def mydbfixture(request): conn = sqlite3.connect(":memory:")
fixtura este apelată la fiecare funcție de test. scope="module" ‑ fixtura este apelată o singură dată per modul. scope="session" ‑ fixtura este apelată o singură dată (sesiunea de test doar una e). autouse: activare automată Dacă toate testele folosesc acelasi fixture, si nu au nevoie de rezultat autouse devine foarte convenabil. Fixturi în fixturi O fixtură poate să depindă de alte fixturi. Reluând exemplul anterior: @pytest.yield_fixture def mydb(request):
fixturi: Etichete arbitare Parametrizare: pytest.mark.parametrize(argnames, argvalues) Skip condițional: pytest.mark.skipif(condition) Fail „așteptat”: pytest.mark.xfail(condition, reason=None, run=True, raises=None) [1] [1] Când lenea e mare dar ești nostalgic și nu vrei să ștergi testul. Poate repari problema cândva!
conftest.py („plugin local”) Referință: h昊ps://pytest.org/latest/plugins.html#pytest‑hook‑reference Se pot modifica multe lucruri: colectare, rulare, output (rapoarte, detalii aserții, progres etc), opțiuni noi la linia de comandă. Există plugin‑uri care au hook‑uri custom: pytest‑xdist, pytest‑bdd și probabil altele.
sau PhantomJS) pytest‐splinter cu pytest‐django Splinter poate folosi Selenium și alte backend‑uri (PhantomJS). Exemplu: def test_login(browser, db, live_server): User.objects.create_superuser('user', email='[email protected]', password='abc') browser.visit(live_server.url)