Python ile basit unit test yazmak -Phoique AR-GE Kulübü

Phoique 7

Katılımcı Üye
14 Mar 2017
505
1
Manisa
Merhaba arkadaşlar, birkaç konu önce Javascript/Node.js ile unit test yazmayı dilim döndüğünce anlatmıştım. Unit test nedir? Nodejs restful api unit test yazalım.
Şimdi ise unit testi python ile yazacağız.


Unit test nedir?

Yazdığınız projenin yapılan işlemleri en küçük parçacıklara ayırarak, ayırdığınız parçacıkları test etmek için yazılan koda unit test denir. Mesela Bir siteden data alacaksınız ve bu datayı yazdıracaksınız. Bunun test parçaları şu şekilde olmalıdır.

+ Siteden status durumu 200 mü? (Siteye bağlanıyor mu?)
+ Bağlanıyor ise data orada mı?
+ Data orada ise datayı al. Datayı yazdır ve kontrol et yazdırdığını.

Gibi gibi yapılan işlemleri ufak ufak parçalara bölüp test yazıyoruz.

Python ile Unit Test yazalım.

Şimdi gelelim basit olarak pythonda unit test yazmaya. Test adında bir klasör açıyorum ve içine example.py, exampleTest.py Python dosyalarını oluşturuyorum. Example içinde fonksiyonlarım olacak, exampleTest içinde ise example içinde yazdığım fonksiyonları test edeceğim kodlar bulunacak.

example.py:
Kod:
[COLOR="SeaGreen"][B]def usAl(x,y):
    return x ** y

def yaz(text):
    return text

def boolean(value):
    return value[/B][/COLOR]

Görüldüğü üzere 3 adet fonksiyonum mevcut. Bilerek türkçe fonksiyon isimleri ve açıklamalar yazdım. Daha rahat anlamanız açısından. Şimdi ise test yazmaya başlıyalım.

Kod:
[COLOR="SeaGreen"][B]import unittest
import example[/B][/COLOR]

[COLOR="seagreen"][B]class exampleTest(unittest.TestCase):[/B][/COLOR]

   [COLOR="seagreen"][B] def testUsCevap(self):[/B][/COLOR]
        [COLOR="White"]"usAl fonksiyonuna değer yollayıp, doğru cevap dönmesini karşılaştırıyoruz."[/COLOR]
[COLOR="SeaGreen"][B]        yolla = example.usAl(3, 2) # 3 ** 2 => 9 dönmesi gerekir.
        self.assertEqual(9, yolla)

if __name__ == "__main__":
    unittest.main()[/B][/COLOR]

unittest import ettik. Bir sınıf oluşturdum, birden fazla unit test yazmak için. unittest.TestCase miras almayı unutmuyoruz. Şimdi bir test için fonksiyon oluşturuyoruz. Bu test fonksiyonun başında mutlaka test yazması gerekir. Yoksa python bunu test olarak algılamıyor. "" kısmı açıklama satırı hemde testten geçmez ise hangi testten geçemediğinizi rahatça bulmanızı sağlar. self.assertEqual(9, yolla) kısmı miras aldığımız TestCase gelmektedir. Şunu demek istiyor aslında yolla değeri ile 9 birbirine eşit mi? eşit ise testden geçiyor. Geçemez ise hata veriyor. İsterseniz deneyin.

bLmgwX.png


Görüldüğü üzere ilk denemede geçmiş, ama ikinci denememizde 8 çıkmasını beklerken 9 çıktı diyor. Şimdi birkaç test daha yazalım.

Kod:
[COLOR="SeaGreen"][B]def testSonucCevapEsitsizligi(self):
        [COLOR="white"]"yaz fonskiyonuna değer yollayıp aynı ise hata vermesini sağlıyoruz."[/COLOR]
        yolla = example.yaz('hello') 
        self.assertNotEqual(yolla, 'hi')[/B][/COLOR]

Bu seferki testimizde yaz fonksiyonuna hello yolluyoruz. Ve biz hi çıktısı bekliyoruz. Birbirine eşit olmadığı için "self.assertNotEqual()" hata vermiyor. İsterseniz yolladığınız değer ile beklediğiniz değeri aynı yapıp deneyin.

Kod:
[COLOR="SeaGreen"][B]def testDogru(self):
        [COLOR="White"]"boolean fonksiyonuna true yollayıp true döndüğünü kontrol ediyoruz."[/COLOR]
        yolla = example.boolean(True)
        self.assertTrue(yolla)
    
    def testYanlıs(self):
        [COLOR="white"]"boolean fonksiyonuna false yollayıp false döndüğünü kontrol ediyoruz."[/COLOR]
        yolla = example.boolean(False)
        self.assertFalse(yolla)[/B][/COLOR]

Bu iki testimizde ise boolean fonksiyonuna True veya False gönderiyoruz. İlk testimizde True gönderiyor ve True dönüyor ise testten geçiyor. ikinci testimiz ise tam tersi, false gönderiyoruz ve çıktımız false ise testten geçiyor.

Kod:
[COLOR="SeaGreen"]def testDizi(self):
        [COLOR="white"]"yaz fonksiyonuna bir liste yollayıp liste şeklinde döndüğünü kontrol ediyoruz."[/COLOR]
        yolla = example.yaz([1, 2, 3])
        self.assertListEqual(yolla, [1,2,3])[/COLOR]

Son olarak böyle bir örnek yapıp bitirmek istedim. Daha birçok test senaryosu var ama ben örnek olması ve aklınızda birşeyler canlanması için basit olarak bu örnekleri yaptım. Bilerek de türkçe fonksiyonlar oluşturdum rahatça anlayın diye. Aynı şekilde türkçe açıklamalar veya test isimleri de diyebiliriz.

hVejxY.png


Şimdi ilk 2 testte bilerek hata yaptım gördüğünüz gibi, kaç tane test olduğunu, kaç tanesinden geçmediğini, geçmeyenlerin neden geçmediğini gibi güzel bir detay sayfası sunuyor bize.

Bu konuda bu kadar olsun. Herhangi bir sorunuz var ise konu altında belirtiniz. Yanlışlarım var ise mutlaka belirtin. Kendinize iyi bakın. İyi günler...
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.