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
unittestpaketi ile unit test işlemini gerçekleştirelim. blog/tests.py
xxxxxxxxxxfrom datetime import datetime, timedeltaimport unittestfrom myapp import app, dbfrom myapp.models import User, Postclass 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 sonucuFalsedö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 sonucuTruedönmesi gerekiyor. Örneğinadnankullanıcısının parolasını2344xolarak 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 olankayacekullanı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)kayaceolduğ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) ... oktest_follow (__main__.UserModelCase) ... oktest_follow_posts (__main__.UserModelCase) ... oktest_password_hashing (__main__.UserModelCase) ... ok----------------------------------------------------------------------Ran 4 tests in 0.248sOK(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