Tutorial PyTest: Ce este, Cum se instalează, Framework, Aserțiuni

Ce este PyTest?

PyTest este un cadru de testare care permite utilizatorilor să scrie coduri de testare folosind Python limbaj de programare. Vă ajută să scrieți cazuri de testare simple și scalabile pentru baze de date, API-uri sau UI. PyTest este folosit în principal pentru scrierea de teste pentru API-uri. Ajută să scrieți teste de la teste unitare simple la teste funcționale complexe.

De ce să folosiți PyTest?

Unele dintre avantajele pytest sunt

  • Foarte ușor de început datorită sintaxei sale simple și ușoare.
  • Poate rula teste în paralel.
  • Poate rula un anumit test sau un subset de teste
  • Detectează automat testele
  • Sari peste teste
  • Sursa deschisa

Cum se instalează PyTest

Următorul este un proces despre cum să instalați PyTest:

Pas 1) Puteți instala pytest prin

pip install pytest==2.9.1

Odată ce instalarea este finalizată, o puteți confirma cu by

py.test -h

Aceasta va afișa ajutorul

instalați PyTest

Primul PyTest de bază

Acum, vom învăța cum să folosim Pytest cu un exemplu de bază PyTest.

Creați un folder study_pytest. Vom crea fișierele noastre de testare în acest folder.

Vă rugăm să navigați la acel folder în linia de comandă.

Creați un fișier denumit test_sample1.py în dosar

Primul PyTest de bază

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

py.test

Veți obține rezultate ca

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

Primul PyTest de bază

Aici, în test_sample1.py F.

F spune eșec

Dot(.) spune succes.

În secțiunea de eșecuri, puteți vedea metodele eșuate și linia de eșec. Aici x==y înseamnă 5==6 care este fals.

În continuare, în acest tutorial PyTest, vom afla despre afirmații în PyTest.

Aserții în PyTest

Afirmațiile Pytest sunt verificări care returnează fie starea Adevărat, fie Fals. În Python 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 afirmațiile Pytest vor continua cu următoarea metodă de testare.

Exemple Pytest Assert:

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 în considerare

assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

Plasați acest cod în test_file1_method1() în loc de aserțiune

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ă numai numele fișierelor care încep cu Test_ sau se termină cu _Test ca fișierele de testare. Totuși, putem menționa în mod explicit alte nume de fișiere (explicate mai târziu). Pytest necesită numele metodelor de testare pentru a începe "Test.” Toate celelalte nume de metode vor fi ignorate chiar dacă solicităm în mod explicit să rulăm acele metode.

Vedeți câteva exemple de nume de fișiere pytest valide și invalide

test_login.py - valid
login_test.py - valid
testlogin.py -invalid
logintest.py -invalid

Notă: Da, putem cere în mod explicit pytest să aleagă testlogin.py și logintest.py

Vedeți câteva exemple de metode de testare pytest valide și invalide

def test_file1_method1(): - valid
def testfile1_method1(): - valid
def file1_method1(): - invalid	

Notă: Chiar dacă menționăm în mod 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 un fișier test_sample1.py. Să presupunem că avem mai multe fișiere, să spunem test_sample2.py, 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 fișierelor care se termină cu _test în acel folder și subfolderele din acel folder.

Pentru a rula teste numai dintr-un anumit fișier, putem folosi py.test

py.test test_sample1.py

Rulați un subset de Test întreg cu PyTest

Uneori nu vrem să rulăm întreaga suită de teste. Pytest ne permite să rulăm teste specifice. O putem face în 2 moduri

  • Gruparea numelor de test după potrivirea subșirurilor
  • Gruparea testelor pe markeri

Avem deja 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 în prezent

• test_sample1.py
• test_file1_method1()
• test_file1_method2()
• test_sample2.py
• test_file2_method1()
• test_file2_method2()

Opțiunea 1) Rulați teste prin potrivirea subșirurilor

Aici, pentru a rula toate testele având method1 în numele, trebuie să rulăm

py.test -k method1 -v
-k <expression> is used to represent the substring to match
-v increases the verbosity

Deci, rularea 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 final 2 teste deselectate de „-kmethod1” care sunt test_file1_method2 și test_file2_method2

