Photo by David Travis on Unsplash

Kabul Testi Nedir? (.Net with SpecFlow)

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️
4 min readMay 17, 2022

--

Yazılım uygulamalarını her zaman farklı organizasyonlara benzetmişimdir. Bazen bir futbol takımı bazen ise bir yolcu gemisi. Herhangi bir organizasyon ile karşılaştığımda aklıma gelen ilk soru: “Lider kim?” olmuştur. Çünkü ilk olarak lideri incelersem tüm organizasyonu incelemek gibi büyük bir zaman maliyeti oluşturmadan organizasyonun sırlarını öğrenebileceğime inanırım. Yazılım uygulamalarında bence lider test projeleridir. Unit, Integration, Functional, E2E gibi farklı test yöntemleri mevcuttur. Başlangıç olarak genellikle Unit Test önerilir. Daha sonra organizasyonunuzun yapısına göre farklı testler ekleyebilirsiniz. Testi olmayan bir proje kesinlikle başarısız olur demek çok zor ancak test senaryoları olmayan bir proje muhakkak kötü bir anı yaşıyacaktır diyebilirim. Yeni bir proje ile ilk tanıştığımda hemen test senaryolarına bakarım. Bu senaryolar bana neyin doğru kabul edildiğini ve neyin hatalı kabul edildiğini anlatır. Uygulamanın hangi durumda nasıl tepki vereceğini hızlıca öğrenirim. Yazılım uygulamalarında test gerçekten çok uzun bir konu. Bu yazımda sizlere kabul testi nedir ve .Net uygulamalarında nasıl kabul testleri oluşturulacağını aktarmaya çalışacağım.

Kullanıcı Kabul Testi (UAT) ne anlama geliyor? Kullanıcı kabul testi (UAT), yazılım test sürecinin son aşamasıdır. UAT sırasında, gerçek yazılım kullanıcıları, spesifikasyonlara göre, gerçek dünya senaryolarında gerekli görevleri yerine getirebildiğinden emin olmak için yazılımı test eder.

Kabul testi, klasik yazılım geliştirme yaşam döngüsünde son adım olarak kabul edilebilir. Günümüzde artık çok daha hızlı deploy çıkıyoruz. CI/CD süreçleri ile gün içerisinde onlarca farklı yazılımı yeni sürümlere yükseltiyoruz. Özellikle backend ekosisteminde çalışan uygulamaları doğrudan kullanıcılara gösteremiyoruz. Bu sebeple kabul testi özellikle backend uygulamalarında farklı bir yöntem gerektiriyor.

Kabul testinin odak noktası uygulamadan bağımsız olmasıdır. Unit, Integration veya Functional testler gibi doğrudan projeye bağımlı değildir. Kabul testi uygulamanın daha geniş bir bakış açısı ile test edilmesidir.

İlerleyen satırlara geldikçe CustomerApi isimli bir proje göreceksiniz. Create/Update/Delete/Get işlemlerine sahip olan bu projeye SpecFlow ile kabul testleri ekleyeceğiz. Veri tabanı olarak Mongo kullanacağız. Test ortamının gerçek bir ortam olması için Docker kullanacağız. Kabul testlerimizi CI/CD süreçlerine kolay bir şekilde entegre etmek için küçük dokunuşlar ekleyeceğiz ve aşağıda göreceğiniz test senaryosunu gerçekleştireceğiz.

  • Yeni bir müşteri ekle.
  • Eklenen müşterinin detayını getir.
  • Eklenen müşteriyi sil.
  • Tekrar müşteri detayını getir ancak silindiği için müşteri bulunamadı hatasanı al.

Basit bir Customer Api oluşturdum. Insert/Get/Delete işlemlerine sahip ve nasıl çalıştığını daha iyi aktarmak için küçük bir video ekledim.

Merak edenler için CustomerController.cs dosyasını paylaşıyorum.

Artık kabul testleri yazabileceğimiz bir projemiz var. Daha önce unit test yazdıysanız alışkanlıklarınız, hemen bir test projesi oluşturmanız ve test edeceğiniz proje ile arasında bir bağlantı kurmanızı isteyecektir. Evet, bir test projesi oluşturacağız ancak test edilecek uygulama ile arasında bir bağlantı olmasına gerek yok. Kabul testlerinin sırrı bir kullanıcı gibi test etmektir. Hadi bir test projesi oluşturulım ve aşağıdaki kütüphaneleri ekleyelim.

<PackageReference Include="BoDi" Version="1.5.0" />
<PackageReference Include="Ductus.FluentDocker" Version="2.10.45" />
<PackageReference Include="FluentAssertions" Version="6.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="SpecFlow.xUnit" Version="3.9.74" />

