Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Python

Tutorial PyTest:Apa itu, Cara Memasang, Kerangka Kerja, Pernyataan

Apa itu PyTest?

PyTest adalah kerangka kerja pengujian yang memungkinkan pengguna untuk menulis kode pengujian menggunakan bahasa pemrograman Python. Ini membantu Anda menulis kasus pengujian yang sederhana dan skalabel untuk database, API, atau UI. PyTest terutama digunakan untuk menulis tes untuk API. Ini membantu untuk menulis pengujian dari pengujian unit sederhana hingga pengujian fungsional yang kompleks.

Mengapa menggunakan PyTest?

Beberapa keuntungan dari pytest adalah

Dalam tutorial Python PyTest ini, Anda akan belajar:

Cara menginstal PyTest

Berikut adalah proses cara menginstal PyTest:

Langkah 1) Anda dapat menginstal pytest dengan

pip install pytest==2.9.1

Setelah penginstalan selesai, Anda dapat mengonfirmasinya dengan

py.test -h

Ini akan menampilkan bantuan

PyTest Dasar Pertama

Sekarang, kita akan mempelajari cara menggunakan Pytest dengan contoh dasar PyTest.

Buat folder study_pytest. Kami akan membuat file pengujian kami di dalam folder ini.

Silakan navigasikan ke folder itu di baris perintah Anda.

Buat file bernama test_sample1.py di dalam folder

Tambahkan kode di bawah ini ke dalamnya dan simpan

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" 

Jalankan tes menggunakan perintah

py.test

Anda akan mendapatkan output sebagai

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

Di sini, di test_sample1.py F.

F mengatakan gagal

Dot(.) mengatakan sukses.

Di bagian kegagalan, Anda dapat melihat metode yang gagal dan garis kegagalan. Di sini x==y berarti 5==6 yang salah.

Selanjutnya dalam tutorial PyTest ini, kita akan belajar tentang asersi di PyTest.

Pernyataan di PyTest

Pernyataan Pytest adalah pemeriksaan yang mengembalikan status Benar atau Salah. Di Python Pytest, jika pernyataan gagal dalam metode pengujian, maka eksekusi metode itu dihentikan di sana. Kode yang tersisa dalam metode pengujian tersebut tidak dijalankan, dan pernyataan Pytest akan dilanjutkan dengan metode pengujian berikutnya.

Contoh 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.

Pertimbangkan

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

Tempatkan kode ini di test_file1_method1() alih-alih pernyataan

assert x == y,"test failed"

Menjalankan pengujian akan memberikan kegagalan sebagai AssertionError:pengujian gagal x=5 y=6

Bagaimana PyTest Mengidentifikasi File Pengujian dan Metode Pengujian

Secara default pytest hanya mengidentifikasi nama file yang dimulai dengan test_ atau diakhiri dengan _test sebagai file tes. Kami dapat secara eksplisit menyebutkan nama file lain (dijelaskan nanti). Pytest memerlukan nama metode pengujian untuk memulai dengan “test .” Semua nama metode lainnya akan diabaikan meskipun kita secara eksplisit meminta untuk menjalankan metode tersebut.

Lihat beberapa contoh nama file pytest yang valid dan tidak valid

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

Catatan:Ya, kami dapat secara eksplisit meminta pytest untuk memilih testlogin.py dan logintest.py

Lihat beberapa contoh metode uji pytest yang valid dan tidak valid

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

Catatan:Meskipun kami secara eksplisit menyebutkan file1_method1() pytest tidak akan menjalankan metode ini.

Jalankan Beberapa Pengujian Dari File Tertentu dan Beberapa File

Saat ini, di dalam folder study_pytest, kami memiliki file test_sample1.py. Misalkan kita memiliki banyak file , katakanlah test_sample2.py , test_sample3.py. Untuk menjalankan semua tes dari semua file dalam folder dan subfolder, kita hanya perlu menjalankan perintah pytest.

py.test

Ini akan menjalankan semua nama file yang dimulai dengan test_ dan nama file yang diakhiri dengan _test di folder itu dan subfolder di bawah folder itu.

Untuk menjalankan tes hanya dari file tertentu, kita dapat menggunakan py.test

