Paano I-set Up at Patakbuhin ang Iyong Unang Python Test Gamit ang Pytest

Paano I-set Up at Patakbuhin ang Iyong Unang Python Test Gamit ang Pytest
Ang mga mambabasang tulad mo ay tumutulong sa pagsuporta sa MUO. Kapag bumili ka gamit ang mga link sa aming site, maaari kaming makakuha ng isang affiliate na komisyon. Magbasa pa.

Ang pagsubok ay isang mahalagang bahagi ng pagbuo ng software. Nakakatulong itong mahuli ang mga bug nang maaga at binabawasan ang posibilidad ng mga error sa linya.





Ang Pytest ay isa sa pinakasikat na testing frameworks para sa Python. Hinahayaan ka nitong magsulat ng maliliit at nababasang mga pagsubok na maaaring sukatin habang lumalaki ang iyong aplikasyon. Matutunan kung paano i-set up at gamitin ang Pytest gamit ang iyong Python code.





MAKEUSEOF VIDEO OF THE DAY MAG-SCROLL PARA MAGPATULOY SA NILALAMAN

Pag-set Up ng Pytest

Bago i-install ang Pytest, pinakamahusay na lumikha ng isang virtual na kapaligiran upang ihiwalay ang iyong kapaligiran sa pagsubok, upang maiwasan mo ang mga salungatan sa iba pang mga pakete at dependency.





Upang lumikha ng isang virtual na kapaligiran, patakbuhin ang sumusunod na command bago i-install ang Pytest.

 python -m venv tests 

Ito ay lilikha ng bagong virtual na kapaligiran na pinangalanang mga pagsubok sa iyong kasalukuyang direktoryo. Para i-activate ang environment, patakbuhin ang command na ito kung nasa Linux o Mac ka:



 source tests/bin/activate 

Para sa Windows, patakbuhin ang command na ito:

 tests\Scripts\activate 

Upang i-install ang Pytest, maaari mong gamitin ang pip, ang Python package manager, kasama ang command na ito sa iyong terminal:





ilan gb sa isang terabyte
 pip install pytest 

Kung wala kang Pip, huwag mag-alala; kaya mo i-install ang Pip sa Windows, Mac, at Linux .

Patakbuhin ang sumusunod na utos upang suriin kung na-install mo nang tama ang Pytest.





 pytest --version 

Dapat nitong ibalik ang naka-install na numero ng bersyon.

Paggawa ng Iyong Unang Pagsusulit

Isaalang-alang ang sumusunod na function na nagdaragdag ng dalawang numero at nagbabalik ng resulta.

 def add_numbers(a, b): 
    return a + b

Maraming bagay ang maaaring magkamali sa function na ito. Halimbawa, isaalang-alang kung ano ang mangyayari kung tatawagin mo ang function na may mga non-numeric na halaga gaya ng Wala o isang value ng uri ng string. Ito ang ilan sa mga potensyal na kaso sa gilid na maaaring magsanhi sa pagbagsak ng function.

Dapat suriin ng isa sa mga unang pagsubok na isusulat mo kung ibinabalik ng function ang inaasahang resulta. Upang gawin ito, maaari mong gamitin ang assert keyword upang ihambing ang aktwal na output ng function sa inaasahang output. Sa kaso ng add_numbers function, maaaring ganito ang hitsura ng test function:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 5
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Kasama sa test function na ito ang tatlong assert statement, na ang bawat isa ay naghahambing sa output ng add_numbers function sa isang inaasahang halaga. Sinusuri ng unang pagsubok na ang pagdaragdag ng 2 at 3 ay nagbabalik ng 5, ang pangalawang pagsubok ay nagsusuri na ang pagdaragdag ng -1 at 1 ay nagbabalik ng 0, at ang pangatlong pagsubok ay nagsusuri na ang pagdaragdag ng 0 at 0 ay nagbabalik ng 0.

Paano Magpatakbo ng Mga Pagsusulit Gamit ang Pytest

Pagkatapos mong maisulat ang iyong mga pagsusulit, ang susunod na hakbang ay patakbuhin ang mga ito. Upang gawin ito sa Pytest, mag-navigate sa direktoryo na naglalaman ng iyong test file at patakbuhin ang pytest command:

 pytest 

Kung gumagana ang lahat gaya ng inaasahan, makakakita ka ng mensahe na nagsasaad na matagumpay na naipasa ang lahat ng pagsubok. Gayunpaman, kung nabigo ang alinman sa mga pahayag, mag-uulat ang Pytest ng error at ipapakita sa iyo ang mga halaga ng input na naging sanhi ng pagkabigo.

