Cara Mengatur dan Menjalankan Tes Python Pytest
Table of content:
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 buat lingkungan virtual untuk mengisolasi lingkungan pengujian Anda, sehingga Anda dapat menghindari konflik dengan paket dan dependensi lain.
Untuk membuat lingkungan virtual, jalankan perintah berikut sebelum menginstal Pytest.
python -m venv tests
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:
source tests/bin/activate
Untuk Windows, jalankan perintah ini:
tests\\Scripts\\activate
Untuk menginstal Pytest, Anda dapat menggunakan pip, pengelola paket Python, dengan perintah ini di terminal Anda:
pip install pytest
Jika Anda tidak memiliki Pip, jangan khawatir; Anda dapat menginstal Pip di Windows, Mac, dan Linux.
Jalankan perintah berikut untuk memeriksa apakah Anda menginstal Pytest dengan benar.
pytest --version
Ini harus mengembalikan nomor versi yang diinstal.
Membuat Tes Pertama Anda
Pertimbangkan fungsi berikut yang menambahkan dua angka dan mengembalikan hasilnya.
def add_numbers(a, b):
return 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:
def test_add_numbers():
assert add_numbers(2, 3) == 5
assert add_numbers(-1, 1) == 0
assert add_numbers(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:
def test_add_numbers():
assert add_numbers(2, 3) == 6
assert add_numbers(-1, 1) == 0
assert add_numbers(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.
import pytestdef test_add_numbers_with_invalid_inputs():
with pytest.raises(TypeError):
add_numbers(None, 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, nyatakan pesan pengecualian seperti ini:
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'"
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:
def test_add_numbers():
assert add_numbers(2, 3) == 6
assert add_numbers(-1, 1) == 0
assert add_numbers(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:
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
Cara Menjalankan Beberapa Tes
Sejauh ini, Anda hanya menulis dua tes 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.
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'"
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.