Încercați să alergați cu diverse combinații precum:-

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 diferite atribute pentru metodele de testare folosind markeri pytest, @pytest.mark . Pentru a folosi markeri în fișierul de testare, trebuie să importam pytest pe fișierele de testare.

Aici vom aplica diferite nume de markeri la metodele de testare și vom rula teste specifice bazate pe numele markerilor. Putem defini markerii pentru fiecare nume de test folosind

@pytest.mark.<name>.			

Definim markerii set1 și set2 pe metodele de testare și vom rula testul folosind numele markerilor. Actualizați fișierele de testare 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 prin

py.test -m <name>
-m <name> mentions the marker name

Rulați py.test -m set1. Acest lucru va rula metodele test_file1_method1, test_file2_method1, test_file2_method2.

Rularea py.test -m set2 va rula test_file1_method2.

Rulați teste în paralel cu Pytest

De obicei, o suită de testare va avea mai multe fișiere de testare și sute de metode de testare, care va dura o perioadă considerabilă de timp pentru a fi executate. Pytest ne permite să rulăm teste în paralel.

Pentru asta trebuie să instalăm mai întâi pytest-xdist rulând

pip install pytest-xdist

Rulați teste în paralel cu Pytest

Puteți rula teste acum până la

py.test -n 4

-n rulează testele utilizând mai mulți lucrători. În comanda de mai sus, vor exista 4 lucrători pentru a rula testul.

Pytest Fixtures

Fixările sunt folosite atunci când vrem să rulăm un cod înainte de fiecare metodă de testare. Deci, în loc să repetăm ​​același cod în fiecare test, definim dispozitive. De obicei, dispozitivele sunt folosite pentru a inițializa conexiunile la baza de date, pentru a trece baza etc

O metodă este marcată ca un dispozitiv Pytest prin marcarea cu

@pytest.fixture

O metodă de testare poate folosi un dispozitiv Pytest menționând dispozitivul 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 numit supply_AA_BB_CC. Această metodă va returna o listă de 3 valori.
  • Avem 3 metode de testare care se compară cu fiecare dintre valori.

Fiecare dintre funcțiile de testare are un argument de intrare al cărui nume se potrivește cu un dispozitiv disponibil. Pytest invocă apoi metoda fixture corespunzătoare și valorile returnate vor fi stocate în argumentul de intrare, aici lista [25,35,45]. Acum elementele din listă sunt 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 este trecut deoarece zz=BB=35, iar celelalte 2 teste nu au reușit.

Metoda fixture are un domeniu de aplicare numai în acel fișier de test este definit. Dacă încercăm să accesăm dispozitivul într-un alt fișier de testare, vom primi o eroare care spune fixture „supply_AA_BB_CC” nu a fost găsit pentru metodele de testare din alte dosare.

Pentru a utiliza același dispozitiv împotriva mai multor fișiere de testare, vom crea metode de fixare într-un fișier numit conftest.py.

Să vedem asta prin exemplul PyTest de mai jos. Creați 3 fișiere conftest.py, test_basic_fixture.py, 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 dispozitivul în fișierul de testare și, dacă nu este găsit, va căuta în conftest.py

Rulați testul prin 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 prin @pytest.mark.parametrize.

Vom vedea acest lucru cu exemplul PyTest de mai jos. Aici vom transmite 3 argumente unei metode de testare. Această metodă de testare va adăuga primele 2 argumente și o va compara cu al treilea argument.

Creați fișierul de testare 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ă 3 argumente - input1, input2, output. Adaugă input1 și input2 și compară cu ieșirea.

Să rulăm testul prin 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 2 ori – una verificând 5+5 ==10 și alta 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 / Omite teste

Vor exista unele situații în care nu dorim să executăm un test, sau un caz de testare nu este relevant pentru un anumit moment. În aceste situații, avem opțiunea de a eșua testul sau de a sări peste teste

Testul xfailed va fi executat, dar nu va fi socotit ca teste parțial eșuate sau trecute. Nu va fi afișată nicio urmărire dacă acel test eșuează. Putem xfail teste folosind

@pytest.mark.xfail.

Omiterea unui test înseamnă că testul nu va fi executat. Putem sări peste teste folosind

