Python ve Test

- 4 mins

Screenshot

Test, kodun amacına ulaştığını göstermeye ve hataların önceden keşfedilmesine olanak sağlar.

Yazılımı bir sistem olarak adlandırırsak, sistemin beklenen veya beklenmeyen kullanımını yansıtacak bir test senaryosu hazırlanarak test oluşturmaya başlanır.

Test aşamaları genellikle 3 adımdan oluşur.

Geliştirme testi ise kendi içinde nesnelerin veya sınıfların test edilmesinden oluşan birim testi, birim testlerin birleşmesiyle oluşan bileşen testi ve bileşen testlerinin birleşmesiyle oluşan sistem testi ile oluşmaktadır.


Bu yazıda geliştirme testinin en küçük elemanı olan birim testi ele alınacaktır.

Önce fibonacci sayılarını bulan bir fonksiyon yazalım.

Fibonacci dizisi, her sayının kendinden önceki iki sayıyla toplanması sonucu oluşan bir sayı dizisidir.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 şeklinde ilerlemektedir.

def fibo(number):
    if(number <=1):
        return number
    else
    	return fibo(number-1) + fibo(number-2)

Fonksiyonumuz hazır olduğuna göre test edebileceğimiz birkaç değeri liste içinde gösterelim.

values = [6,0,-1,3.3,True,"fibonacci"]

Ve fonksiyonun tüm bu değerlere karşılık ürettiği sonuçlara bakalım.

8
0
-1
-0.5000000000000009
True
TypeError: '<=' not supported between instances of 'str' and 'int'

Artık bu fonksiyon için birim testimizi yazabiliriz. Öncelikle test için ayrı bir dosya oluşturulur ve genellikle testi yapılacak dosyanın isminin başına “Test” yazılarak test dosyası isimlendirilir.

import unittest
from function import fibo

class Test(unittest.TestCase):
    def test_numbers(self): # normal tests
        self.assertEqual(0,fibo(0))
        self.assertEqual(1,fibo(1))
        self.assertEqual(8,fibo(6))
        self.assertEqual(34,fibo(9))

    def test_values(self): # value tests
        self.assertRaises(ValueError,fibo,-2)

    def test_type(self): # type tests
        self.assertRaises(TypeError,fibo,3.3)
        self.assertRaises(TypeError,fibo,True)
        self.assertRaises(TypeError,fibo,"Fibonacci")

if __name__ == '__main__':
    unittest.main()

Önce test kütüphanesinden sınıf import edilir. Ardından test sınıfı adım adım oluşturulur.

def fibonacci(i):
    if type(i) not in [int]: # for type errors
        raise TypeError("Type must be integer")
    if i<0: # for value errors
        raise ValueError("Cannot be negative number")
    if i<=1: # if number is (zero or one) then return itself
        return i
    else:
        return fibonacci(i-1)+fibonacci(i-2)

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

Test dosyası çalıştırıldığında ise çıktı yukarıdaki gibi olur. 3 ayrı test metodu ile test işlemleri gerçekleşti ve tüm testler başarıyla geçildi ve birim testi gerçekleştirilmiş oldu.

Test konusunun en önemli noktası ise, tüm yazılımın hatasız olduğunu değil testin tabii tutulduğu bölümünün yalnızca o kriterler için hatasız çalışabildiği gösterir.

Mustafa Durmus

Mustafa Durmus

a man who travels the world!

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora