Latihan

Selesai

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

  1. 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 False
    
    

    Fungsi str_to_bool() menerima string sebagai input dan bergantung pada kontennya, fungsi mengembalikan nilai True atau False .

  2. Di file yang sama, tambahkan pengujian untuk fungsi str_to_bool(). Gunakan pytest.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 True
    
  3. Selanjutnya, 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 False
    

    Sekarang ada dua pengujian yang mencakup semua input yang mungkin untuk True nilai dan False pengembalian.

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

  1. Tambahkan pengujian berbasis kelas baru ke file test_advanced.py . Pengujian ini harus menggunakan fungsi setup() dan teardown() 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.

  2. 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 write
    

    Perlengkapan ini tmpfile() menggunakan perlengkapan pytest tmpdir() , yang menjamin file sementara yang valid yang dibersihkan setelah pengujian selesai.

  3. TestFile Perbarui 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 menguji True nilai dan yang lain yang menguji False nilai.
  • Perlengkapan khusus pytest yang menggunakan fixture tmpdir() 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.