py.test test_sample1.py

Jalankan subset dari Seluruh Pengujian dengan PyTest

Terkadang kami tidak ingin menjalankan seluruh rangkaian pengujian. Pytest memungkinkan kita untuk menjalankan tes tertentu. Kita bisa melakukannya dengan 2 cara

Kami sudah memiliki test_sample1.py. Buat file test_sample2.py dan tambahkan kode di bawah ini ke dalamnya

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"

Jadi saat ini kami memiliki

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

Opsi 1) Jalankan pengujian dengan pencocokan substring

Di sini untuk menjalankan semua tes yang memiliki method1 dalam namanya, kita harus menjalankan

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

Jadi menjalankan py.test -k method1 -v akan memberi Anda hasil berikut

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 ===============================

Di sini Anda dapat melihat menjelang akhir 2 pengujian yang tidak dipilih oleh ‘-kmethod1’ yaitu test_file1_method2 dan test_file2_method2

Coba jalankan dengan berbagai kombinasi seperti:-

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'

Opsi 2) Jalankan pengujian dengan penanda

Pytest memungkinkan kita untuk menyetel berbagai atribut untuk metode pengujian menggunakan penanda pytest, @pytest.mark . Untuk menggunakan marker dalam file pengujian, kita perlu mengimpor pytest pada file pengujian.

Di sini kita akan menerapkan nama penanda yang berbeda untuk menguji metode dan menjalankan tes khusus berdasarkan nama penanda. Kita dapat menentukan penanda pada setiap nama tes dengan menggunakan

@pytest.mark.<name>.			

Kami mendefinisikan marker set1 dan set2 pada metode pengujian, dan kami akan menjalankan pengujian menggunakan nama marker. Perbarui file uji dengan kode berikut

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"

Kita dapat menjalankan tes yang ditandai dengan

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

Jalankan py.test -m set1.Ini akan menjalankan metode test_file1_method1, test_file2_method1, test_file2_method2.

Menjalankan py.test -m set2 akan menjalankan test_file1_method2.

Jalankan Pengujian Secara Paralel dengan Pytest

Biasanya, rangkaian pengujian akan memiliki beberapa file pengujian dan ratusan metode pengujian yang akan membutuhkan banyak waktu untuk dieksekusi. Pytest memungkinkan kita menjalankan pengujian secara paralel.

Untuk itu kita perlu menginstall pytest-xdist terlebih dahulu dengan menjalankan

pip install pytest-xdist

Anda dapat menjalankan pengujian sekarang dengan

py.test -n 4

-n menjalankan tes dengan menggunakan banyak pekerja. Pada perintah di atas, akan ada 4 pekerja untuk menjalankan pengujian.

Fitur Pytest

Fixtures digunakan ketika kita ingin menjalankan beberapa kode sebelum setiap metode pengujian. Jadi, alih-alih mengulangi kode yang sama di setiap pengujian, kami mendefinisikan perlengkapan. Biasanya, perlengkapan digunakan untuk menginisialisasi koneksi database, melewati basis, dll

Sebuah metode ditandai sebagai perlengkapan Pytest dengan menandai dengan

@pytest.fixture

Metode pengujian dapat menggunakan perlengkapan Pytest dengan menyebutkan perlengkapan sebagai parameter input.

Buat file baru test_basic_fixture.py dengan kode berikut

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"

Disini

Setiap fungsi pengujian memiliki argumen input yang namanya cocok dengan perlengkapan yang tersedia. Pytest kemudian memanggil metode fixture yang sesuai dan nilai yang dikembalikan akan disimpan dalam argumen input , di sini daftarnya [25,35,45]. Sekarang item daftar digunakan dalam metode pengujian untuk perbandingan.

Sekarang jalankan tes dan lihat hasilnya

 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_comparewithBB lulus sejak zz=BB=35, dan 2 tes lainnya gagal.

Metode fixture memiliki cakupan hanya di dalam file pengujian yang ditentukan. Jika kami mencoba mengakses perlengkapan di beberapa file uji lain, kami akan mendapatkan kesalahan yang mengatakan perlengkapan ‘supply_AA_BB_CC’ tidak ditemukan untuk metode pengujian di file lain.