Halimbawa, sabihin nating pinatakbo mo ang sumusunod na test function para sa add_numbers function:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Ang unang assertion ay mabibigo dahil ang inaasahang halaga ay 6, ngunit ang aktwal na halaga ay 5 (ang kabuuan ng 2 at 3). Ibabalik ng Pytest ang sumusunod na mensahe:

  Ang output ng isang pytest run na nagpapakita ng isang pagsubok na nabigo

Ipinapakita sa iyo ng mensaheng ito ang mga halaga ng input na naging sanhi ng halaga at sinasabi rin sa iyo kung ano ang dapat na aktwal na halaga. Ginagawa nitong madali ang mabilis na pagtukoy at pag-aayos ng mga error sa iyong code.

Paggamit ng Pytest.raises upang Igiit ang Mga Pagbubukod

Ngayon, magsulat tayo ng isang pagsubok upang masakop ang isa sa mga gilid na kaso ng add_numbers function. Kapag nagpasa ka ng hindi numeric na argumento tulad ng Wala sa function, dapat magtaas ang Python ng TypeError exception.

Dapat ikaw na paghawak ng mga pagbubukod sa iyong mga programa sa Python , at maaari mong subukan na ang iyong code ay nagtataas din ng mga ito nang tama.

Upang gawin ito, kopyahin ang sumusunod na function ng pagsubok sa iyong file. Ginagamit nito ang pytest.raises context manager upang suriin kung ang pagtawag sa add_number function na may 'Wala' ay nagtataas ng TypeError exception.

 import pytest 

def test_add_numbers_with_invalid_inputs():
    with pytest.raises(TypeError):
        add_numbers(None, 2)

Pagkatapos ay patakbuhin ang Pytest mula sa command line. Kung ang pagbubukod ay hindi itinaas, ang pagsubok ay mabibigo.

Maaari kang pumunta nang higit pa at suriin ang mga detalye ng mensahe ng pagbubukod. Ang tagapamahala ng konteksto ay gumagawa ng isang ExceptionInfo object na may mga detalye.

Halimbawa, sa function ng pagsubok na ito, igiit ang mensahe ng pagbubukod tulad nito:

 def test_add_numbers_with_invalid_inputs(): 
    with pytest.raises(TypeError) as exc_info:
        add_numbers(None, 2)

    assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"

Kung ang mensahe ay hindi tumutugma sa isa sa pagsubok, ang Pytest ay magsasaad ng pagkabigo.

Paano Gamitin ang Parameterized Testing para Subukan ang Maramihang Input nang Sabay-sabay

Sa halip na manu-manong tumawag sa isang function na may maraming input tulad nito:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Nagbibigay ang Pytest ng tampok na naka-parameter na pagsubok na nagbibigay-daan sa iyong gawin ang parehong bagay nang mas madali. Narito kung paano mo muling maisusulat ang function ng pagsubok sa itaas:

 import pytest 

@pytest.mark.parametrize("a,b,expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0)
])
def test_add_numbers(a, b, expected):
    assert add_numbers(a, b) == expected

Paano Magpatakbo ng Maramihang Pagsusulit

Sa ngayon, sumulat ka lang ng dalawang pagsubok para sa add_numbers function. Para sa mas kumplikadong mga function na may higit pang mga pagsubok, maaari mong igrupo ang mga ito sa isang klase.

Halimbawa, narito kung paano ka gagawa ng klase ng pagsubok para sa add function.

 class TestAddFunction: 
@pytest.mark.parametrize("a, b, expected", [
        (2, 3, 5),
        (-1, 1, 0),
        (0, 0, 0),
    ])
    def test_addition_with_numbers(self, a, b, expected):
        assert add_numbers(a, b) == expected

    def test_add_numbers_with_invalid_inputs(self):
        with pytest.raises(TypeError) as exc_info:
            add_numbers(None, 2)
        assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"

Tandaan na kailangan mong i-prefix ang pangalan ng klase ng 'Pagsubok' upang makilala ito ng Pytest bilang isang klase ng pagsubok at patakbuhin ito.

Ang Pytest ay May Marami pang Mga Tampok

Gamit ang Pytest, maaari mong awtomatikong i-verify na gumagana ang iyong code gaya ng inaasahan mo. Nag-aalok ang Pytest ng maraming iba pang feature gaya ng mga fixture na nagbibigay-daan sa iyong mag-set up at magtanggal ng data ng pagsubok at mga marka para sa pag-set up ng metadata sa iyong mga function ng pagsubok.

Bukod pa rito, maaari mong isama ang Pytest sa iyong CI pipeline at magsimulang magpatakbo ng mga pagsubok nang awtomatiko at tuluy-tuloy kapag binago mo ang iyong code.