Unit Testing
- Projemizde yaptığımız değişikliklerden sonra projemizin hala çalıştığından emin olmak için unit testi yapmak oldukça faydalı hatta gereklidir.
- Python'ın
unittest
paketi ile unit test işlemini gerçekleştirelim. blog/tests.py
xxxxxxxxxx
from datetime import datetime, timedelta
import unittest
from myapp import app, db
from myapp.models import User, Post
class UserModelCase(unittest.TestCase):
def setUp(self):
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_password_hashing(self):
u = User(username='adnan')
u.set_password('2344x')
self.assertFalse(u.check_password('234455x'))
self.assertTrue(u.check_password('2344x'))
def test_avatar(self):
u = User(username='adnan', email='adnan@kaya.com')
self.assertEqual(u.avatar(128),('https://www.gravatar.com/avatar/'
'b560759d7ebe1fe931ac633979bf4805'
'?d=identicon&s=128'))
def test_follow(self):
u1 = User(username='adnan', email='adnan@kaya.com')
u2 = User(username='kayace', email='kaya@ce.com')
db.session.add(u1)
db.session.add(u2)
db.session.commit()
self.assertEqual(u1.followed.all(), [])
self.assertEqual(u1.followers.all(), [])
u1.follow(u2)
db.session.commit()
self.assertTrue(u1.is_following(u2))
self.assertEqual(u1.followed.count(), 1)
self.assertEqual(u1.followed.first().username, 'kayace')
self.assertEqual(u2.followers.count(), 1)
self.assertEqual(u2.followers.first().username, 'adnan')
u1.unfollow(u2)
db.session.commit()
self.assertFalse(u1.is_following(u2))
self.assertEqual(u1.followed.count(), 0)
self.assertEqual(u2.followers.count(), 0)
def test_follow_posts(self):
u1 = User(username='adnan', email='adnan@kaya.com')
u2 = User(username='abdullah', email='abdullah@kaya.com')
u3 = User(username='murat', email='murat@kaya.com')
u4 = User(username='mehmet', email='mehmet@kaya.com')
db.session.add_all([u1, u2, u3, u4])
now = datetime.utcnow()
p1 = Post(body='post from Adnan', author=u1,
timestamp=now+timedelta(seconds=1))
p2 = Post(body='post from Abdullah', author=u2,
timestamp=now+timedelta(seconds=4))
p3 = Post(body='post from Murat', author=u3,
timestamp=now+timedelta(seconds=3))
p4 = Post(body='post from Mehmet', author=u4,
timestamp=now+timedelta(seconds=2))
db.session.add_all([p1, p2, p3, p4])
db.session.commit()
u1.follow(u2) # Adnan Abdullah'ı takip ediyor.
u1.follow(u4) # Adnan Mehmet'i takip ediyor.
u2.follow(u3) # Abdullah Murat'ı takip ediyor.
u3.follow(u4) # Murat Mehmet'i takip ediyor.
#Takip edilen kullanıcıların gonderilerini karşılaştırmak için
f1 = u1.followed_posts().all()
f2 = u2.followed_posts().all()
f3 = u3.followed_posts().all()
f4 = u4.followed_posts().all()
self.assertEqual(f1, [p2, p4, p1])
self.assertEqual(f2, [p2, p3])
self.assertEqual(f3, [p3, p4])
self.assertEqual(f4, [p4])
if __name__ == '__main__':
unittest.main(verbosity=2)
Kodlarımızı biraz açıklayalım:
class UserModelCase(unittest.TestCase):
; unittest paketinden TestCase sınıfını miras alıyoruz.def setUp()
; methodu test fonksiyonlarından hemen önce çalışan methoddur. CamelCase yazılması gerekiyor. Bütün test fonksiyonlarında ortak olarak çalıştırılması istenen kodlar için bu methodu kullanabiliriz. Örneğin bütün test fonksiyonlarında 2-3 adet nesne oluşturulacaksa burada tanımlamamız yeterli.setUp()
içerisinde SQLITE konfigürasyonunu değiştirdik.db.create_all()
methodunu çağırınca bütün veritabanı tablolarını oluşturur.def tearDown()
; methodu test fonksiyonlarından hemen sonra çalışan methoddur.test_password_hashing(), test_follow() ...
methodları projemize ait test fonksiyonlarıdır. Method isimlerinde hepsinin başınatest_
gelmesi gerekiyor.self.assertFalse()
methoduna verdiğimiz parametre sonucuFalse
dönmesi gerekiyor. Örneğin yanlış parola girildiğinde False vermesini bekliyoruz ve eğer False veriyorsa test başarılı demektir.self.assertTrue()
methoduna verdiğimiz parametre sonucuTrue
dönmesi gerekiyor. Örneğinadnan
kullanıcısının parolasını2344x
olarak atama yaptıktan sonra, check_password() methodu ile kontrol edince True dönüyor. Bu da testin başarılı olduğunu gösterir.self.assertEqual()
methoduna 2 adet parametre verip karşılaştırma yapıyoruz. Eğer karşılaştırma sonucu doğru ise test başarılı demektir. Örneğin; u1 olarak tanımlananadnan
, u2 olankayace
kullanıcısını takip edince (follow),self.assertEqual(u1.followed.first().username, 'kayace')
sorgusu u1'in takip ettiği kullanıcı adının(username)kayace
olduğunu veriyor ve test başarılı olarak geçiyor.if __name__ == '__main__' :
olarak belirtilen kısımdaunittest.main()
diyerek bu modülü(tests.py) doğrudan çalıştıracağımızı söylüyoruz.- Mdülü terminal den çalıştırdığımızda aşağıdaki gibi 4 tane test fonksiyonumuzun da testten başarılı(OK) olarak geçtiğini göreceğiz:
xxxxxxxxxx
(env) kayace@kayace-K53SV ~/blog $ python tests.py
test_avatar (__main__.UserModelCase) ... ok
test_follow (__main__.UserModelCase) ... ok
test_follow_posts (__main__.UserModelCase) ... ok
test_password_hashing (__main__.UserModelCase) ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.248s
OK
(env) kayace@kayace-K53SV ~/blog $
- Bundan böyle projedeki her değişiklik için test fonksiyonu yazılmalı ve çalıştırılmalı.
- Yeni özellikler eklendikçe yeni testler de yazılmalıdır.
Yorumlar