Haftalık C++ 48 – “Function Tracker”: Basit bir “Mock” kütüphanesi

Merhaba arkadaşlar, bir başka haftalık C++ yazısı ile birlikteyiz. Bu yazımda aslında bir ihtiyaç sonucu geliştirdiğim, kullandıktan sonra da sizler ile paylaşmak istediğim bir kütüphaneden bahsedeceğim. Tabi kütüphane dediğime bakmayın, aslında tek başlık dosyasından oluşan bir kütüphane. Şu an oldukça basit ve kabiliyet anlamında sade ama birazdan bahsedeceğim ihtiyaçların bir çoğunu karşıladı ve sizlere de faydalı olacağını düşünüyorum. Bu arada birim test ile ilgili daha önce yazdığım yazılara da bir göz atmak isterseniz, aşağıdaki bağlantılara bakabilirsiniz:

Birim Test Tavsiyeleri

Uygulama İzleme Yazılımı 3 – Utility, Birim Testler, Sürekli Entegrasyon

Ayrıca bu kütüphane ile birlikte daha önce sizler ile paylaştığım;

  • Modern C++ kabiliyetlerinin,
  • CMake’in,
  • Google Test’in,
  • Ve nihayetinde birim testler ile kullanılabilecek örnek bir mock mekanizmasının kullanımına ilişkin de bir uygulama görmüş olacağız.

Projeye aşağıdaki repodan ulaşabilirsiniz. Her türlü görüş ve öneriye açıktır.

https://github.com/yazilimperver/FunctionTracker

Şimdi gelelim neden böyle bir kütüphaneye ihtiyaç olduğuna.

Birim test yazarken, test ettiğiniz sınıfın barındırdığı kabiliyetler yanında, kullandığı servisler ya da diğer sınıflara ilişkin ihtiyaç duyduğu API’leri de çağırıp/çağırmadığı ya da doğru parametrelerin geçirilip/geçirilmediğini kontrol etme ihtiyacını hissetmişsinizdir. Kısaca, test edilen sınıfın diğer sınıflar ile olan etkileşimini test etme ihtiyacı olabilmektedir.

Temelde, bu tarz işler için “mock” nesneleri kullanılmakta (“mock” ile “fake” nesneler arasındaki fark için googlemock sayfasına göz atabilirsiniz). Bu nesneler kendi içerilerinde detaylı kabiliyetler sunmasalar da, çalışma zamanında hızlı bir şekilde, bu nesnelerin kullanımına ilişkin bilgi vermektedir. Elbette bunun için, halihazırda bir çok kütüphane de mevcut. Örneğin, googlemock kütüphanesi. Kendi sayfasında ifade ettiği üzere oldukça yetenekli bir kütüphane ve farklı çağrılar için farklı dönüş değeri sunma gibi bir çok kabiliyeti sunabilmekte. Fakat kullanımı açıkçası biraz çetrefelli (en azından bana öyle geldi 😀 ), bir süre kullandıktan sonra alışsanız da, acaba daha basit bir kütüphane olabilir miydi insan düşünmeden edemiyor. İşte bu noktada “FunctionTracker” kütüphanemiz ortaya çıkıyor.

Peki mevcut “FunctionTracker” kütüphanemiz bizlere neler sunuyor. Hemen bakalım:

  • Fonksiyonun çağrılıp/çağrılmadığı kontrolü,
  • Fonksiyon çağrılma adet kontrolü,
  • Geçirilen temel ve POD veri tipindeki parametrelere erişim ya da direk geçirilmiş mi kontrolü,
  • Çoklu fonksiyon çağrısı ve çoklu parametre geçiş kontrolleri,
  • Çağrılma geçmişi sıfırlama.

Peki bu kütüphaneyi nasıl kullanabilirsiniz ona bakalım. Temelde yapmanız gereken ilk şey, “mock” olarak kullanacağınız sınıfı, arayüz sınıfından ve “FunctionTracker” sınıfından türetmek olacak. Sonra da, arayüz sınıfını gerçekleyen her bir API içerisinden “AddCall” API’sini çağırmak olacak. Bunun dışında, mock nesnesi için yapacak bir şey kalmıyor. Hemen bir örneğe bakalım.

Burada DummService arayüzüne ilişkin bir “mock” sınıfı görebilirsiniz ve her bir public API için ne yapmanız gerektiğini de. Ayrıca Reset() API’si ile de çağrılma ve geçirilen parametre geçmişini sıfırlayabilirsiniz.

“Mock” sınıfını daha sonra testlerde kullanmak için ise aşağıdaki gibi bir yol izleyebilirsiniz:

Şunu belirtmeliyim ki, diğer kütüphanelerde olduğu gibi, bu kütüphaneyi de en kolay öğrenme yöntemlerinden biri, ilgili birim testlerini incelemek olacaktır. Bu bağlamda aşağıdaki dizine ve ilgili testlere bir göz atmak isteyebilirsiniz:

https://github.com/yazilimperver/FunctionTracker/tree/main/test

Şimdi gelelim bir diğer konuya. Bu kütüphanede C++’a ilişkin hangi kabiliyetleri kullandığımızı sıralayalım, elbette bunlara ilişkin daha önce karaladığım yazılar ile birlikte 🙂

Yazımı tamamlamadan önce, bu kütüphaneye ilişkin olası geliştirilebilecek konulara da bakacak olursak, ilk aklıma gelen, fonksiyonların dönüş değerlerini girebilmek olacak. Elbette sizlerin başka önerisi yoksa 🙂

Bol testli günler diliyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.