Menyiapkan suite pengujian untuk kode Anda mungkin terasa seperti rintangan yang belum siap Anda hadapi, tetapi pustaka ini membutuhkan banyak tekanan.
Pengujian adalah bagian penting dari pengembangan perangkat lunak. Ini membantu menangkap bug lebih awal dan mengurangi kemungkinan kesalahan di kemudian hari.
Pytest adalah salah satu kerangka pengujian paling populer untuk Python. Ini memungkinkan Anda menulis pengujian kecil dan mudah dibaca yang dapat diskalakan seiring pertumbuhan aplikasi Anda. Pelajari cara menyiapkan dan menggunakan Pytest dengan kode Python Anda.
Menyiapkan Pytest
Sebelum menginstal Pytest, sebaiknya membuat lingkungan virtual untuk mengisolasi lingkungan pengujian Anda, sehingga Anda dapat menghindari konflik dengan paket dan dependensi lainnya.
Untuk membuat lingkungan virtual, jalankan perintah berikut sebelum menginstal Pytest.
pengujian python -m venv
Ini akan membuat lingkungan virtual baru bernama tes di direktori Anda saat ini. Untuk mengaktifkan lingkungan, jalankan perintah ini jika Anda menggunakan Linux atau Mac:
tes sumber/bin/aktifkan
Untuk Windows, jalankan perintah ini:
tes\\Scripts\\aktifkan
Untuk menginstal Pytest, Anda dapat menggunakan pip, pengelola paket Python, dengan perintah ini di terminal Anda:
pip instal pytest
Jika Anda tidak memiliki Pip, jangan khawatir; kamu bisa instal Pip di Windows, Mac, dan Linux.
Jalankan perintah berikut untuk memeriksa apakah Anda menginstal Pytest dengan benar.
pytest --versi
Ini harus mengembalikan nomor versi yang diinstal.
Membuat Tes Pertama Anda
Pertimbangkan fungsi berikut yang menambahkan dua angka dan mengembalikan hasilnya.
defadd_numbers(a, b):
kembali a + b
Beberapa hal bisa salah dengan fungsi ini. Misalnya, pertimbangkan apa yang terjadi jika Anda memanggil fungsi dengan nilai non-numerik seperti Tidak ada atau nilai bertipe string. Ini adalah beberapa kasus tepi potensial yang dapat menyebabkan fungsi gagal.
Salah satu tes pertama yang Anda tulis harus memeriksa apakah fungsi mengembalikan hasil yang diharapkan. Untuk melakukan ini, Anda dapat menggunakan kata kunci assert untuk membandingkan keluaran sebenarnya dari fungsi dengan keluaran yang diharapkan. Dalam kasus fungsi add_numbers, fungsi tes mungkin terlihat seperti ini:
deftest_add_numbers():
menegaskan tambah_angka(2, 3) == 5
menegaskan tambah_angka(-1, 1) == 0
menegaskan tambah_angka(0, 0) == 0
Fungsi pengujian ini mencakup tiga pernyataan penegasan, yang masing-masing membandingkan keluaran fungsi add_numbers dengan nilai yang diharapkan. Tes pertama memeriksa bahwa menambahkan 2 dan 3 menghasilkan 5, tes kedua memeriksa bahwa menambahkan -1 dan 1 menghasilkan 0, dan tes ketiga memeriksa bahwa menambahkan 0 dan 0 menghasilkan 0.
Cara Menjalankan Tes Dengan Pytest
Setelah Anda menulis tes Anda, langkah selanjutnya adalah menjalankannya. Untuk melakukan ini dengan Pytest, navigasikan ke direktori yang berisi file pengujian Anda dan jalankan perintah pytest:
pytest
Jika semuanya berfungsi seperti yang diharapkan, Anda akan melihat pesan yang menunjukkan bahwa semua tes berhasil. Namun, jika ada pernyataan yang gagal, Pytest akan melaporkan kesalahan dan menunjukkan kepada Anda nilai masukan yang menyebabkan kegagalan.
Misalnya, Anda menjalankan fungsi pengujian berikut untuk fungsi add_numbers:
deftest_add_numbers():
menegaskan tambah_angka(2, 3) == 6
menegaskan tambah_angka(-1, 1) == 0
menegaskan tambah_angka(0, 0) == 0
Pernyataan pertama akan gagal karena nilai yang diharapkan adalah 6, tetapi nilai sebenarnya adalah 5 (jumlah dari 2 dan 3). Pytest akan mengembalikan pesan berikut:
Pesan ini menunjukkan kepada Anda nilai input yang menyebabkan nilai tersebut dan juga memberi tahu Anda nilai sebenarnya yang seharusnya. Ini memudahkan untuk mengidentifikasi dan memperbaiki kesalahan dalam kode Anda dengan cepat.
Menggunakan Pytest.raises untuk Menegaskan Pengecualian
Sekarang, mari kita tulis pengujian untuk membahas salah satu kasus tepi dari fungsi add_numbers. Saat Anda meneruskan argumen non-numerik seperti None ke fungsi, Python harus memunculkan pengecualian TypeError.
Anda seharusnya sudah menangani pengecualian dalam program Python Anda, dan Anda dapat menguji apakah kode Anda memunculkannya dengan benar juga.
Untuk melakukannya, salin fungsi tes berikut di file Anda. Ia menggunakan manajer konteks pytest.raises untuk memeriksa apakah memanggil fungsi add_number dengan "None" memunculkan pengecualian TypeError.
impor pytest
deftest_add_numbers_with_invalid_inputs():
dengan pytest.menaikkan (TypeError):
tambah_angka(Tidak ada, 2)
Kemudian jalankan Pytest dari baris perintah. Jika pengecualian tidak dimunculkan, pengujian akan gagal.
Anda dapat melangkah lebih jauh dan memeriksa detail pesan pengecualian. Manajer konteks menghasilkan objek ExceptionInfo dengan detailnya.
Misalnya, dalam fungsi pengujian ini, tegaskan pesan pengecualian seperti ini:
deftest_add_numbers_with_invalid_inputs():
dengan pytest.memunculkan(TypeError) sebagai exc_info:
tambah_angka(Tidak ada, 2)
menegaskan exc_info.nilai.args[0] == "tipe operan yang tidak didukung untuk +: 'NoneType' dan 'int'"
Jika pesan tidak cocok dengan yang ada di pengujian, Pytest akan menunjukkan kegagalan.
Cara Menggunakan Pengujian Parameter untuk Menguji Beberapa Input Sekaligus
Alih-alih secara manual memanggil fungsi dengan banyak masukan seperti ini:
deftest_add_numbers():
menegaskan tambah_angka(2, 3) == 6
menegaskan tambah_angka(-1, 1) == 0
menegaskan tambah_angka(0, 0) == 0
Pytest menyediakan fitur pengujian berparameter yang memungkinkan Anda melakukan hal yang sama dengan lebih mudah. Inilah cara Anda dapat menulis ulang fungsi pengujian di atas:
impor pytest
@pytest.mark.parametrikan("a, b, diharapkan", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, diharapkan):
menegaskanadd_numbers(a, b)== diharapkan
Cara Menjalankan Beberapa Tes
Sejauh ini, Anda hanya menulis dua pengujian untuk fungsi add_numbers. Untuk fungsi yang lebih kompleks dengan lebih banyak pengujian, Anda mungkin ingin mengelompokkannya dalam sebuah kelas.
Misalnya, berikut adalah cara membuat kelas pengujian untuk fungsi add.
kelasTestAddFunction:
@pytest.mark.parametrize("a, b, diharapkan", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(diri, a, b, diharapkan):
menegaskan add_numbers (a, b) == diharapkan
deftest_add_numbers_with_invalid_inputs(diri sendiri):
dengan pytest.menaikkan (TypeError) sebagai exc_info:
tambah_angka(Tidak ada, 2)
menegaskan exc_info.nilai.args[0] == "tipe operan yang tidak didukung untuk +: 'NoneType' dan 'int'"
Perhatikan bahwa Anda perlu mengawali nama kelas dengan "Test" agar Pytest dapat mengidentifikasinya sebagai kelas pengujian dan menjalankannya.
Pytest Memiliki Lebih Banyak Fitur
Dengan menggunakan Pytest, Anda dapat secara otomatis memverifikasi bahwa kode Anda berfungsi seperti yang Anda harapkan. Pytest menawarkan banyak fitur lain seperti perlengkapan yang memungkinkan Anda menyiapkan dan menghancurkan data pengujian dan menandai untuk menyiapkan metadata pada fungsi pengujian Anda.
Selain itu, Anda dapat mengintegrasikan Pytest dalam pipeline CI dan mulai menjalankan pengujian secara otomatis dan terus menerus saat Anda mengubah kode.