Cara Mengatur dan Menjalankan Tes Python Pytest

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:

Keluaran dari proses pytest yang menunjukkan satu pengujian gagal

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 pytest

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

Tags

Related Post