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))