အခန်း ၁၆ :: Test Driven Development

အခုခေတ်မှာ Test Driven Development ကို မဖြစ်မနေ အသုံးပြုနေကြပါပြီ။ Junior Developer တွေဟာ Test Driven Development ကို Unit Test ရေးသားခြင်းလို့ပဲ ထင်မှတ်ထားကြပါတယ်။ TDD ဟာ ဒီထက် ပိုပါတယ်။ ပုံမှန် အားဖြင့် project ရေးပြီးသည့် အခါမှ Uni Test ကို ထည့်သွင်းသည့် အခါမှာ အချိန်ကုန် လူပင်ပန်းတယ်။ အပိုတွေ လို့ ထင်ရပါတယ်။ Project ပြီးမှ Test ရေးခြင်းကတော့ မဖြစ်သင့်ပါဘူး။ 

TDD ကို နားလည်ဖို့ အတွက် အရင်ဆုံး Application မှာ layers တွေ ခွဲရေးသင့်ကြောင့်ကို ပြီးခဲ့သည့် အခန်းမှာ ဖော်ပြခဲ့ပါတယ်။ ကျွန်တော်တို့တွေဟာ Test တွေကို အရေးပါသည့် function တစ်ခု ပြီးတိုင်းမှာ ထည့်သွင်းရေးသားပါတယ်။ ဥပမာ Business Logic တစ်ခု ပြီးတိုင်းမှာ Unit Test ကို ရေးသားပါတယ်။

