koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da bir işlevin özel bir durum (exception) oluşturmasını nasıl sınarız?

Python işlevinin bir özel durum oluşturmasını nasıl sınarsınız?

Yalnızca bir işlev beklenen bir özel durum oluşturmadığında başarısız olan bir testi nasıl yazarsınız?

Kısa Cevap:

self.assertRaises yöntemini bağlam yöneticisi olarak kullanabiliriz:

    def test_1_int_ve_str_ekleme(self):
        with self.assertRaises(TypeError):
            1 + '1'

Kullanım

Bu kullanımı bir Python kabuğunda görmek oldukça kolay:

Unittest kitaplığı

Python 2.7 veya 3’te:

import unittest

Python 2.6’da ise Python 2.7’ye ait unittest2 kütüphanesini yükleyebiliriz:

import unittest2 as unittest

Örnek testler

Şimdi, Python kabuğunda aşağıdaki type testini çalıştıralım:

class MyTestCase(unittest.TestCase):
    def test_1_int_ve_str_ekleme(self):
        with self.assertRaises(TypeError):
            1 + '1'
    def test_2_int_ve_str_ekleme(self):
        import operator
        self.assertRaises(TypeError, operator.add, 1, '1')

Test bir, hatanın kaydedilirken düzgün bir şekilde yakalanmasını ve temizlenmesini sağlarken bağlam yöneticisi olarak assertRaises kullanılır.

Bunu bağlam yöneticisi olmadan da yazabiliriz. Bunun için test 2’ye bakalım. İlk bağımsız değişken, karşılaşmayı beklediğiniz hata türünü, ikinci bağımsız değişken ise test ettiğiniz işlev ile birlikte argümanları bu işleve geçirir.

Bağlam yöneticisini kullanmak çok daha basit, okunabilir ve sürdürülebilir olacaktır.

Testleri çalıştırma

Testleri çalıştırmak için:

unittest.main(exit=False)

Python 2.6’da muhtemelen aşağıdakilere ihtiyacınız olacaktır:

unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(MyTestCase))

Terminalden aşağıdaki çıktıları almanız beklenir:

..
----------------------------------------------------------------------
Ran 2 tests in 0.007s

OK
<unittest2.runner.TextTestResult run=2 errors=0 failures=0>

Sonuçta beklediğimiz şekilde, 1 ve ‘1”i eklemek TypeError hatasına neden oluyor.


Daha ayrıntılı bir çıktı için aşağıdakini de deneyebilirsiniz:

unittest.TextTestRunner(verbosity=2).run(unittest.TestLoader().loadTestsFromTestCase(MyTestCase))

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top