İçeriğe geç

Python Unittest Skipping Tests

Test yazmak, yazılım projelerinde önem arz eden bir konu ve Python’ın yerleşik unittest kütüphanesi fazlasıyla kullanışlı.

Testler koşturulduktan sonra %100 başarı oranı almayı beklesekte, farklı durumlarda bazı testlerin çalıştırılmamasını, test sonucuna etki etmemesini ya da pipeline’ı kırmamasını bekleriz.

Örneğin yazılan feature Macos ve GNU/Linux ortamında çalışırken, Windows ortamında çalışmayabilir, ya da Django projenizde bir versiyon yükseltme çalışması yürütüyor ve bazı bağımlılıklarınızı henüz güncellemediyseniz testleri bir süre yoksaymak isteyebilirsiniz.

Yukarıdaki örnekler pekala çoğaltılabilir. Aslında testleri yok saymak ideal dünyada pek yer bulmasa da bası caselerde buna başvurmamız gerekiyor. Devam edelim.

Unittest kütüphanesi, tekil testlerin yada tamamiyle bir test sınıfının işaretlenerek çalıştırılmasını atlatmanıza olanak sağlar.

Bir testi atlatmak.

Bir testin çalıştırılaması için, unittest.skip ile decorate etmeniz yeterli. Örneğin;

import unittest

class SkippingTestCase(unittest.TestCase):
    @unittest.skip
    def test_skipping(self):
        self.fail("if not skipped its fail.")

ya da tamamiyle bir testcasei atlamak için;

import unittest

@unittest.skip('skipping entire test case. just for learning')
class SkippingTestCase(unittest.TestCase):
    def test_skipping(self):
        self.fail("if not skipped its fail.")

    def test_skipping_2(self):
        self.fail("again 2 fail.")

skip decoratoru opsiyonel olarak bir reason(type: str) argümanı alabilir. Bu argüman ile testin neden atlandığını belirtmek açıklayıcı olacaktır.

Belirli koşullar altında testi atlatmak.

Testlerinizi belirli koşullar altında çalışması ya da çalışmaması için işaretleyebilirsiniz.

Örneğin skipIf.

import unittest

class SkippingTestCase(unittest.TestCase):
    @unittest.skipIf(
        django.VERSION[:3] < (4, 0, 3),
        reason="new django based feature. not supported on below versions.",
    )
    def test_feature(self):
        some_test_logic()

Django versiyonu 4.0.3 altındaysa test_feature testi atlanacaktır.


skipUnless.

Ya da bir koşul True değer döndürmediği zaman atlanacak bir testi skipUnless ile decorate edebilirisiniz. Örneğin;

import unittest
from django.conf import settings

class UsersTestCase(unittest.TestCase):
    @unittest.skipUnless(
        getattr(settings, "SMS_SEND_FEATURE", False),
        reason="requires sms feature templates.",
    )
    def test_sms_feature(self):
        self.assertFalse(True)

test_sms_feature normalde fail olması gereken bir test. Fakat feature settingste enable edilmediği sürece atlanacak ve TestResult’a dahil edilmeyecektir.

Bunun yanında Django’nın yerleşik testing mekanizması unittest kütüphanesi üzerine kurgulanmıştır. Ve ekstradan db featurelarına bağımlı testlerin atlanabilmesi için decoratorler sunar.

skipIfDBFeature ve skipUnlessDBFeature.

Örneğin transaction supportına bağımlı bir test.

from django.test import TestCase, skipIfDBFeature

class MyTests(TestCase):
    @skipIfDBFeature('supports_transactions')
    def test_transaction_behavior(self):
        # ... conditional test code
        pass

Bu test PostgreSQL kullanan bir projede çalıştırılmayacak fakat MyISAM tabloya sahip MySQL kullanan projede çalıştırılacaktır.


Ayrıca, bir testi “beklenen hata” olarakta işaretleyebilirsiniz. Bu şekilde işaretlenen test koşturulduğunda başarısız olur ancak TestResult ‘da hata olarak gösterilmez.

import unittest

class ExpectedFailureTestCase(unittest.TestCase):
    @unittest.expectedFailure
    def test_fail(self):
        self.assertEqual(1, 0, "broken")

Son olarak, testin yürütme esnasında bir koşula göre dinamik atlanmasını da sağlayabiliriz.

Örneğin;

import unittest

class UsersTestCase(unittest.TestCase):
    def test_maybe(self):
        if not external_resource_available():
            self.skipTest(reason="external resource is not available.")

Testleri bir noktada atlatmanız gerekirse artık nasıl yapılabileceği konusunda fikir sahibisiniz.

Daha fazlası için unittest dökümantasyonu.

İyi günler!

 

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Göster
Gizle