Blog system တစ်ခုကို backend မှာ ရေးတယ် ဆိုပါဆို့။ Post တွေ အတွက် CRUD ရေးပြီးရင် UI ကို ထပ်ဆောက်။ ပြီးမှ create post တင်လိုက်ရင် database ထဲမှာ ဝင်မဝင် ဆိုပြီး သမာရိုးကျ စစ်ခဲ့ပါတယ်။ Test Driven Development မှာ ဆိုရင် Create Post function ရေးပြီးရင် အဲဒီ အတွက် Unit Test တစ်ခု ရေးပါတယ်။ Deleate အတွက် ရေးပြီးရင် Unit Test တစ်ခု ထပ်ရေးပါတယ်။​ Unit Test ဟာ  ဖြစ်နိုင်သည့် case တွေ အကုန် ထပ်စစ်ပါတယ်။ ဥပမာ Create Post မှာ success case ရှိမယ်။ validation fail case ရှိမယ်။ duplicate case တွေ ရှိမယ်။ ဖြစ်နိုင်သည့် case တွေကို Unit Test မှာ ထည့်ရေးပြီး စစ်ပါတယ်။`

Feature: Create Blog Post
  Scenario: Successful Post
    Given Post information
    When User has Login
    Then Check Post validation
    When Post has valid
    Then Save in database
 
  Scenario: Fail User Not Login Post
    Given Post information
    When User has not Login
    Then Show Error

  Scenario: Fail Post not valid
    Given Post information
    When User has Login
    Then Chekc Post Validation
    When Post validation fail
    Then Show Error

ဒီလို ဖြစ်နိုင်သည့် case တွေကို Unit Test မှာ စစ်ဆေးတာပါ။ Create Post မှာတင် Unit Test ၃ ခု သို့မဟုတ် ၃ ထက် မက လည်း ပေါ်နိုင်ပါတယ်။

Red/Green/Refactor

Unit Test မှာ အရေးကြီးတာက

  1. Red
  2. Green
  3. Refactor

ဆိုသည့် အပိုင်းပါ။

Red

Red ဆိုသည်မှာ Case တွေကို Red ဖြစ်အောင် အရင် ဖန်တီးရတာပါ။ Code မရေးခင်မှာ ဖြစ်နိုင်သည့် function တွေကို ကြိုစစ်ထားပါတယ်။  function က implement မလုပ်ထားသေးသည့် အတွက် fail ဖြစ်မှာပဲ။ 

Action:  ပါဝင်မယ့် fature တွေကို ကြိုပြီး test တွေ ရေးထားခြင်းပါ။ 

OutCome: test ကို run သည့် အခါမှာ fail ဖြစ်ပါမယ်။ Red indicator နဲ့ အကုန်ပြနေပါမယ်။ ဒါကြောင့် “Red” လို့ ခေါ်ပါတယ်။

Green

Green ကတော့ ဒုတိယ် အဆင့်ပါ။ ခုနက ရေးထားသည့် function တွေကို pass ဖြစ်အောင် ရေးသားသည့် အပိုင်းပါ။ အဓိကတော့ ရေးထားသည့် function တွေကို implement လုပ်ပြီး pass ဖြစ်အောင် လုပ်ခြင်းပါ။

Action: Test မှာ ရေးထားသားသည့် fail test တွေကို pass ဖြစ်အောင် ရေးသားရပါမည်။

Outcome: Test run ပြီးသည့် အခါမှာတော့ အကုန် pass ဖြစ်ပြီး green ဖြစ်ဖို့ လိုပါတယ်။

Refactor

Test တွေက pass ဖြစ်ပြီ ဆိုရင် Refactor ပြန်လုပ်ဖို့ လိုပါတယ်။ Code ကို clean လုပ်ဖို့ လိုပါတယ်။​ Clean လုပ်သည့် အခါမှာ လက်ရှိရှိနေသည့် behavior ကို မပြောင်းလဲ ပဲ refactor လုပ်ရပါမယ်။ Code duplication ဆို remove လုပ်တာ readability ကောင်းအောင် ပြင်တာ design pattern တွေ apply လုပ်တာတွေ ပါဝင်ပါတယ်။ ပြီးသည့် အခါ code ပြန် test လုပ်သည့် အခါ pass ဖြစ်နေဖို့ လိုပါတယ်။

Action: code ကို optimize လုပ်ရန် ၊​ clean ဖြစ်ပြီး maintainable code တွေ ဖြစ်အောင် ပြန် လုပ်ဖို့ လိုပါတယ်။

Outcome: Test က pass ဖြစ်ဖို့ လိုပါတယ်။ code ကတော့ ပိုပြီး ကောင်းမွန်သည့် code ဖြစ်လာဖို့ လိုပါတယ်။

ဘာလို့ Unit Test ရေးရတာလဲ

Unit Test ဟာ အကောင်းဆုံး document တစ်ခုပါ။ Project ဟာ documentation မရေးထားပေမယ့် Test Case တွေ Test Module တွေ ကို သေချာခွဲထုတ်ထားသည့် အခါမှာ ဘယ် function တွေက ဘာလုပ်တယ်။​ ဘယ်လိုမျိုး use case တွေ ရှိတယ် ဆိုတာကို တွေ့နိုင်ပါတယ်။ Test Case တွေ ရေးသားထားခြင်းဖြင့် ကိုယ့် ရဲ့ code ကို ပိုပြီး ယုံကြည်မှု ရှိစေပါတယ်။​ ဒါပေမယ့် တခြား တစ်ယောက်ယောက်က code ပြင်လိုက်လို့ ကိုယ်ရေးထားသည့် အပိုင်းတွေ ထိသွားမထိသွား သလားဆိုတာကို  သိရဖို့ Test Case ကို ပြန် run လိုက်ရုံပါပဲ။ ဒါကြောင့် team တွေနဲ့ ရေးသားသည့် အခါမှာ collaboration ပိုမို ကောင်းမွန် စေပါတယ်။

Testable Code

Test Driven Development ကို အသုံးပြုပြီး ရေးမှသာ code တွေကို testable ဖြစ်အောင် ရေးဖြစ်မှာပါ။ Project အစ အဆုံးပြီးမှ code ကို testable ဖြစ်အောင် ရေးသားဖို့ မလွယ်ပါဘူး။ TDD ကြောင့် testable ရေးသားရသာကြောင့် class တွေဟာ lose coupling ဖြစ်စေပါတယ်။ Dependency Injection ကိုလည်း မဖြစ်မနေ အသုံးပြုလာရပါတယ်။ TDD ကြောင့် code တွေကို SOLID principle ကို လိုက်နာအောင် သတိထားပြီး ရေးသားလာနိုင်ပါမယ်။