Behavior-Driven Development (BDD) — TDD-ni genişləndirən, sistemin davranışını təbii dildə təsvir edən proqramlaşdırma metodologiyasıdır. BDD ssenariləri Given-When-Then formatında yazılır, həm proqramçılar, həm də biznes analitiklər üçün anlaşıqlıdır. Cucumber (2024) məlumatına görə, BDD müştəri tələbləri ilə icra arasındakı boşluğu aradan qaldırır, spesifikasiyaları icra edilə bilən testlərə çevirir.
Əsas məqamlar
Behavior-Driven Development — 2006-cı ildə Dan North tərəfindən təklif edilmiş TDD-nin təkamülüdür, testlərin formullaşdırılması probleminə cavab olaraq. TDD-də proqramçı test yazır, amma „məhz nəyi test etmək?“ sualı açıq qalır. BDD bu problemi həll edir, diqqəti kodun test edilməsindən sistemin davranışının təsvirinə istifadəçi baxımından yönəldir.
BDD-nin əsas yeniliyi — layihənin bütün iştirakçıları üçün ümumi dildir. Proqramçılar, testçilər, analitiklər və müştərilər ssenariləri vahid dildə müzakirə edirlər, bu da eyni anda icra edilə bilən testdir. Bu, tələblərin analitikdən proqramçıya ötürülməsi zamanı mənasını itirməsi kimi klassik „kor telefon“ problemini aradan qaldırır.
Dan North BDD-ni 2006-cı ildə ThinkCode bloqunda „Introducing BDD“ məqaləsində formullaşdırmışdır. O, TDD-də test adlarının çox vaxt icra terminləri ilə („testAddUser“) ifadə edildiyini, davranış terminləri ilə („user should be able to register with email“) deyil, qeyd etmişdir. BDD „test“ sözünü „should“ və „assert“ sözünü „expect“ ilə əvəz etmiş, diqqəti istifadəçi üçün dəyərə yönəltmişdir.
Cambridge University (2021) tədqiqatına görə, müştəri ilə ünsiyyətdə BDD ssenarilərindən istifadə edən layihələr tələblərdə səhv sayını ənənəvi mətn spesifikasiyaları ilə müqayisədə 35% azaldır. İcra edilə bilən ssenarilər qeyri-müəyyən ifadələrə yol vermir — hər Given-When-Then ya icra olunur, ya da olunmur.
Gherkin — Cucumber və SpecFlow framework-ləri tərəfindən davranış ssenarilərini təsvir etmək üçün istifadə olunan domen spesifik dildir. Gherkin ssenariləri strukturlaşdırmaq üçün abzaslar və açar sözlərdən istifadə edir, eyni zamanda texniki fonu olmayan şəxs üçün oxunaqlı qalır.
Feature: Login
Scenario: Successful login with valid credentials
Given the user is on the login screen
When they enter valid username and password
Then they should see the home screen
Gherkin bir neçə əsas açar söz müəyyən edir. Feature funksionallığı təsvir edir, Scenario — konkret ssenarini, Given — ilkin şərtləri, When — hərəkəti, Then — gözlənilən nəticəni. Əlavə olaraq And və But bir neçə şərti birləşdirmək üçün istifadə olunur.
Gherkin faylları .feature genişlənməsinə malikdir və Android layihələrində src/test/resources/features/ qovluğunda saxlanılır. Hər fayl Feature təsviri ilə başlayır, ardınca bir və ya daha çox Scenario gəlir. Parametrləşdirmə üçün Examples cədvəlləri ilə Scenario Outline istifadə olunur — bu, eyni ssenarini müxtəlif məlumatlarla işə salmağa imkan verir.
Feature: Calculator
Scenario Outline: Addition of two numbers
Given the calculator is running
When I add <a> and <b>
Then the result should be <result>
Examples:
| a | b | result |
| 2 | 3 | 5 |
| 0 | 0 | 0 |
| -1| 1 | 0 |
Given-When-Then — BDD tərəfindən domain-driven design-dan götürülmüş ssenarilərin təsviri üçün struktur nümunəsidir. Hər ssenari üç hissədən ibarətdir: ilkin şərtlər, hərəkət və gözlənilən nəticə. Bu format təbii olaraq unit-testlərdəki Arrange-Act-Assert-ə uyğun gəlir, lakin biznes üçün anlaşıqlı dildən istifadə edir.
Given bloku ssenarinin başlanğıcından əvvəl sistemin vəziyyətini təsvir edir: hansı məlumatlar mövcuddur, hansı komponentlər aktivdir, tətbiq hansı rejimdə işləyir. Mobil kontekstdə bu „istifadəçi daxil olub“, „səbət boş deyil“ və ya „cihaz oflayn rejimdədir“ ola bilər.
When bloku istifadəçi və ya sistem tərəfindən başladılan hadisəni təsvir edir: düymənin basılması, push-bildirişin alınması, server cavabı. Mobil tətbiqlərdə bu çox vaxt ViewModel metodunun çağırışına və ya UI elementinə basılmasına uyğun gəlir.
Then bloku gözlənilən vəziyyət dəyişikliyini təsvir edir: ekranın dəyişməsi, API çağırışı, verilənlər bazasının yenilənməsi. Then-də yoxlamalar ölçülə bilən və birmənalı olmalıdır — onlar icra edilə bilən koddaki assert-lərə çevrilir.
BDD və TDD çox vaxt qarışdırılır, baxmayaraq ki, bunlar fərqli intizam səviyyələridir. TDD — kod səviyyəsində layihələndirmə texnikası: „icranı necə yazmaq“. BDD — tələb səviyyəsində spesifikasiya texnikası: „sistem nə etməlidir“.
| Meyar | TDD | BDD |
|---|---|---|
| Diqqət | API layihələndirmə | Sistem davranışı |
| Dil | Kod (JUnit, XCTest) | Təbii (Gherkin) |
| Auditoriya | Proqramçılar | Bütün komanda + müştəri |
| Səviyyə | Unit-testlər | Qəbul/inteqrasiya |
| Nəticə | Kodla örtülmüş API | İcra edilə bilən spesifikasiya |
Ən yaxşı mobil layihələr ayrı-ayrı siniflər səviyyəsində (domain təbəqəsi) TDD və ssenari səviyyəsində (feature təbəqəsi) BDD istifadə edir. Bu ikiqat əhatə verir: TDD icranın düzgünlüyünü, BDD isə tələblərin düzgün başa düşüldüyünü təmin edir. Google öz daxili təcrübəsində Android proqramları üçün TDD və BDD kombinasiyasından istifadə edir, Android Testing (2024) sənədləşməsində göstərildiyi kimi.
BDD ekosistemi mobil inkişafın bütün populyar platformaları və dilləri üçün framework-ləri əhatə edir. Alətin seçimi texnoloji stekdən və avtomatlaşdırma səviyyəsindən asılıdır.
Cucumber — Gherkin ssenariləri ilə işləyən ən populyar BDD framework-üdür. Android layihələri üçün io.cucumber:cucumber-android kitabxanası istifadə olunur, bu da Espresso və Compose Test UI-test alətləri ilə inteqrasiya olunur. Cucumber Kotlin və Java-nı dəstəkləyir, bu da onu hər iki dildən istifadə edən studiyalar üçün universal seçim edir.
SpecFlow — .NET ekosistemi üçün BDD framework-ü, Xamarin.Forms və .NET MAUI layihələrində istifadə olunur. SpecFlow NUnit və xUnit ilə inteqrasiya olunur, onun addımları (step definitions) C# dilində yazılır. Mobil layihələr üçün SpecFlow ssenariləri ümumi kod bazasında Android və iOS versiyaları arasında təkrar istifadə etməyə imkan verir.
Swift-də iOS inkişafı üçün Quick və Nimble BDD framework-ləri mövcuddur. Quick describe/it stilində ssenariləri təsvir etmək üçün DSL təqdim edir, Nimble isə oxunaqlı sintaksisli matçerlər təqdim edir. Bu framework-lər Gherkin-dən birbaşa istifadə etməsələr də, BDD prinsipini həyata keçirirlər: davranışın bütün komanda üçün anlaşıqlı dildə təsviri.
Android layihəsində BDD-nin tam nümunəsini nəzərdən keçirək: sifariş vermə ssenarisi. Əvvəlcə Gherkin ssenarisi yazırıq, sonra — Kotlin dilində step definitions.
BDD metodologiyası three amigos — üç rolun: proqramçı, testçi və analitikin görüşünə əsaslanır. Onlar inkişafa başlamazdan əvvəl birlikdə ssenarilər yazır, tələblərin ümumi başa düşülməsini təsbit edirlər. Əgər ssenari üç iştirakçıdan heç biri üçün uyğun deyilsə — demək, tələb qeyri-müəyyən formullaşdırılıb. Bu təcrübə “Discovery: Explore Behaviour Using Examples” (Gáspár & North, 2021) kitabında təsvir edilmişdir və yetkin komandalarda BDD prosesinin məcburi hissəsidir.
Feature: Order Checkout
Scenario: Apply promo code to cart
Given the user has items in the cart
And the total amount is $100
When they apply promo code "WELCOME10"
Then the discount should be $10
And the final total should be $90
Step definitions — Gherkin ssenarisini test icrası ilə birləşdirən kod. Hər addım Gherkin açar sözünə uyğun annotasiyalı metoddur.
class CheckoutSteps {
private val cart = Cart()
private val checkout = CheckoutUseCase()
fun `user has items in the cart`() {
cart.addItem(Item("Phone", 100.0))
}
fun `apply promo code`(code: String) {
checkout.applyPromo(cart, code)
}
fun `discount should be`(expected: Double) {
Assertions.assertEquals(expected, checkout.getDiscount())
}
fun `final total should be`(expected: Double) {
Assertions.assertEquals(expected, checkout.getTotal())
}
}
Android layihəsində BDD testlərini işə salmaq üçün CucumberAndroidJUnitRunner istifadə olunur. O, resurslardakı .feature fayllarını skan edir, müvafiq step definitions-ləri müntəzəm ifadələrlə tapır və ssenariləri adi instrumental testlər kimi icra edir. Nəticələr müştəri üçün anlaşıqlı HTML hesabatında formatlaşdırılır.
// build.gradle.kts
dependencies {
androidTestImplementation("io.cucumber:cucumber-android:7.18.0")
androidTestImplementation("io.cucumber:cucumber-junit:7.18.0")
}
// CucumberOptions annotation
@RunWith(Cucumber::class)
@CucumberOptions(features = "features", glue = ["com.app.steps"])
class CucumberTestRunner
BDD-nin mobil inkişafa tətbiqi bir sıra praktiki çətinliklərlə bağlıdır. Bu problemlərin dərk edilməsi komandalara məyusluqdan qaçmağa və davamlı BDD prosesi qurmağa kömək edir.
Əsas problem — Gherkin ssenariləri ilə istehsal kodu arasında desinxronizasiyadır. Əgər proqramçılar API-ni dəyişir, step definitions-i yeniləmirlərsə, .feature faylları icraya uyğun gəlmir. Həll yolu — BDD testlərini CI/CD pipeline-da işə salmaq və merge request üçün yaşıl status tələb etməkdir. „BDD as a gating mechanism“ təcrübəsi Cucumber (2024) sənədləşməsində təsvir edilmişdir və sənayedə standartdır.
Cucumber-də BDD ssenariləri Android cihazında və ya emulyatorda instrumental testlər vasitəsilə icra olunur. Bu, JVM-də adi unit-testlərdən 10–50 dəfə yavaşdır. Böyük Android tətbiqi üçün bir qəbul testi 20–30 dəqiqə çəkə bilər. BDD testlərini ayrıca CI işinə ayırmaq və onları gecə işə salmaq, unit-testləri isə hər push-da işə salmaq tövsiyə olunur. Bu strategiya rəy sürəti və ssenari əhatəsi arasında tarazlıq yaradır.
BDD-yə keçid yalnız proqramçıların deyil, həm də analitiklər və testçilərin təlimini tələb edir. Gherkin sadə dildir, lakin yaxşı ssenarilər yazmaq təcrübə tələb edir. Başlayanların tipik səhvləri: çox uzun ssenarilər (10 addımdan çox), Given-When-Then-in qarışdırılması, biznes ssenarilərində texniki terminlərin istifadəsi. BDD Academy (2024) məlumatına görə, komandalara BDD ssenarilərinin yazılmasında yetkinliyə çatmaq üçün orta hesabla 4–6 sprint lazımdır.
Tez-tez verilən suallar
TDD unit-testlər vasitəsilə API layihələndirməsinə, BDD isə sistemin davranışını təbii dildə ssenarilər vasitəsilə təsvir etməyə fokuslanır. BDD TDD-ni genişləndirir, qeyri-texniki iştirakçılar da daxil olmaqla bütün komanda üçün ümumi dil əlavə edərək.
Mobil inkişaf üçün əsas BDD framework-ləri: Cucumber (Android, iOS), SpecFlow (Xamarin, .NET MAUI) və Quick/Nimble (iOS, Swift). Cucumber bütün populyar platformaları dəstəkləyən ən universal seçimdir.
Gherkin BDD-nin əsas dilidir, lakin yeganə deyil. iOS framework-ü Quick Swift-də öz DSL-indən istifadə edir. Bununla belə, Gherkin bilmək tövsiyə olunur, çünki bu, platformalararası layihələr üçün de-fakto standartdır.
BDD mətn spesifikasiyalarını icra edilə bilən ssenarilərlə əvəz edir. Müştəri inkişafa başlamazdan əvvəl ssenarini yoxlaya, icradan sonra isə yaşıl keçid hesabatını görə bilər. Bu, rəy dövrünü qısaldır və tələblərdə səhv sayını azaldır.
Bəli, BDD metodologiyadır, alət deyil. BDD prinsiplərini istənilən test framework-ü ilə həyata keçirmək olar, testləri „should do something when condition“ stilində adlandırmaqla. Lakin Cucumber və Gherkin bütün komanda üçün uyğun dil təmin edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun