Tutorial PyTest: Ce este PyTest? (cu exemple)
โก Rezumat inteligent
Pytest este un Python Cadru de testare care vฤ ajutฤ sฤ scrieศi teste simple ศi scalabile pentru baze de date, API-uri ศi interfeศe utilizator. Acesta acceptฤ fixฤri, parametrizare, markeri, rulฤri paralele ศi raportare detaliatฤ a aserศiunilor, de la teste unitare de bazฤ la teste funcศionale complexe.
Pytest este unul dintre cele mai utilizate framework-uri de testare din Python ecosistem. Menศine codul de testare scurt ศi uศor de citit, descoperฤ automat testele ศi se dezvoltฤ de la o primฤ aserศiune รฎntr-o suitฤ completฤ de teste pentru baze de date, API-uri ศi interfeศe utilizator. Secศiunile de mai jos prezintฤ instalarea, aserศiunile, fixฤrile, markerii, parametrizarea ศi rulฤrile paralele cu exemple practice.
Ce este Pytest?
Pytest este un framework de testare care vฤ permite sฤ scrieศi cod de testare folosind Python limbaj de programare. Vฤ ajutฤ sฤ scrieศi cazuri de testare simple ศi scalabile pentru baze de date, API-uri ศi chiar interfeศe utilizator. Pytest este utilizat รฎn principal pentru scrierea de teste pentru API-uri ศi se scaleazฤ de la teste unitare simple la teste funcศionale complexe.
De ce sฤ folosiศi Pytest?
Cรขteva dintre avantajele pytest sunt:
- Foarte uศor de utilizat pentru รฎnceput, datoritฤ sintaxei sale simple ศi clare.
- Poate rula teste รฎn paralel.
- Poate rula un test specific sau un subset de teste.
- Detecteazฤ automat testele.
- Se pot sฤri peste teste.
- Sursa deschisa.
Cum se instaleazฤ Pytest
Urmeazฤ procesul de instalare a pytest-ului:
Pas 1) Puteศi instala pytest cu comanda de mai jos.
pip install pytest==2.9.1
Dupฤ ce instalarea este completฤ, o puteศi confirma cu urmฤtoarea comandฤ.
py.test -h
Aceasta va afiศa ajutorul.
Primul exemplu de bazฤ Pytest
Acum, veศi รฎnvฤศa cum sฤ utilizaศi pytest cu un exemplu pytest de bazฤ.
Creaศi un folder study_pytest. Veศi crea fiศierele de test รฎn interiorul acestui folder. Navigaศi la acel folder รฎn linia de comandฤ. Creaศi un fiศier numit test_sample1.py รฎn interiorul folderului.
Adฤugaศi codul de mai jos รฎn el ศi salvaศi.
import pytest def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
Rulaศi testul folosind comanda de mai jos.
py.test
Veศi obศine rezultatul dupฤ cum urmeazฤ.
test_sample1.py F.
============================================== FAILURES ========================================
____________________________________________ test_sample1 ______________________________________
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed"
E AssertionError: test failed
E assert 5 == 6
test_sample1.py:6: AssertionError
Aici, รฎn test_sample1.py F., litera F indicฤ eศec, iar punctul (.) indicฤ succes. รn secศiunea de eศecuri, puteศi vedea metoda (metodele) eศuatฤ(e) ศi linia de eศec. Aici x==y รฎnseamnฤ 5==6, ceea ce este fals.
รn continuare, veศi รฎnvฤศa despre aserศiuni รฎn pytest.
Afirmaศii รฎn Pytest
Aserศiunile Pytest sunt verificฤri care returneazฤ fie starea Adevฤrat, fie Fals. รn pytest, dacฤ o aserศiune eศueazฤ รฎntr-o metodฤ de testare, atunci execuศia acelei metode este opritฤ acolo. Codul rฤmas din acea metodฤ de testare nu este executat, iar pytest continuฤ cu urmฤtoarea metodฤ de testare.
Exemple de aserศiuni Pytest:
assert "hello" == "Hai" is an assertion failure. assert 4==4 is a successful assertion assert True is a successful assertion assert False is an assertion failure.
Luaศi รฎn considerare urmฤtoarele.
assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
Plasaศi acest cod รฎn test_file1_method1() รฎn loc de aserศiunea de mai jos.
assert x == y,"test failed"
Rularea testului va da eศecul ca AssertionError: testul eศuat x=5 y=6.
Cum identificฤ Pytest fiศierele de testare ศi metodele de testare
รn mod implicit, pytest identificฤ doar numele fiศierelor care รฎncep cu Test_ sau se terminฤ cu _Test ca fiศiere de test. Putem menศiona explicit ศi alte nume de fiศiere (explicaศii mai tรขrziu). Pytest necesitฤ ca numele metodelor de testare sฤ รฎnceapฤ cu testToate celelalte nume de metode sunt ignorate, chiar dacฤ solicitฤm explicit rularea acelor metode.
Vedeศi cรขteva exemple de nume de fiศiere pytest valide ศi nevalide.
test_login.py - valid login_test.py - valid testlogin.py -invalid logintest.py -invalid
Notฤ: Da, putem solicita รฎn mod explicit lui pytest sฤ selecteze testlogin.py ศi logintest.py.
Vedeศi cรขteva exemple de metode de testare pytest valide ศi nevalide.
def test_file1_method1(): - valid def testfile1_method1(): - valid def file1_method1(): - invalid
Notฤ: Chiar dacฤ menศionฤm explicit file1_method1(), pytest nu va rula aceastฤ metodฤ.
Rulaศi mai multe teste dintr-un anumit fiศier ศi mai multe fiศiere
รn prezent, รฎn folderul study_pytest, avem fiศierul test_sample1.py. Sฤ presupunem cฤ avem mai multe fiศiere, de exemplu test_sample2.py ศi test_sample3.py. Pentru a rula toate testele din toate fiศierele din folder ศi subfoldere, trebuie doar sฤ rulฤm comanda pytest.
py.test
Aceasta va rula toate numele de fiศiere care รฎncep cu test_ ศi numele de fiศiere care se terminฤ cu _test din acel folder ศi din subfolderele din acel folder.
Pentru a rula teste doar dintr-un anumit fiศier, putem folosi py.test .
py.test test_sample1.py
Executaศi un subset al รฎntregului test cu Pytest
Uneori nu dorim sฤ rulฤm รฎntreaga suitฤ de teste. Pytest ne permite sฤ rulฤm teste specifice. Putem face acest lucru รฎn douฤ moduri:
- Grouping a numelor de teste prin potrivirea subศirurilor.
- Grouping a testelor prin corectori.
Avem deja fiศierul test_sample1.py. Creaศi un fiศier test_sample2.py ศi adฤugaศi codul de mai jos รฎn el.
def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Deci avem urmฤtoarele รฎn prezent.
โข test_sample1.py โข test_file1_method1() โข test_file1_method2() โข test_sample2.py โข test_file2_method1() โข test_file2_method2()
Opศiunea 1) Executaศi teste prin potrivirea subศirurilor
Aici, pentru a rula toate testele care au metoda1 รฎn nume, trebuie sฤ rulฤm comanda de mai jos.
py.test -k method1 -v
-k <expression> is used to represent the substring to match
-v increases the verbosity
Deci, rularea comenzii py.test -k method1 -v vฤ va oferi urmฤtorul rezultat.
test_sample2.py::test_file2_method1 FAILED
test_sample1.py::test_file1_method1 FAILED
============================================== FAILURES ==============================================
_________________________________________ test_file2_method1 _________________________________________
def test_file2_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample2.py:5: AssertionError
_________________________________________ test_file1_method1 _________________________________________
@pytest.mark.only
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample1.py:8: AssertionError
================================= 2 tests deselected by '-kmethod1' ==================================
=============================== 2 failed, 2 deselected in 0.02 seconds ===============================
Aici puteศi vedea, spre sfรขrศit, 2 teste deselectate de โ-kmethod1โ, care sunt test_file1_method2 ศi test_file2_method2.
รncearcฤ sฤ rulezi cu diverse combinaศii, cum ar fi urmฤtoarele.
py.test -k method -v - will run all the four methods py.test -k methods -v โ will not run any test as there is no test name matches the substring 'methods'
Opศiunea 2) Rulaศi teste prin markeri
Pytest ne permite sฤ setฤm diverse atribute pentru metodele de testare folosind markere pytest, @pytest.mark. Pentru a utiliza markere รฎn fiศierul de test, trebuie sฤ importฤm pytest รฎn fiศierele de test. Aici vom aplica diferite nume de markere metodelor de testare ศi vom rula teste specifice pe baza numelor markerelor. Putem defini markerele pentru fiecare nume de test folosind urmฤtoarele.
@pytest.mark.<name>.
Definim markerii set1 ศi set2 pe metodele de testare ศi vom rula testul folosind numele markerilor. Actualizaศi fiศierele de test cu urmฤtorul cod.
test_sample1.py
import pytest @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set2 def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
test_sample2.py
import pytest @pytest.mark.set1 def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set1 def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Putem rula testul marcat cu comanda de mai jos.
py.test -m <name> -m <name> mentions the marker name
Ruleazฤ comanda py.test -m set1. Aceasta va rula metodele test_file1_method1, test_file2_method1 ศi test_file2_method2. Rularea comenzii py.test -m set2 va rula comanda test_file1_method2.
Executarea testelor รฎn paralel cu Pytest
De obicei, o suitฤ de teste va avea mai multe fiศiere de testare ศi sute de metode de testare, a cฤror execuศie va dura considerabil. Pytest ne permite sฤ rulฤm teste รฎn paralel. Pentru aceasta, trebuie mai รฎntรขi sฤ instalฤm pytest-xdist rulรขnd comanda de mai jos.
pip install pytest-xdist
Puteศi rula testele acum cu urmฤtoarea comandฤ.
py.test -n 4
Aici, -n executฤ testele folosind mai mulศi workeri. รn comanda de mai sus, vor exista patru workeri pentru a executa testele.
Pytest Fixtures
Fixฤrile sunt folosite atunci cรขnd dorim sฤ rulฤm un anumit cod รฎnainte de fiecare metodฤ de testare. Aศadar, รฎn loc sฤ repetฤm โโacelaศi cod รฎn fiecare test, definim fixฤri. De obicei, fixฤrile sunt folosite pentru a iniศializa conexiunile la baza de date, a transmite codul de bazฤ URL, ศi aศa mai departe. O metodฤ este marcatฤ ca fixturฤ pytest prin marcarea ei cu urmฤtoarele.
@pytest.fixture
O metodฤ de testare poate utiliza o fixturฤ pytest menศionรขnd fixtura ca parametru de intrare. Creaศi un fiศier nou test_basic_fixture.py cu urmฤtorul cod.
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc] def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
Aici:
- Avem un dispozitiv de fixare numit supply_AA_BB_CC. Aceastฤ metodฤ returneazฤ o listฤ de trei valori.
- Avem trei metode de testare care comparฤ fiecare dintre valori.
Fiecare dintre funcศiile de test are un argument de intrare al cฤrui nume se potriveศte cu un fixture disponibil. Pytest invocฤ apoi metoda fixture corespunzฤtoare, iar valorile returnate sunt stocate รฎn argumentul de intrare, aici lista [25,35,45]. Elementele listei sunt apoi utilizate รฎn metodele de testare pentru comparaศie. Acum rulaศi testul ศi vedeศi rezultatul.
py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED
test_basic_fixture.py::test_comparewithBB PASSED
test_basic_fixture.py::test_comparewithCC FAILED
============================================== FAILURES ==============================================
_________________________________________ test_comparewithAA _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithAA(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"
E AssertionError: aa and zz comparison failed
E assert 25 == 35
test_basic_fixture.py:10: AssertionError
_________________________________________ test_comparewithCC _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithCC(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
E AssertionError: cc and zz comparison failed
E assert 45 == 35
test_basic_fixture.py:16: AssertionError
================================= 2 failed, 1 passed in 0.05 seconds =================================
Testul test_comparewithBB reuศeศte, deoarece zz=BB=35, iar celelalte douฤ teste eศueazฤ.
Metoda fixture are un domeniu de aplicare doar รฎn fiศierul de test รฎn care este definitฤ. Dacฤ รฎncercฤm sฤ accesฤm fixture-ul รฎn alt fiศier de test, vom primi o eroare care spune fixture โsupply_AA_BB_CCโ nu a fost gฤsit pentru metodele de testare din celelalte fiศiere.
Pentru a utiliza aceeaศi fixturฤ pentru mai multe fiศiere de test, creฤm metode fixture รฎntr-un fiศier numit conftest.py. Sฤ vedem acest lucru cu exemplul pytest de mai jos. Creaศi trei fiศiere, conftest.py, test_basic_fixture.py ศi test_basic_fixture2.py, cu urmฤtorul cod.
concurs.py
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc]
test_basic_fixture.py
import pytest def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
test_basic_fixture2.py
import pytest def test_comparewithAA_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
Pytest va cฤuta mai รฎntรขi fixtura รฎn fiศierul de test, iar dacฤ nu o gฤseศte, o va cฤuta รฎn conftest.py. Rulaศi testul cu comanda py.test -k test_comparewith -v pentru a obศine rezultatul de mai jos.
test_basic_fixture.py::test_comparewithAA FAILED test_basic_fixture.py::test_comparewithBB PASSED test_basic_fixture.py::test_comparewithCC FAILED test_basic_fixture2.py::test_comparewithAA_file2 PASSED test_basic_fixture2.py::test_comparewithBB_file2 FAILED test_basic_fixture2.py::test_comparewithCC_file2 FAILED
Testul parametrizat Pytest
Scopul parametrizฤrii unui test este de a rula un test pe mai multe seturi de argumente. Putem face acest lucru cu @pytest.mark.parametrize. Vom vedea acest lucru รฎn exemplul pytest de mai jos. Aici vom transmite trei argumente unei metode de testare. Aceastฤ metodฤ de testare va adฤuga primele douฤ argumente ศi va compara rezultatul cu al treilea argument. Creaศi fiศierul de test test_addition.py cu codul de mai jos.
import pytest @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)]) def test_add(input1, input2, output): assert input1+input2 == output,"failed"
Aici, metoda de testare acceptฤ trei argumente: input1, input2 ศi output. Adunฤ input1 ศi input2 ศi comparฤ suma cu output-ul. Sฤ rulฤm testul cu py.test -k test_add -v ศi sฤ vedem rezultatul.
test_addition.py::test_add[5-5-10] PASSED
test_addition.py::test_add[3-5-12] FAILED
============================================== FAILURES ==============================================
__________________________________________ test_add[3-5-12] __________________________________________
input1 = 3, input2 = 5, output = 12
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
> assert input1+input2 == output,"failed"
E AssertionError: failed
E assert (3 + 5) == 12
test_addition.py:5: AssertionError
Puteศi vedea testele rulate de douฤ ori, unul verificรขnd 5+5 ==10 ศi celฤlalt verificรขnd 3+5 ==12.
test_addition.py::test_add[5-5-10] A TRUS
test_addition.py::test_add[3-5-12] A ESCUT
Pytest Xfail ศi teste de omitere
Vor exista unele situaศii รฎn care nu dorim sฤ executฤm un test sau un caz de testare nu este relevant la un moment dat. รn aceste situaศii, avem opศiunea de a eศua testul sau de a sฤri peste teste. Testul eศuat va fi executat, dar nu va fi considerat ca parte a testelor eศuate sau reuศite. Nu va exista nicio traceback afiศat dacฤ testul respectiv eศueazฤ. Putem face teste xfail folosind @pytest.mark.xfail. Sari pesteping Un test รฎnseamnฤ cฤ testul nu va fi executat. Putem sฤri peste teste folosind @pytest.mark.skip. Editaศi fiศierul test_addition.py cu codul de mai jos.
import pytest @pytest.mark.skip def test_add_1(): assert 100+200 == 400,"failed" @pytest.mark.skip def test_add_2(): assert 100+200 == 300,"failed" @pytest.mark.xfail def test_add_3(): assert 15+13 == 28,"failed" @pytest.mark.xfail def test_add_4(): assert 15+13 == 100,"failed" def test_add_5(): assert 3+2 == 5,"failed" def test_add_6(): assert 3+2 == 6,"failed"
Aici:
- test_add_1 ศi test_add_2 sunt ignorate ศi nu vor fi executate.
- test_add_3 ศi test_add_4 sunt xfailed. Aceste teste vor fi executate ศi vor face parte din testele xfailed (la eศecul testului) sau xpassed (la succesul testului). Nu va exista nicio traceback pentru eศecuri.
- test_add_5 ศi test_add_6 vor fi executate, iar test_add_6 va raporta o eroare cu un traceback รฎn timp ce test_add_5 trece.
Executaศi testul cu comanda py.test test_addition.py -v ศi vedeศi rezultatul.
test_addition.py::test_add_1 SKIPPED
test_addition.py::test_add_2 SKIPPED
test_addition.py::test_add_3 XPASS
test_addition.py::test_add_4 xfail
test_addition.py::test_add_5 PASSED
test_addition.py::test_add_6 FAILED
============================================== FAILURES ==============================================
_____________________________________________ test_add_6 _____________________________________________
def test_add_6():
> assert 3+2 == 6,"failed"
E AssertionError: failed
E assert (3 + 2) == 6
test_addition.py:24: AssertionError
================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================
Rezultate รฎn format XML
Putem crea rezultate ale testelor รฎn format XML, pe care le putem transmite serverelor de integrare continuฤ pentru procesare ulterioarฤ. Acest lucru se poate face cu comanda py.test test_sample1.py -v โjunitxml=โresult.xmlโ. Fiศierul result.xml va รฎnregistra rezultatul execuศiei testului. Gฤsiศi un exemplu de fiศier result.xml mai jos.
<?xml version="1.0" encoding="UTF-8"?> <testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046"> <testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526"> <failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6"> @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed because x=" + str(x) + " y=" + str(y) E AssertionError: test failed because x=5 y=6 E assert 5 == 6 test_sample1.py:9: AssertionError </failure> </testcase> <testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" /> </testsuite>
Din Putem vedea un total de douฤ teste, dintre care unul a eศuat. Mai jos, puteศi vedea detaliile referitoare la fiecare test executat รฎn cadrul etichetฤ.
Framework-ul Pytest pentru testarea unei API-uri
Acum vom crea un mic framework pytest pentru a testa o API. API-ul folosit aici este unul gratuit de la reqres.inAcest site web oferฤ pur ศi simplu o API testabilฤ ศi nu stocheazฤ datele noastre. Aici vom scrie cรขteva teste pentru urmฤtoarele:
- Listรขnd cรขศiva utilizatori.
- Autentificare cu utilizatori.
Creaศi fiศierele de mai jos cu codul dat. Mai รฎntรขi, conftest.py are un dispozitiv fix care va furniza codul de bazฤ URL pentru toate metodele de testare.
import pytest @pytest.fixture def supply_url(): return "https://reqres.in/api"
Apoi, test_list_user.py conศine metodele de testare pentru listarea utilizatorilor valizi ศi invalidi.
- test_list_valid_user testeazฤ o funcศie fetch validฤ a utilizatorului ศi verificฤ rฤspunsul.
- test_list_invaliduser testeazฤ pentru o funcศie fetch invalidฤ a utilizatorului ศi verificฤ rฤspunsul.
import pytest import requests import json @pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")]) def test_list_valid_user(supply_url,userid,firstname): url = supply_url + "/users/" + str(userid) resp = requests.get(url) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['data']['id'] == userid, resp.text assert j['data']['first_name'] == firstname, resp.text def test_list_invaliduser(supply_url): url = supply_url + "/users/50" resp = requests.get(url) assert resp.status_code == 404, resp.text
Apoi, test_login_user.py conศine metodele de testare pentru testarea funcศionalitฤศii de autentificare.
- test_login_valid testeazฤ รฎncercarea validฤ de conectare cu o adresฤ de e-mail ศi o parolฤ.
- test_login_no_password testeazฤ รฎncercarea invalidฤ de conectare fฤrฤ a introduce o parolฤ.
- test_login_no_email testeazฤ รฎncercarea invalidฤ de conectare fฤrฤ a transmite o adresฤ de e-mail.
import pytest import requests import json def test_login_valid(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com','password':'something'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['token'] == "QpwL5tke4Pnpja7X", resp.text def test_login_no_password(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing password", resp.text def test_login_no_email(supply_url): url = supply_url + "/login/" data = {} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing email or username", resp.text
Rulaศi testul folosind comanda py.test -v ศi vedeศi rezultatul dupฤ cum urmeazฤ.
test_list_user.py::test_list_valid_user[1-George] PASSED test_list_user.py::test_list_valid_user[2-Janet] PASSED test_list_user.py::test_list_invaliduser PASSED test_login_user.py::test_login_valid PASSED test_login_user.py::test_login_no_password PASSED test_login_user.py::test_login_no_email PASSED
Actualizaศi testele ศi รฎncercaศi diverse rezultate.





