Kodunuz için bir test paketi ayarlamak, hazır olmadığınız bir engel gibi gelebilir, ancak bu kitaplık çok fazla çaba gerektirir.

Test, yazılım geliştirmenin önemli bir parçasıdır. Hataların erkenden yakalanmasına yardımcı olur ve hata olasılığını azaltır.

Pytest, Python için en popüler test çerçevelerinden biridir. Uygulamanız büyüdükçe ölçeklenebilen küçük ve okunabilir testler yazmanıza olanak tanır. Python kodunuzla Pytest'i nasıl kuracağınızı ve kullanacağınızı öğrenin.

Pytest'i Kurma

Pytest'i kurmadan önce, en iyisi sanal ortam oluşturmak test ortamınızı izole etmek için, böylece diğer paketler ve bağımlılıklarla çakışmaları önleyebilirsiniz.

Sanal ortam oluşturmak için Pytest'i kurmadan önce aşağıdaki komutu çalıştırın.

piton -m venv testleri

Bu, mevcut dizininizde testler adlı yeni bir sanal ortam yaratacaktır. Ortamı etkinleştirmek için, Linux veya Mac kullanıyorsanız bu komutu çalıştırın:

kaynak testleri/bin/etkinleştir

Windows için şu komutu çalıştırın:

testler\\Komut Dosyaları\\etkinleştir
instagram viewer

Pytest'i kurmak için, Python paket yöneticisi pip'i terminalinizde şu komutla kullanabilirsiniz:

pip kurulumu pytest

Pip'iniz yoksa endişelenmeyin; yapabilirsiniz Pip'i Windows, Mac ve Linux'a kurun.

Pytest'i doğru bir şekilde kurup kurmadığınızı kontrol etmek için aşağıdaki komutu çalıştırın.

pytest --versiyon

Bu, kurulu sürüm numarasını döndürmelidir.

İlk Testinizi Oluşturma

İki sayı toplayan ve sonucu döndüren aşağıdaki işlevi göz önünde bulundurun.

kesinsayı_ekle(bir, b):
geri dönmek bir + b

Bu işlevle ilgili birkaç şey ters gidebilir. Örneğin, işlevi Yok gibi sayısal olmayan değerlerle veya dize türünde bir değerle çağırırsanız ne olacağını düşünün. Bunlar, işlevin başarısız olmasına neden olabilecek potansiyel uç durumlardan bazılarıdır.

Yazdığınız ilk testlerden biri, işlevin beklenen sonucu döndürüp döndürmediğini kontrol etmelidir. Bunu yapmak için, fonksiyonun gerçek çıktısını beklenen çıktıyla karşılaştırmak için assert anahtar sözcüğünü kullanabilirsiniz. add_numbers işlevi söz konusu olduğunda, test işlevi şöyle görünebilir:

kesintest_add_numbers():
ileri sürmek sayı ekle(2, 3) == 5
ileri sürmek sayı ekle(-1, 1) == 0
ileri sürmek sayı ekle(0, 0) == 0

Bu test işlevi, her biri add_numbers işlevinin çıktısını beklenen bir değerle karşılaştıran üç iddia ifadesi içerir. İlk test, 2 ve 3'ü toplamanın 5'i döndürdüğünü kontrol eder, ikinci test, -1 ve 1'i toplamanın 0'ı döndürdüğünü ve üçüncü test, 0 ve 0'ı toplamanın 0'ı döndürdüğünü kontrol eder.

Pytest ile Testler Nasıl Çalıştırılır?

Testlerinizi yazdıktan sonraki adım onları çalıştırmaktır. Bunu Pytest ile yapmak için test dosyanızı içeren dizine gidin ve pytest komutunu çalıştırın:

pytest

Her şey beklendiği gibi çalışırsa, tüm testlerin başarıyla geçtiğini belirten bir mesaj göreceksiniz. Ancak iddialardan herhangi biri başarısız olursa, Pytest bir hata bildirir ve size hataya neden olan giriş değerlerini gösterir.

Örneğin, add_numbers işlevi için aşağıdaki test işlevini çalıştırdığınızı varsayalım:

kesintest_add_numbers():
ileri sürmek sayı ekle(2, 3) == 6
ileri sürmek sayı ekle(-1, 1) == 0
ileri sürmek sayı ekle(0, 0) == 0

