PyTesti õpetus: mis on, kuidas installida, raamistik, väited
Mis on PyTest?
PyTest on testimisraamistik, mis võimaldab kasutajatel kirjutada testkoode kasutades Python programmeerimiskeel. See aitab teil kirjutada lihtsaid ja skaleeritavaid testjuhtumeid andmebaaside, API-de või kasutajaliidese jaoks. PyTesti kasutatakse peamiselt API-de testide kirjutamiseks. See aitab kirjutada teste alates lihtsatest ühikutestidest kuni keerukate funktsionaalsete testideni.
Miks kasutada PyTesti?
Mõned pytesti eelised on
- Selle lihtsa ja lihtsa süntaksi tõttu on väga lihtne alustada.
- Saab paralleelselt teste läbi viia.
- Saab käivitada konkreetse testi või testide alamhulga
- Tuvastage testid automaatselt
- Jäta testid vahele
- Avatud lähtekoodiga
Kuidas PyTesti installida
Järgmine on PyTesti installimise protsess:
Step 1) Pytesti saate installida järgmiselt
pip install pytest==2.9.1
Kui installimine on lõppenud, saate seda kinnitada nupuga
py.test -h
See kuvab abi
Esimene põhiline PyTest
Nüüd õpime PyTesti põhinäite abil kasutama Pytesti.
Looge kaust study_pytest. Loome selles kaustas oma testfailid.
Navigeerige oma käsureal sellesse kausta.
Looge kaustas fail nimega test_sample1.py
Lisage sellele allolev kood ja salvestage
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"
Käivitage test käsuga
py.test
Saate väljundi kujul
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
Siin test_sample1.py F.
F ütleb, et ebaõnnestumine
Punkt(.) ütleb edu.
Rikete jaotises näete ebaõnnestunud meetodit ja rikete rida. Siin x==y tähendab 5==6, mis on vale.
Järgmisena selles PyTesti õpetuses õpime PyTestis kinnitamise kohta.
Väited PyTestis
Pytesti väited on kontrollid, mis tagastavad oleku kas Tõene või Väär. sisse Python Pytest, kui väide testmeetodis ebaõnnestub, peatatakse selle meetodi täitmine seal. Selle testmeetodi järelejäänud koodi ei käivitata ja Pytesti väited jätkuvad järgmise testmeetodiga.
Pytest Asserti näited:
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.
Arvestama
assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
Asetage see kood väite asemel kausta test_file1_method1().
assert x == y,"test failed"
Testi käivitamine annab ebaõnnestumise kui AssertionError: test ebaõnnestus x=5 y=6
Kuidas PyTest tuvastab testfailid ja testimismeetodid
Vaikimisi tuvastab pytest ainult failinimed, mis algavad tähega test_ või lõpetades _testi kui testfailid. Saame selgesõnaliselt mainida ka teisi failinimesid (selgitatakse hiljem). Pytest nõuab alustuseks katsemeetodite nimesid "test.” Kõiki teisi meetodite nimesid eiratakse isegi siis, kui palume neid meetodeid selgesõnaliselt käivitada.
Vaadake mõnda näidet kehtivate ja kehtetute pytest failinimede kohta
test_login.py - valid login_test.py - valid testlogin.py -invalid logintest.py -invalid
Märkus. Jah, me võime selgesõnaliselt paluda pytestil valida testlogin.py ja logintest.py
Vaadake mõnda näidet kehtivate ja kehtetute pytesti katsemeetodite kohta
def test_file1_method1(): - valid def testfile1_method1(): - valid def file1_method1(): - invalid
Märkus. Isegi kui me selgelt mainime file1_method1() pytest ei käivita seda meetodit.
Käivitage mitu testi konkreetsest failist ja mitmest failist
Praegu on meil kaustas study_pytest fail test_sample1.py. Oletame, et meil on mitu faili, ütleme test_sample2.py, test_sample3.py. Kõigi kaustas ja alamkaustades olevate failide testide käivitamiseks peame lihtsalt käivitama käsu pytest.
py.test
See käivitab selles kaustas ja selle kausta all olevates alamkaustades kõik failinimed, mis algavad tähega test_ ja lõpuga _test.
Testide käivitamiseks ainult konkreetsest failist saame kasutada faili py.test
py.test test_sample1.py
Käivitage PyTestiga kogu testi alamhulk
Mõnikord ei taha me kogu testikomplekti käivitada. Pytest võimaldab meil käivitada spetsiifilisi teste. Saame seda teha kahel viisil
- Testinimede rühmitamine alamstringi sobitamise järgi
- Testide rühmitamine markerite järgi
Meil on juba test_sample1.py. Looge fail test_sample2.py ja lisage sellele allolev kood
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"
Nii on meil praegu
• test_sample1.py • test_file1_method1() • test_file1_method2() • test_sample2.py • test_file2_method1() • test_file2_method2()
Valik 1) Käivitage testid alamstringi sobitamise teel
Siin peame käivitama kõigi testide, mille nimes on meetod1, käivitamiseks
py.test -k method1 -v -k <expression> is used to represent the substring to match -v increases the verbosity
Nii et py.test -k meetod1 -v käivitamine annab teile järgmise tulemuse
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 ===============================
Siit on näha lõpu poole 2 testi tühistas '-kmethod1' mis on test_fail1_meetod2 ja test_fail2_meetod2
Proovige joosta erinevate kombinatsioonidega, näiteks: -
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'
Variant 2) Käivitage testid markerite järgi
Pytest võimaldab meil määrata testimeetoditele erinevaid atribuute, kasutades pytest markereid @pytest.mark. Testfailis markerite kasutamiseks peame importima testfailidele pytest.
Siin rakendame testimismeetoditele erinevaid markerite nimesid ja käivitame markerite nimede põhjal spetsiifilisi teste. Saame defineerida iga testinime markerid kasutades
@pytest.mark.<name>.
Määratleme testimeetodite jaoks markerid set1 ja set2 ning käivitame testi markerite nimede abil. Värskendage testfaile järgmise koodiga
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"
Saame märgitud testi käivitada
py.test -m <name> -m <name> mentions the marker name
Käivitage py.test -m set1. See käivitab meetodid test_file1_method1, test_file2_method1, test_file2_method2.
Käivitades py.test -m set2, käivitatakse test_file1_method2.
Käivitage teste paralleelselt Pytestiga
Tavaliselt on testikomplektil mitu testfaili ja sadu testmeetodeid, mille käivitamine võtab palju aega. Pytest võimaldab meil paralleelselt teste käivitada.
Selleks peame esmalt käivitades installima pytest-xdist
pip install pytest-xdist
Saate nüüd teste läbi viia
py.test -n 4
-n käivitab testid, kasutades mitut töötajat. Ülaltoodud käsus on testi läbiviimiseks 4 töötajat.
Pytesti kinnitused
Fixtures kasutatakse siis, kui tahame enne iga katsemeetodit mõnda koodi käivitada. Nii et igas testis sama koodi kordamise asemel määratleme kinnitused. Tavaliselt kasutatakse seadmeid andmebaasiühenduste lähtestamiseks, baasi läbimiseks jne
Meetod märgitakse Pytesti kinnituseks, märgistades
@pytest.fixture
Katsemeetod võib kasutada Pytesti kinnitust, mainides kinnitust sisendparameetrina.
Looge järgmise koodiga uus fail test_basic_fixture.py
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"
Siin
- Meil on seade nimega supply_AA_BB_CC. See meetod tagastab 3 väärtusega loendi.
- Meil on 3 testimismeetodit, mida võrreldakse iga väärtusega.
Igal testimisfunktsioonil on sisendargument, mille nimi ühtib saadaoleva kinnitusega. Seejärel kutsub Pytest välja vastava kinnitusmeetodi ja tagastatud väärtused salvestatakse sisendargumendis, siin on loend [25,35,45]. Nüüd kasutatakse loendi üksusi võrdluseks katsemeetodites.
Nüüd käivitage test ja vaadake tulemust
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 =================================
Test test_comparewithBB on läbitud, kuna zz=BB=35 ja ülejäänud 2 testi ebaõnnestusid.
Kinnitusmeetodil on ulatus ainult selles testfailis, mis see on määratletud. Kui proovime mõnes muus testfailis olevale kinnitusele juurde pääseda, kuvatakse tõrketeade, milles öeldakse kinnitus 'supply_AA_BB_CC' ei leitud teistes failides olevate katsemeetodite jaoks.
Sama kinnitusvahendi kasutamiseks mitme testfaili vastu loome kinnitusmeetodid failis nimega conftest.py.
Vaatame seda alloleva PyTesti näite abil. Looge 3 faili conftest.py, test_basic_fixture.py, test_basic_fixture2.py järgmise koodiga
conftest.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 otsib esmalt kinnitust testfailist ja kui seda ei leita, siis failist conftest.py
Alloleva tulemuse saamiseks käivitage test käsuga py.test -k test_comparewith -v
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
Pytesti parameetriline test
Testi parameetrite määramise eesmärk on käivitada test mitme argumentide komplekti suhtes. Seda saame teha @pytest.mark.parametrize abil.
Näeme seda alloleva PyTesti näitega. Siin edastame testimismeetodile 3 argumenti. See testmeetod lisab esimesed 2 argumenti ja võrdleb seda 3. argumendiga.
Looge alloleva koodiga testfail test_addition.py
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"
Siin aktsepteerib testimismeetod 3 argumenti – input1, input2, output. See lisab sisend1 ja sisend2 ning võrdleb väljundiga.
Käivitame testi käsuga py.test -k test_add -v ja vaatame tulemust
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
Näete 2 korda tehtud teste – üks kontrollib 5+5 ==10 ja teine kontroll 3+5 ==12
test_addition.py::test_add[5-5-10] SÕIDUD
test_addition.py::test_add[3-5-12] ERUS
Pytest Xfail / Jäta testid vahele
On olukordi, kus me ei soovi testi läbi viia või a testjuhtum ei ole konkreetse aja jaoks asjakohane. Sellistes olukordades on meil võimalus test X ebaõnnestuda või testid vahele jätta
Test xfailed sooritatakse, kuid seda ei loeta osaliseks ebaõnnestunud või läbitud testiks. Kui see test ebaõnnestub, seda ei kuvata. Saame testid läbi kukkuda, kasutades
@pytest.mark.xfail.
Testi vahelejätmine tähendab, et testi ei teostata. Saame testid vahele jätta kasutades
@pytest.mark.skip.
Muutke faili test_addition.py alloleva koodiga
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"
Siin
- test_add_1 ja test_add_2 jäetakse vahele ja neid ei käivitata.
- test_add_3 ja test_add_4 on xfailed. Need testid viiakse läbi ja need on osa testidest xfailed (testi ebaõnnestumisel) või xpassed (testi läbimise korral). Ebaõnnestumisel ei ole jälgegi.
- Käivitatakse test_add_5 ja test_add_6 ning test_add_6 teatab tõrkest jälgimisega, kui test_add_5 läbib
Käivitage test käsuga py.test test_addition.py -v ja vaadake tulemust
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 =================
Tulemused XML
Saame luua XML-vormingus testitulemusi, mida saame edastada pideva integratsiooni serveritele edasiseks töötlemiseks jne. Seda saab teha
py.test test_sample1.py -v –junitxml=”result.xml”
Tulemus.xml salvestab testi täitmise tulemuse. Otsige altpoolt tulemust.xml
<?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>
Alates näeme kokku kahte testi, millest üks on ebaõnnestunud. Selle all näete iga sooritatud testi üksikasju silt.
Pytesti raamistik API testimine
Nüüd loome API testimiseks väikese pytesti raamistiku. Siin kasutatav API on tasuta https://reqres.in/. See veebisait on mõeldud ainult testitava API pakkumiseks. See veebisait ei salvesta meie andmeid.
Siin kirjutame mõned testid
- loetledes mõned kasutajad
- kasutajatega sisse logima
Looge allpool olevad failid antud koodiga
conftest.py – omama kinnitust, mis annab kõigi katsemeetodite jaoks baas-URL-i
import pytest @pytest.fixture def supply_url(): return "https://reqres.in/api"
test_list_user.py – sisaldab testimismeetodeid kehtivate ja kehtetute kasutajate loetlemiseks
- test_list_valid_user testib õige kasutaja toomist ja kontrollib vastust
- test_list_invaliduser testib vale kasutaja toomist ja kontrollib vastust
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 – sisaldab testmeetodeid sisselogimisfunktsioonide testimiseks.
- test_login_valid testib kehtivat sisselogimiskatset e-posti ja parooliga
- test_login_no_password testib kehtetut sisselogimiskatset ilma parooli edastamata
- test_login_no_email testib kehtetut sisselogimiskatset ilma meilisõnumit edastamata.
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
Käivitage test kasutades py.test -v
Vaata tulemust kui
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
Värskendage teste ja proovige erinevaid väljundeid
kokkuvõte
Selles PyTesti õpetuses käsitlesime
- Installige pytest kasutades pip install pytest=2.9.1
- Lihtne pytest programm ja käivitage see käsuga py.test.
- Väitelaused, assert x==y, tagastavad kas tõese või väära.
- Kuidas pytest tuvastab testfailid ja -meetodid.
- Testige faile, mis algavad tähega test_ või lõpetades _testi
- Katsemeetodid alates test
- py.test käsk käivitab kõik selles kaustas ja alamkaustades olevad testfailid. Konkreetse faili käivitamiseks saame kasutada käsku py.test
- Käivitage testmeetodite alamhulk
- Testinimede rühmitamine alamstringi matching.py.test -k järgi -v käivitab kõik testid, millel on selle nimel.
- Käivitage test markerite järgi. Märkige testid @pytest.mark abil. ja käivitage testid, kasutades pytest -m testide käivitamiseks, mis on märgitud kui .
- Käivitage testid paralleelselt
- Installige pytest-xdist, kasutades pip install pytest-xdist
- Käivitage testid, kasutades käsku py.test -n NUM, kus NUM on töötajate arv
- Kinnitusmeetodite loomine koodi käivitamiseks enne iga testi, märkides meetodi @pytest.fixture
- Kinnitusmeetodi ulatus on määratletud failis.
- Kinnitusmeetodile pääseb juurde mitme testfaili kaudu, määrates selle failis conftest.py.
- Testmeetod pääseb Pytesti kinnitusele juurde, kasutades seda sisendargumendina.
- Testide parameetrite määramine, et seda käitada mitme sisendikomplekti vastu.
@pytest.mark.parametrize(“sisend1, sisend2, väljund”,[(5,5,10),(3,5,12)])
def test_add(sisend1, sisend2, väljund):
kinnitada sisend1+sisend2 == väljund "ebaõnnestunud"
käivitab testi sisenditega (5,5,10) ja (3,5,12) - Jäta vahele/xfail testid, kasutades @pytets.mark.skip ja @pytest.mark.xfail
- Looge testitulemused XML-vormingus, mis hõlmab teostatud testi üksikasju, kasutades faili py.test test_sample1.py -v –junitxml=”result.xml”
- Pytesti raamistiku näidis API testimiseks