BoDi oldukça küçük bir IoC container. SpecFlow için oluşturulan bu kütüphane ile alışık olduğumuz dependency injection yöntemlerini kullanabiliyoruz.

Ductus.FluentDocker oldukça sık kullandığım bir kütüphane. Özellikle test projelerinde gerçek ortamın aynısını kurgulamak için oldukça kullanışlı.

Kullandığınız ideye uygun plugin/extension kurduktan sonra artık testlerimizi yazabiliriz. (Welcome to the Step-By-Step Getting Started Guide! — documentation (specflow.org))

Customer endpointlerine kabul testleri ekleyeceğim için customer.feature isimli bir dosya ekliyorum.

customer.feature

Adım adım customer.feature dosyasını inceleyelim.

Test ettiğiniz özelliğin ismini feature anahtar kelimesi ile ekleyebilirsiniz. SpecFlow senaryo tabanlı bir dil içerir. Bu sayede okunaklı test senaryoları ortaya çıkar.

Her senaryonun bir ismi olmalıdır. İlk senaryomuz müşterinin başarılı bir şekilde yaratılmasıdır. Konuşma dilinde test senaryolarımızı artık adım adım ekleyebiliriz. Senaryolar yazdığımız sıra ile adım adım ve birbirinden bağımsız çalışacaktır. Bu sebeple senaryo içerisinde girdi olarak kullanmak istediğiniz veriler olursa bunları tablo formatında ekleyebilirsiniz.

Senaryo tabanlı bir tanımlama yaptıktan sonra her senaryonun birden fazla adım içerdiğini ve testler çalışırken bu adımların da sırasıyla çalıştığını unutmamız gerekiyor. Bu sebeple CustomerSteps.cs isimli bir class oluşturarak aşağıdaki görünüme kavuşturalım.

CustomerSteps.cs

Kurduğunuz extension/plugin sayesinde *.feature uzantılı dosyamızda CTRL+. ile testlerinizi oluşturabilirsiniz.

Senaryolar ve adımlar başarılı bir şekilde oluşturuldu ancak henüz bu adımların içerisinde kabul şartlarını eklediğimiz logicler bulunmuyor. Bu logicleri eklemeden önce test projemizin herhangi bir ortamda başarılı bir şekilde çalışmasını sağlamak için docker-compose.yml isimli bir konfigürasyon dosyası oluşturalım.

WebApi projemiz build olduktan sonra veri tabanı olarak mongo çalışacak ve bu işlemlerin birbirini bekleyecektir.

Gerekli ortamın sağlanması ve sonra testlerin çalışması gerektiğinden bahsetmiştik. Yani testlerden önce/sonra araya girip bazı işlemler yapabilmemizi sağlayan bir yapıya ihtiyacımız var. Tam bu noktada Hook kavramı işimizi kolaylaştırıyor. SpecFlow içerisinde bulunan hook yapısını kullanarak testlerden, senaryolardan veya adımlardan önce/sonra araya girip istediğiniz işlemleri yaptırabilirsiniz.

Testler çalışmadan önce FluentDocker kütüphanesini kullanarak ortamları ayarladıktan sonra her senaryodan önce yeni bir HttpClient yaratılacak. Testler bittiğinde ortamlardaki servisler durdurularak operasyon sonlanacaktır.

Her bir adımı oluşturmuştuk ve adımlar için gerekli olan logicleri artık ekleyebiliriz.

Adımlar arasında veri taşımak için ScenarioContext yapısını kullanabilirsiniz. Dictionary yapısı sayesinde kolayca verilerinizi aktarabilirsiniz.

Yukarıda paylaştığım linke tıklayarak eklediğimiz kabul testlerin nasıl çalıştığını görebilirsiniz. Bu süreci CI/CD adımlarınıza ekleyebilirsiniz, kabul testleri çalışır ve daha güvende olursunuz.

Yazdığınız kodlar production ortamında hatasız koşsun, testler sizi korusun.🙏

BDD Framework for .NET — SpecFlow — Enhance Your Automated Tests

Welcome to the Step-By-Step Getting Started Guide! — documentation (specflow.org)

SpecFlow (github.com)

SpecFlowOSS/SpecFlow.Rider: SpecFlow support for both ReSharper and Rider (github.com)

SpecFlowOSS/SpecFlow: #1 .NET BDD Framework. SpecFlow automates your testing & works with your existing code. Find Bugs before they happen. Behavior Driven Development helps developers, testers, and business representatives to get a better understanding of their collaboration (github.com)

Elegant Acceptance Testing in .NET with SpecFlow — YouTube

SpecFlowOSS/SpecFlow.Actions (github.com)

SpecFlowOSS/SpecFlow.VS: The next version of the Visual Studio extension for SpecFlow (github.com)

--

--

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️

Solution Developer — I want to change the world, give me the source code.