Alıştırma
Bu alıştırmada, bir işlevi test etmek için parametrize ile kullanacaksınız pytest. Ardından, bir test sınıfını ve setup() yöntemi yerine bir fikstür kullanacak şekilde teardown() güncelleştirirsiniz. Parametriyi kullanmak ve fikstürlerle çalışmak, test oluştururken veya güncelleştirirken daha esnek olmanıza olanak tanır.
1. Adım - Bu alıştırma için testleri olan bir dosya ekleme
test_advanced.py adlı yeni bir test dosyası oluşturun ve aşağıdaki kodu ekleyin:
def str_to_bool(string): if string.lower() in ['yes', 'y', '1']: return True elif string.lower() in ['no', 'n', '0']: return Falseİşlev
str_to_bool()bir dizeyi giriş olarak kabul eder ve içeriğine bağlı olarak birTrueveyaFalsedeğeri döndürür.Aynı dosyaya işlevin testlerini
str_to_bool()ekleyin. Önce tüm gerçek değerleri test etmek için kullanınpytest.mark.parametrize():import pytest @pytest.mark.parametrize("string", ['Y', 'y', '1', 'YES']) def test_str_to_bool_true(string): assert str_to_bool(string) is TrueArdından, false değerleriyle başka bir test ekle:
@pytest.mark.parametrize("string", ['N', 'n', '0', 'NO']) def test_str_to_bool_false(string): assert str_to_bool(string) is FalseArtık hem hem de dönüş değerleri için tüm olası girişleri kapsayan
TrueFalseiki test vardır.
Not
Gerçek kodla aynı dosyada testlerin olması yaygın değildir. Kolaylık olması için, bu alıştırmadaki örneklerde aynı dosyada gerçek kod bulunur. Gerçek dünyadaki Python projelerinde, testlerin test ettiği koddan dosya ve dizinlerle ayrıldığını göreceksiniz.
2. Adım - Testleri çalıştırma ve raporu keşfetme
Testleri ekledikten sonra, sonraki adım çıkışı çalıştırmak pytest ve incelemektir. Tüm giriş değerlerinin ayrı bir test olarak değerlendirildiğini görebilmek için artırılmış ayrıntı bayrağını (-v) kullanın.
$ 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 ===============================
Yalnızca iki test işlevi yazmanıza rağmen işlevi pytest sayesinde parametrize() toplamda sekiz test oluşturabildi.
3. Adım - Mevcut bir testi fikstüre taşıma
test_advanced.py dosyasına yeni bir sınıf tabanlı test ekleyin. Bu test, üzerinde metin
setup()teardown()bulunan geçici bir dosya oluşturan ve işlevini kullanmalıdır. Her test sonrasında dosya kaldırılır. Şu şekilde görünmelidir: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"Bu test sınıfı bir dosya oluşturur, ancak /tmp/ yolunun her sistemde mevcut olması garanti edilmediğinden sorunludur.
Dosyaya
pytesttmpdir()yazmak ve yolu döndürmek için fikstür kullanan bir fikstür oluşturun:import pytest @pytest.fixture def tmpfile(tmpdir): def write(): file = tmpdir.join("done") file.write("1") return file.strpath return writeFikstür
tmpfile(), testler yapıldıktan sonra temizlenen geçerli bir geçici dosya garanti eden pytesttmpdir()fikstür kullanır.TestFileyardımcı yöntemleri yerine fikstür kullanması için sınıfını güncelleştirin:class TestFile: def test_f(self, tmpfile): path = tmpfile() with open(path) as _f: contents = _f.read() assert contents == "1"Bu test sınıfı artık geçici bir dosyanın oluşturulduğundan ve onaylama işleminin çalışması için uygun içeriklere sahip olduğundan emin olabilir.
Çalışmanızı denetleyin
Şu anda aşağıdaki koda sahip test_advanced.py adlı bir Python dosyanız olmalıdır:
- Bir
str_to_bool()dizeyi kabul eden ve dizenin içeriğine bağlı olarak boole değeri döndüren bir işlev. - biri değerleri test eden diğeri de değerleri test
str_to_bool()eden işlev içinTrueiki parametrized testFalse. - Bazı içerikleri içeren geçici
pytestoluşturmak için fikstür kullanantmpdir()özel bir fikstür. - Dosyayı oluşturmak için özel
tmpfile()fikstür kullanan bir test sınıfı.
Tüm testler terminalde çalıştırılırken hata olmadan geçmelidir.