TDD ile uygulama geliştirmenin faydaları ve Xcode da Swift ile XCTest kullanımı

Alaattin Bedir
Etiya
Published in
3 min readMar 15, 2018

Önce kısaca Test Driven Development (TDD) yöntemi ile uygulama geliştirmenin uygulamalarımıza kazandıracağı faydalardan bahsedelim ve sonrasında projemizde Xcode ile entegre gelen XCTest’i nasıl kullanacağımızla devam edelim.

Genellikle yanlış bir kanı olarak unit test yazmanın uygulama geliştirme süresini uzatacağı düşünülüyor. Halbuki uygulamamızda önceden unit testleri yazılması daha kolay bir şekilde yapılacak işlevin tasarlanabilmesini sağlar. Buda hem tasarım hemde işlevin testinde bize zaman kazandırdığı gibi kodu daha iyi yapılandırabilmemize de olanak sağlar. Bu nedenle unit testler ile uygulama geliştirmemiz daha sonra oluşacak muhtemel buglarıda öncesinde tespit edebileceğimiz için uygulama geliştirme süresini azaltacaktır.

Uygulamamızın kod kalitesini artırarak daha az bir bug ile geliştirebiliriz. Unit testler hem pozitif hemde negatif caseler ile beraber yazdığımızda olabilecek birçok farklı case test etme olanağına kavuşmuş oluruz. Buda iyi test edilmiş ve daha az bug içeren kod yazmamızı sağlayacaktır.

Yazdığımız unit testler daha sonra uygulamadaki oluşabilecek diğer bugları tespit etmemizde bize oldukça kolaylık sağlayacaktır. Buda uygulamamızdaki gelecek olan bugları çözme süremizi önemli ölçüde azaltacaktır.

Unit testlerimizi Jenkins, Teamcity gibi CI (Continues Integration) araçlarıyla entegre ettiğimizde SUT (System Under Test) prensibine uygun sürekli olarak test edilen bir uygulamamız olur. Projede yapılan her commit sonrasında unit testleri çalıştırdığımızda sistemin değişikliklerle beraber sağlıklı bir şekilde çalıştığından emin olmuş oluruz. Muhtemel oluşabilecek bugları commit sonrasında erken tespit ederek çözümünü sağlamış oluruz.

Unit testleri sadece bir işlevi test etmek amacıyla kullanıyoruz. Bu şekilde uygulama mimarisinde önemli olan Separation of Concerns ve Single Responsibility Principle uygun şekilde geliştirme yapabiliyoruz. Uygulama mimarisini buna göre gerektiği yerlerde refactor ederek kod kalitemizi de artırmış oluyoruz.

Şimdi projemize unit testleri nasıl entegre edeceğimize bakalım. Xcode da yeni proje oluşturalım ve UnitTest kullanacağımızı işaretleyelim.

Xcode bizim için Template bir UnitTest class’i oluşturuyor.

Unit Test classları XCTestCase den türetiliyor ve testde kullanmak istediğimiz modülüde @testable key ile projeye ekliyoruz. Test classlarımıza isim verirken Test edilen modül ismi ve Tests suffix’i ile oluşturursak muhtemel isim karışıklığınında önüne geçmiş oluruz. Örnek olarak Authentication class’i icin Test yazmak istiyorsa AuthenticationTests olarak isimlendirebiliriz.

Şimdi çoğunlukla kullanacağımız bir web servis çağrısı için nasıl unit test yazacağımıza bakalım.

Unit test class’ larında default olarak setUp() ve TearDown() methodları bulunur. Her unit test methodları çağrılmadan önce setUp() fonksiyonu çağrılır. Bu fonksiyonda test için gerekli olan ilk değerleri verebiliriz. Yine aynı şekilde her unit test çağrısı bittikten sonra tearDown() methodu otomatik olarak çağrılır. Bu methodda da unit test de kullanılan kaynakları serbest bırakabiliriz.

Unit testleri genel olarak Red-Green-Refactor sırasıyla yazılırlar. Yani önce testi fail edecek kodu yazarak başlarız sonra ise istenen işlevi gerçekleştiren ve başarılı olacak olan kodu yazarız. Unit test ile beraber gerekli olduğunda uygulamadaki kodu refactor ederek testimize devam ederiz.

Unit Test methodlarını yazarken genel olarak bazı yazım kurallarına uymamız gerekir. Örnek olarak iOS da diğer programlama dillerindeki unit test yazımında kullanılan AAA (Arrange-Act-Assert) prensibine uygun olarak unit test kodunu 3 bölüm halinde Given-When-Then bloklarında yazarız.

Given bölümünde test de kullanacağımız parametreleri hazırlarız. When bölümünde testini yapacağımız method çağrısını yaparız. Bizim örneğimizde Webservis çağrısı yapıyoruz. Then bölümünde ise sonuçları beklediğimiz değerler ile aynı olup olmadığının kontrollünü yaparız. Bu kontrolleri Xcode’un bize sağladığı Assertion fonksiyonları ile kolay bir şekilde yapabiliriz.

Webservis çağrılarına özgü olarak waitForExpectation(timeout:2) methodunu kullanırız. Webservis çağrısının işlem süresine göre timeout vererek sonucu başka bir thread de bekliyoruz. Bu işlevi kullanabilmek için Webservis’inden sonuc geldikten sonra authenticationExpectation.fullfill() method çağrısını yapmamız gerekiyor.

Bir makalenin daha sonuna geldik. Uygulamalarınızda UnitTest kullanmayı eksik etmemeniz dileğiyle bir sonraki makalede görüşmek üzere kendinize iyi bakın..

--

--