@pytest.mark.skip.

Editați 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(on test pass). Nu va exista nicio urmărire pentru eșecuri.
  • test_add_5 și test_add_6 vor fi executate și test_add_6 va raporta eșecul cu traceback în timp ce test_add_5 trece

Executați testul prin 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 XML

Putem crea rezultate de testare în format XML pe care le putem transmite serverelor de integrare continuă pentru procesare ulterioară și așadar. Acest lucru se poate face prin

py.test test_sample1.py -v –junitxml=”result.xml”

Rezultatul.xml va înregistra rezultatul execuției testului. Găsiți un exemplu de rezultat.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 nu a reușit. Mai jos puteți vedea detaliile referitoare la fiecare test executat sub etichetă.

Pytest Framework Testarea unui API

Acum vom crea un mic cadru pytest pentru a testa un API. API-ul folosit aici este unul gratuit https://reqres.in/. Acest site este doar pentru a oferi API testabil. Acest site web nu stochează datele noastre.

Aici vom scrie câteva teste pentru

  • enumerarea unor utilizatori
  • conectați-vă cu utilizatorii

Creați fișierele de mai jos cu codul dat

conftest.py – au un dispozitiv care va furniza adresa URL de bază pentru toate metodele de testare

import pytest
@pytest.fixture
def supply_url():
	return "https://reqres.in/api"

test_list_user.py – conține metodele de testare pentru listarea utilizatorilor validi și invalidi

  • test_list_valid_user testează preluarea validă a utilizatorului și verifică răspunsul
  • test_list_invaliduser testează preluarea utilizatorului nevalid ș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

test_login_user.py – conține metode de testare pentru testarea funcționalității de conectare.

  • test_login_valid testează încercarea de conectare validă cu e-mail și parolă
  • test_login_no_password testează încercarea de conectare nevalidă fără a transmite parola
  • test_login_no_email testează încercarea de conectare nevalidă fără a trimite 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 py.test -v

Vezi rezultatul ca

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 diferite rezultate

Rezumat

În acest tutorial PyTest, am acoperit

  • Instalați pytest folosind pip install pytest=2.9.1
  • Program pytest simplu și rulați-l cu comanda py.test.
  • Declarațiile de aserțiune, assert x==y, vor returna fie adevărat, fie fals.
  • Cum identifică pytest fișierele și metodele de testare.
  • Fișiere de testare începând cu Test_ sau se termină cu _Test
  • Metode de testare începând cu test
  • Comanda py.test va rula toate fișierele de testare din acel folder și subfolder. Pentru a rula un anumit fișier, putem folosi comanda py.test
  • Rulați un subset de metode de testare
  • Gruparea numelor de test după subșir matching.py.test -k -v va rula toate testele având în numele ei.
  • Rulați testul după markeri. Marcați testele folosind @pytest.mark. și rulați testele folosind pytest -m pentru a rula teste marcate ca .
  • Rulați teste în paralel
  • Instalați pytest-xdist folosind pip install pytest-xdist
  • Rulați teste folosind py.test -n NUM unde NUM este numărul de lucrători
  • Crearea de metode de fixare pentru a rula codul înainte de fiecare test, prin marcarea metodei cu @pytest.fixture
  • Sfera de aplicare a unei metode de fixare este în fișierul definit.
  • O metodă de fixare poate fi accesată în mai multe fișiere de testare definindu-l în fișierul conftest.py.
  • O metodă de testare poate accesa un dispozitiv Pytest utilizându-l ca argument de intrare.
  • Teste de parametrizare pentru a-l rula pe mai multe seturi de intrări.
    @pytest.mark.parametrize(„input1, input2, output”,[(5,5,10),(3,5,12)])
    def test_add(input1, input2, output):
    assert input1+input2 == output,”eșuat”
    va rula testul cu intrările (5,5,10) și (3,5,12)
  • Testele Skip/xfail folosind @pytets.mark.skip și @pytest.mark.xfail
  • Creați rezultatele testului în format XML care acoperă detaliile testului executat folosind py.test test_sample1.py -v –junitxml=”result.xml”
  • Un exemplu de framework pytest pentru a testa un API