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
Sangat mudah untuk memulai karena sintaksnya yang sederhana dan mudah.
Dapat menjalankan pengujian secara paralel.
Dapat menjalankan pengujian tertentu atau sebagian pengujian
Mendeteksi pengujian secara otomatis
Lewati tes
Sumber terbuka
Dalam tutorial Python PyTest ini, Anda akan belajar:
Apa itu PyTest?
Mengapa menggunakan PyTest?
Cara menginstal PyTest
PyTest Dasar Pertama
Pernyataan dalam PyTest
Bagaimana PyTest Mengidentifikasi File Pengujian dan Metode Pengujian
Jalankan Beberapa Pengujian Dari File Tertentu dan Beberapa File
Jalankan subset dari Seluruh Pengujian dengan PyTest
Jalankan Pengujian Secara Paralel dengan Pytest
Perlengkapan Pytest
Uji Parameter Pitest
Pytest Xfail / Lewati Tes
Hasil XML
Pytest Framework Menguji API
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
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
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
Pengelompokan nama pengujian menurut pencocokan substring
Pengelompokan tes berdasarkan penanda
Kami sudah memiliki test_sample1.py. Buat file test_sample2.py dan tambahkan kode di bawah ini ke dalamnya
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
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
Kami memiliki perlengkapan bernama supply_AA_BB_CC. Metode ini akan mengembalikan daftar 3 nilai.
Kami memiliki 3 metode pengujian yang membandingkan setiap nilai.
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
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
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
test_add_1 dan test_add_2 dilewati dan tidak akan dieksekusi.
test_add_3 dan test_add_4 gagal. Pengujian ini akan dijalankan dan akan menjadi bagian dari pengujian xfailed(pada kegagalan pengujian) atau xpassed(pada pengujian lulus). Tidak akan ada jejak balik untuk kegagalan.
test_add_5 dan test_add_6 akan dijalankan dan test_add_6 akan melaporkan kegagalan dengan traceback saat test_add_5 lulus
Jalankan tes dengan py.test test_addition.py -v dan lihat hasilnya
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
Instal pytest menggunakan pip install pytest=2.9.1
Program pytest sederhana dan jalankan dengan perintah py.test.
Pernyataan pernyataan, tegaskan x==y, akan mengembalikan Benar atau Salah.
Bagaimana pytest mengidentifikasi file dan metode pengujian.
Uji file yang dimulai dengan test_ atau diakhiri dengan _test
Metode pengujian dimulai dengan pengujian
Perintah py.test akan menjalankan semua file pengujian di folder dan subfolder itu. Untuk menjalankan file tertentu, kita dapat menggunakan perintah py.test
Jalankan subset metode pengujian
Pengelompokan nama pengujian menurut substring matching.py.test -k -v akan menjalankan semua pengujian yang memiliki di namanya.
Jalankan pengujian dengan marker. Tandai pengujian menggunakan @pytest.mark. dan jalankan pengujian menggunakan pytest -m untuk menjalankan pengujian yang ditandai sebagai .
Jalankan pengujian secara paralel
Instal pytest-xdist menggunakan pip install pytest-xdist
Jalankan pengujian menggunakan py.test -n NUM dengan NUM adalah jumlah pekerja
Membuat metode fixture untuk menjalankan kode sebelum setiap pengujian dengan menandai metode dengan @pytest.fixture
Cakupan metode fixture berada di dalam file yang ditentukan.
Metode fixture dapat diakses di beberapa file pengujian dengan mendefinisikannya dalam file conftest.py.
Metode pengujian dapat mengakses perlengkapan Pytest dengan menggunakannya sebagai argumen masukan.
Menguji parameter untuk menjalankannya terhadap beberapa set input. @pytest.mark.parametrize(“input1, input2, output”,[(5,5,10),(3,5,12)] ) def test_add(input1, input2, output): tegaskan input1+input2 ==output,”gagal" akan menjalankan tes dengan input (5,5,10) dan (3 ,5,12)
Lewati/xfail pengujian menggunakan @pytets.mark.skip dan @pytest.mark.xfail
Buat hasil pengujian dalam format XML yang mencakup detail pengujian yang dijalankan menggunakan py.test test_sample1.py -v –junitxml=”result.xml”