İlk iddia başarısız olacak çünkü beklenen değer 6, ancak gerçek değer 5 (2 ve 3'ün toplamı) idi. Pytest aşağıdaki mesajı döndürür:

Bu mesaj size değere neden olan giriş değerlerini gösterir ve ayrıca gerçek değerin ne olması gerektiğini söyler. Bu, kodunuzdaki hataları hızlı bir şekilde belirlemenizi ve düzeltmenizi kolaylaştırır.

İstisnaları İddia Etmek İçin Pytest.raises Kullanma

Şimdi add_numbers fonksiyonunun uç durumlarından birini kapsayacak bir test yazalım. İşleve Yok gibi sayısal olmayan bir argüman ilettiğinizde, Python bir TypeError istisnası oluşturmalıdır.

zaten olmalısın Python programlarınızdaki istisnaları işlemeve kodunuzun bunları da doğru bir şekilde yükseltip yükseltmediğini test edebilirsiniz.

Bunu yapmak için aşağıdaki test işlevini dosyanıza kopyalayın. Add_number işlevini "Yok" ile çağırmanın bir TypeError istisnası oluşturup oluşturmadığını kontrol etmek için pytest.raises bağlam yöneticisini kullanır.

içe aktarmak pytest

kesintest_add_numbers_with_invalid_inputs():
ile pytest.raises (TypeError):
sayı ekle(Hiçbiri, 2)

Ardından Pytest'i komut satırından çalıştırın. İstisna oluşturulmazsa, test başarısız olur.

Daha ileri gidebilir ve istisna mesajının ayrıntılarını kontrol edebilirsiniz. Bağlam yöneticisi, ayrıntılarla birlikte bir İstisna Bilgisi nesnesi üretir.

Örneğin, bu test işlevinde istisna mesajını şu şekilde onaylayın:

kesintest_add_numbers_with_invalid_inputs():
ile pytest.yükseltme(Yazım Hatası) gibi exc_info:
sayı ekle(Hiçbiri, 2)

ileri sürmek exc_info.value.args[0] == "+ için desteklenmeyen işlenen türleri: 'NoneType' ve 'int'"

Eğer mesaj testteki ile uyuşmuyorsa, Pytest bir başarısızlık belirtecektir.

Birden Fazla Girişi Aynı Anda Test Etmek İçin Parametreli Test Nasıl Kullanılır?

Bunun gibi birden çok girdiye sahip bir işlevi manuel olarak çağırmak yerine:

kesintest_add_numbers():
ileri sürmek sayı ekle(2, 3) == 6
ileri sürmek sayı ekle(-1, 1) == 0
ileri sürmek sayı ekle(0, 0) == 0

Pytest, aynı şeyi daha kolay yapmanızı sağlayan parametreleştirilmiş bir test özelliği sağlar. Yukarıdaki test işlevini şu şekilde yeniden yazabilirsiniz:

içe aktarmak pytest

@pytest.mark.parametrize("a, b, bekleniyor", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
kesintest_add_numbers(a, b, beklenen):
ileri sürmeksayı_ekle(bir, b)== bekleniyor

Birden Çok Test Nasıl Çalıştırılır?

Şimdiye kadar, add_numbers işlevi için yalnızca iki test yazdınız. Daha fazla test içeren daha karmaşık işlevler için bunları bir sınıfta gruplandırmak isteyebilirsiniz.

Örneğin, toplama işlevi için bir test sınıfını nasıl oluşturacağınız aşağıda açıklanmıştır.

sınıfTestAddFonksiyonu:
@pytest.mark.parametrize("a, b, bekleniyor", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
kesintest_addition_with_numbers(öz, a, b, beklenen):
ileri sürmek add_numbers (a, b) == bekleniyor

kesintest_add_numbers_with_invalid_inputs(kendi):
ile pytest.raises (TypeError) gibi exc_info:
sayı ekle(Hiçbiri, 2)
ileri sürmek exc_info.value.args[0] == "+ için desteklenmeyen işlenen türleri: 'NoneType' ve 'int'"

Pytest'in onu bir test sınıfı olarak tanımlayıp çalıştırabilmesi için sınıf adının önüne "Test" koymanız gerektiğini unutmayın.

Pytest Daha Birçok Özelliğe Sahiptir

Pytest'i kullanarak, kodunuzun beklediğiniz gibi çalıştığını otomatik olarak doğrulayabilirsiniz. Pytest, test verilerini kurmanıza ve parçalamanıza izin veren fikstürler ve test işlevlerinizde meta verileri ayarlamak için işaretler gibi birçok başka özellik sunar.

Ek olarak, Pytest'i CI ardışık düzeninize entegre edebilir ve kodunuzu değiştirdiğinizde testleri otomatik ve sürekli olarak çalıştırmaya başlayabilirsiniz.