Latihan
Dalam latihan ini, Anda akan menggunakan pytest dengan parametrize untuk menguji fungsi. Kemudian, Anda memperbarui kelas pengujian untuk menggunakan perlengkapan alih-alih setup() metode dan teardown() . Menggunakan parametrize dan bekerja dengan perlengkapan memungkinkan Anda menjadi lebih fleksibel saat membuat atau memperbarui pengujian.
Langkah 1 - Tambahkan file dengan pengujian untuk latihan ini
Buat file pengujian baru yang disebut test_advanced.py dan tambahkan kode berikut:
def str_to_bool(string): if string.lower() in ['yes', 'y', '1']: return True elif string.lower() in ['no', 'n', '0']: return FalseFungsi
str_to_bool()menerima string sebagai input dan bergantung pada kontennya, fungsi mengembalikan nilaiTrueatauFalse.Di file yang sama, tambahkan pengujian untuk fungsi
str_to_bool(). Gunakanpytest.mark.parametrize()untuk menguji semua nilai true terlebih dahulu:import pytest @pytest.mark.parametrize("string", ['Y', 'y', '1', 'YES']) def test_str_to_bool_true(string): assert str_to_bool(string) is TrueSelanjutnya, tambahkan pengujian lain dengan nilai false:
@pytest.mark.parametrize("string", ['N', 'n', '0', 'NO']) def test_str_to_bool_false(string): assert str_to_bool(string) is FalseSekarang ada dua pengujian yang mencakup semua input yang mungkin untuk
Truenilai danFalsepengembalian.
Catatan
Tidak umum untuk memiliki pengujian dalam file yang sama dengan kode aktual. Untuk kesederhanaan, contoh dalam latihan ini akan memiliki kode aktual dalam file yang sama. Dalam proyek Python dunia nyata, Anda akan menemukan bahwa pengujian dipisahkan oleh file dan direktori dari kode yang sedang diuji.
Langkah 2 - Jalankan pengujian dan jelajahi laporan
Setelah Anda menambahkan pengujian, langkah selanjutnya adalah menjalankan pytest dan memeriksa output. Gunakan bendera verbositas yang ditingkatkan (-v) sehingga Anda dapat melihat semua nilai input diperlakukan sebagai pengujian terpisah.
$ pytest -v test_avanced.py
============================= test session starts ==============================
Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /private
collected 8 items
test_advanced.py::test_str_to_bool_true[Y] PASSED [ 12%]
test_advanced.py::test_str_to_bool_true[y] PASSED [ 25%]
test_advanced.py::test_str_to_bool_true[1] PASSED [ 37%]
test_advanced.py::test_str_to_bool_true[YES] PASSED [ 50%]
test_advanced.py::test_str_to_bool_false[N] PASSED [ 62%]
test_advanced.py::test_str_to_bool_false[n] PASSED [ 75%]
test_advanced.py::test_str_to_bool_false[0] PASSED [ 87%]
test_advanced.py::test_str_to_bool_false[NO] PASSED [100%]
============================== 8 passed in 0.01s ===============================
Meskipun Anda hanya menulis dua fungsi pengujian, pytest mampu membuat delapan pengujian secara total berkat fungsi tersebut parametrize() .
Langkah 3 - Port pengujian yang ada ke perlengkapan
Tambahkan pengujian berbasis kelas baru ke file test_advanced.py . Pengujian ini harus menggunakan fungsi
setup()danteardown()yang membuat file sementara dengan beberapa teks di dalamnya. Setelah setiap pengujian, file akan dihapus. Harusnya akan terlihat seperti ini:import os class TestFile: def setup(self): with open("/tmp/done", 'w') as _f: _f.write("1") def teardown(self): try: os.remove("/tmp/done") except OSError: pass def test_done_file(self): with open("/tmp/done") as _f: contents = _f.read() assert contents == "1"Kelas pengujian ini membuat file, tetapi bermasalah karena jalur /tmp/ tidak dijamin ada di setiap sistem.
Buat perlengkapan yang menggunakan
pytesttmpdir()perlengkapan untuk menulis ke file dan mengembalikan jalur:import pytest @pytest.fixture def tmpfile(tmpdir): def write(): file = tmpdir.join("done") file.write("1") return file.strpath return writePerlengkapan ini
tmpfile()menggunakan perlengkapan pytesttmpdir(), yang menjamin file sementara yang valid yang dibersihkan setelah pengujian selesai.TestFilePerbarui kelas sehingga menggunakan fixture alih-alih dari metode pembantu:class TestFile: def test_f(self, tmpfile): path = tmpfile() with open(path) as _f: contents = _f.read() assert contents == "1"Kelas pengujian ini sekarang dapat memastikan bahwa file sementara dibuat dan memiliki konten yang tepat agar pernyataan berfungsi.
Periksa pekerjaan Anda
Sekarang Anda harus memiliki file Python bernama test_advanced.py dengan kode berikut:
- Fungsi
str_to_bool()yang menerima string dan mengembalikan nilai boolean tergantung pada konten string. - Dua pengujian parametris untuk fungsi,
str_to_bool()satu yang mengujiTruenilai dan yang lain yang mengujiFalsenilai. - Perlengkapan khusus
pytestyang menggunakan fixturetmpdir()untuk membuat file sementara selesai dengan beberapa konten. - Kelas pengujian yang menggunakan perlengkapan
tmpfile()khusus untuk membuat file.
Semua pengujian harus lulus saat menjalankannya di terminal, tanpa kesalahan.