Untuk menggunakan fixture yang sama terhadap beberapa file pengujian, kita akan membuat metode fixture dalam file bernama conftest.py.

Mari kita lihat ini dengan contoh PyTest di bawah ini. Buat 3 file conftest.py, test_basic_fixture.py, test_basic_fixture2.py dengan kode berikut

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 akan mencari fixture di file test terlebih dahulu dan jika tidak ditemukan akan mencari di conftest.py

Jalankan tes dengan py.test -k test_comparewith -v untuk mendapatkan hasil seperti di bawah ini

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

Uji Parameter Pytest

Tujuan dari parameterisasi pengujian adalah untuk menjalankan pengujian terhadap beberapa set argumen. Kita bisa melakukannya dengan @pytest.mark.parametrize.

Kita akan melihat ini dengan contoh PyTest di bawah ini. Di sini kita akan meneruskan 3 argumen ke metode pengujian. Metode pengujian ini akan menambahkan 2 argumen pertama dan membandingkannya dengan argumen ke-3.

Buat file tes test_addition.py dengan kode di bawah ini

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"

Di sini metode pengujian menerima 3 argumen- input1, input2, output. Ia menambahkan input1 dan input2 dan membandingkannya dengan output.

Mari kita jalankan tes dengan py.test -k test_add -v dan lihat hasilnya

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

Anda dapat melihat tes berjalan 2 kali – satu memeriksa 5+5 ==10 dan lainnya memeriksa 3+5 ==12

test_addition.py::test_add[5-5-10] LULUS

test_addition.py::test_add[3-5-12] GAGAL

Pytest Xfail / Lewati Tes

Akan ada beberapa situasi di mana kita tidak ingin melakukan pengujian, atau kasus pengujian tidak relevan untuk waktu tertentu. Dalam situasi tersebut, kami memiliki opsi untuk Xfail tes atau melewatkan tes

Tes xfailed akan dijalankan, tetapi tidak akan dihitung sebagai bagian yang gagal atau lulus tes. Tidak akan ada traceback yang ditampilkan jika tes itu gagal. Kami dapat gagal menguji menggunakan

@pytest.mark.xfail.

Melewatkan tes berarti tes tidak akan dijalankan. Kita dapat melewati tes menggunakan

@pytest.mark.skip.

Edit test_addition.py dengan kode di bawah ini

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"

Disini

Jalankan tes dengan py.test test_addition.py -v dan lihat hasilnya

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 =================

Hasil XML

Kami dapat membuat hasil pengujian dalam format XML yang dapat kami masukkan ke server Continuous Integration untuk diproses lebih lanjut dan sebagainya. Ini dapat dilakukan dengan

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

Hasil.xml akan merekam hasil eksekusi pengujian. Temukan contoh result.xml di bawah

<?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>

Dari

test_list_user.py – berisi metode pengujian untuk mendaftar pengguna yang valid dan tidak valid

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 – berisi metode pengujian untuk menguji fungsionalitas login.

import pytest
import requests
import json
def test_login_valid(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'[email protected]','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':'[email protected]'}
	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

Jalankan tes menggunakan py.test -v

Lihat hasilnya sebagai

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

Perbarui pengujian dan coba berbagai keluaran

Ringkasan

Dalam tutorial PyTest ini, kami membahas


Python

  1. Cara Memasang WordPress di Google Cloud
  2. Tutorial Kerangka Kerja Otomasi Tes UI Berkode
  3. Apa Itu Kunci Keamanan Jaringan? Bagaimana Cara Menemukannya?
  4. Apa Itu Panggilan WiFi? Bagaimana Cara Kerjanya?
  5. Apa Itu 6G, dan Seberapa Cepat Itu?
  6. Cara Memasang Dock Leveler
  7. Pengujian Pelepasan Sebagian:Apa Itu &Bagaimana Cara Kerjanya
  8. Apa itu Kavitasi Pompa dan Bagaimana Cara Menghindarinya?
  9. Apa itu Copper Brazing dan Bagaimana Cara Melakukannya?
  10. Apa Itu Backlog Pemeliharaan? Bagaimana Mengatasinya?