
What is Test-Driven Development?
Test-Driven Development (TDD) āĻā§?
Test-Driven Development āĻŦāĻž TDD āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž software development approach, āϝā§āĻāĻžāύ⧠āĻā§āĻĄ āϞā§āĻāĻžāϰ āĻāĻā§ Test āϞā§āĻāĻž āĻšāϝāĻŧāĨ¤ āĻŽāĻžāύā§, āĻāĻā§ āĻāĻŽāϰāĻž āĻ āĻŋāĻ āĻāϰāĻŋ āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻž āĻŦāĻž āĻāĻ feature-āĻāĻž āĻā§āĻŽāύ behave āĻāϰāĻŦā§, āϤāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻž Automated test āϞāĻŋāĻāĻŋ, āϤāĻžāϰāĻĒāϰ āϏā§āĻ Test pass āĻāϰāĻžāύā§āϰ āĻŽāϤ⧠āĻāϰ⧠āĻā§āĻĄ āϞāĻŋāĻāĻŋāĨ¤
āĻĄā§āĻā§āϞāĻĒāĻžāϰāϰāĻž āĻĒā§āϰāĻĨāĻŽā§ āĻļā§āϧ⧠āĻāϤāĻā§āĻā§ āĻā§āĻĄ āϞā§āĻā§ āϝāĻžāϤ⧠Test āĻĒāĻžāϏ āĻāϰā§āĨ¤ āĻāϰāĻĒāϰ āϧā§āϰ⧠āϧā§āϰ⧠Test āĻāϰ Code āĻĻā§āĻā§āĻ Refine āĻāϰā§, Clean āĻāϰā§, āϤāĻžāϰāĻĒāϰ āύāϤā§āύ Test āĻāĻŦāĻ āύāϤā§āύ Feature-āĻ āϝāĻžāϝāĻŧāĨ¤ āĻāĻāĻāĻžāĻŦā§ āĻā§āĻ āĻā§āĻ feedback loop-āĻāϰ āĻāĻŋāϤāϰ⧠āĻāĻžāĻ āĻāĻā§āϝāĻŧāĨ¤
TDD āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻāĻžāĻā§āϰ āĻāϤāĻŋ āĻāĻŽāĻžāϝāĻŧ, āĻāĻŋāύā§āϤ⧠āĻā§āĻĄā§āϰ āĻŽāĻžāύ āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ
āĻļā§āύāϤ⧠āĻāĻāĻā§ āĻāϞā§āĻā§ āĻŽāύ⧠āĻšāϞā§āĻ, TDD āĻāϏāϞ⧠āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻāĻā§āĻā§ āĻāϰā§āĻ “āϏā§āϞ⧠āĻĄāĻžāĻāύ” āĻāϰāĻžāϝāĻŧāĨ¤ āĻāĻžāϰāĻŖ āĻāĻā§āĻ āϧāĻžāĻĒā§ āĻĨā§āĻŽā§ āĻĨā§āĻŽā§:
- āĻā§āĻĄ Validate āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤
- āĻā§āĻĄ Refine āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤
- āĻā§āĻ āĻā§āĻ Cycle-āĻ Feedback āĻĒā§āϤ⧠āĻšāϝāĻŧāĨ¤
DevOps āĻāĻŋāĻŽāĻā§āϞ⧠āϏāĻžāϧāĻžāϰāĻŖāϤ Junior āĻĨā§āĻā§ senior āϏāĻŦ level-āĻāϰ developer-āĻĻā§āϰ TDD follow āĻāϰāϤ⧠Encourage āĻāϰā§āĨ¤ Java, Python, Laravel, NodeJS-āϰ āĻŽāϤ⧠āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻ, āĻŦāĻŋāĻāĻŋāύā§āύ Application, APIs āϏāĻŦ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ TDD use āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
āĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāϞ⧠Coding, Automated Unit-Level Testing āĻāϰ Code Design āĻāĻ āϤāĻŋāύāĻāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻž Strong relationship āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤ āĻšā§āϝāĻžāĻ, āĻļā§āϰā§āϤ⧠development-āĻ āĻāĻāĻā§ time āĻŦā§āĻļāĻŋ āϞāĻžāĻā§, āĻāĻŋāύā§āϤ⧠Overall debugging, Rework āĻāϰ Maintenance āĻāĻŽā§ āϝāĻžāϝāĻŧ āĻŦāϞ⧠Total time-āĻāĻžāĻ āĻŦāĻžāĻāĻā§āĨ¤
āĻā§āĻ āĻŦāĻžāĻāĻā§ āĻŦāĻĄāĻŧ āĻāϏā§āĻā§āϞā§āĻļāύ āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§āĻ āĻĨāĻžāĻŽāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧ TDD
TDD-āϤ⧠āϝā§āĻšā§āϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻž āϧāĻžāĻĒā§ Test āĻāĻā§, Code āĻĒāϰā§, āϤāĻžāĻ:
- Bug āĻŦāĻž Error āĻā§āĻŦ Early Stage-āĻ āϧāϰāĻž āĻĒāĻĄāĻŧā§āĨ¤
- āĻā§āĻ āϏāĻŽāϏā§āϝāĻž āĻāĻŋāύā§āϤ⧠Production-āĻ āĻŦāĻĄāĻŧ āϧāϰāύā§āϰ Incident āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§āĻ fix āĻāϰāĻž āϏāĻŽā§āĻāĻŦ āĻšā§āĨ¤
- āĻļā§āώā§āϰ āĻĻāĻŋāĻā§āϰ “Big Bang” QA phase āĻ āύā§āĻ Smooth āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
āĻ āϰā§āĻĨāĻžā§, TDD āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰāĻā§ āĻŦāĻžāϧā§āϝ āĻāϰ⧠āĻāĻā§āĻŦāĻžāϰ⧠āĻļā§āϰ⧠āĻĨā§āĻā§āĻ quality āύāĻŋāϝāĻŧā§ āĻāĻŋāύā§āϤāĻž āĻāϰāϤā§āĨ¤ āĻļā§āώā§āϰ āĻĻāĻŋāĻā§ āĻāϏ⧠“āĻŦāĻĄāĻŧ cleaning” āĻāϰāĻžāϰ āĻŦāĻĻāϞā§, āĻĒāĻĨāĻŋāĻŽāϧā§āϝ⧠āĻā§āĻ āĻā§āĻ Cleaning āĻšāϤā§āĻ āĻĨāĻžāĻā§āĨ¤
āĻ āύā§āϝ Testing Approach āĻā§āύ āĻŦā§āĻļāĻŋ āĻāĻžāĻŽā§āϞāĻž āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§
āĻ āύā§āĻ āĻāĻŋāĻŽ āĻāĻāύ⧠āĻĒā§āϰā§āύ⧠āϧāĻžāĻāĻā§ āĻāĻžāĻ āĻāϰā§, āϝā§āĻŽāύ:
- āĻāĻā§ āĻĒā§āϰ⧠Production Code āϞāĻŋāĻā§, āĻĒāϰ⧠Test Suite āϞā§āĻāĻž
- āĻŦāĻž āĻāĻāϏāĻžāĻĨā§ āĻĒā§āϰ⧠Test Suite āϞāĻŋāĻā§, āϤāĻžāϰāĻĒāϰ āϏāĻŦ Production Code āϞā§āĻāĻž
āĻāĻ approach-āĻā§āϞ⧠āĻāĻžāĻā§āϰ āĻ āϝā§āĻā§āϝ āύāĻž, āĻāĻŋāύā§āϤ⧠experience āĻŦāϞ⧠āĻĒā§āϰāĻā§āĻā§āĻ āĻŦāĻĄāĻŧ āĻāϰ complex āĻšāϞ⧠Debugging Time āĻ āύā§āĻ āĻŦā§āĻĄāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ āĻāĻžāϰāĻŖ Bug āϧāϰāĻž āĻĒāĻĄāĻŧā§ āĻ āύā§āĻ āĻĻā§āϰāĻŋāϤā§, āĻāϰ Context āĻŽāύ⧠āϰāĻžāĻāĻž, āĻā§āĻĨāĻžāϝāĻŧ āĻā§ āĻā§āĻā§āĻā§ āϤāĻž āĻŦā§āĻāϤ⧠āĻ āύā§āĻ āĻāώā§āĻ āĻšāϝāĻŧāĨ¤
TDD-āϤ⧠āϝā§āĻšā§āϤ⧠āĻāĻāĻāĻž āĻā§āĻ Unit āϧāϰā§āĻ Test āϞāĻŋāĻā§ āĻā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ, āϤāĻžāĻ Bug-āĻāϰ Root Cause Track āĻāϰāĻž āĻ āύā§āĻ āϏāĻšāĻ āĻšāϝāĻŧāĨ¤
Legacy code-āĻāϰ āĻā§āώā§āϤā§āϰā§āĻ TDD āĻāĻžāĻā§ āϞāĻžāĻā§
āĻ āύā§āĻā§ āĻāĻžāĻŦā§ TDD āĻļā§āϧ⧠New feature āĻŦāĻž āĻāĻā§āĻŦāĻžāϰ⧠Fresh project-āĻāϰ āĻāύā§āϝ, āĻāĻŋāύā§āϤ⧠āĻāϏāϞ⧠TDD āĻĒā§āϰā§āύ⧠Legacy code-āĻāϰ debugging āĻāϰ Refactoring-āĻāĻ āĻ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāĻā§ āϞāĻžāĻā§āĨ¤ āϧāϰā§āύ, āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻāĻŽāύ āĻāĻāĻāĻž āĻĒā§āϰā§āύ⧠Codebase āĻāĻā§ āϝā§āĻāĻž āĻā§āĻ āĻ āĻŋāĻāĻŽāϤ⧠Touch āĻāϰāϤ⧠āĻāĻžāϝāĻŧ āύāĻž, āĻāĻžāϰāĻŖ āϏāĻŦāĻžāĻ āĻāĻžāĻŦā§ “āĻāĻāĻž modify āĻāϰāϞ⧠āĻā§āĻĨāĻžāϝāĻŧ āĻā§ āĻā§āĻā§ āϝāĻžāĻŦā§ āĻā§ āĻāĻžāύā§!” āĻāĻāĻžāύ⧠TDD-āĻā§ āĻĸā§āĻāĻŋāϝāĻŧā§ āĻĻā§āĻāϝāĻŧāĻžāϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻāĻžāϞ⧠āĻāĻĒāĻžāϝāĻŧ āĻšāϞ⧠āĻāĻā§ āĻāĻ Legacy code-āĻāϰ āĻāĻžāϰāĻĒāĻžāĻļā§ āĻā§āĻ āĻā§āĻ Meaningful unit test āϞāĻŋāĻā§ āĻĢā§āϞāĻžāĨ¤
āĻŽāĻžāύā§, āĻāĻā§ āĻāĻŽāϰāĻž Test āĻĻāĻŋāϝāĻŧā§ Lock āĻāϰ⧠āύāĻŋāĻ āĻāĻ āĻā§āĻĄā§āϰ āĻŦāϰā§āϤāĻŽāĻžāύ behavior āĻā§āĨ¤ āϤāĻžāϰāĻĒāϰ āϧā§āϰ⧠āϧā§āϰ⧠āϏā§āĻ āĻā§āĻĄ clean, refactor āĻāϰ optimize āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰāĻŋāĨ¤ āĻāϰ āϝāĻāύāĻ āĻā§āύ⧠change āĻāϰāĻŋ, test suite āϰāĻžāύ āĻāϰ⧠āĻĻā§āĻāĻŋ āϏāĻŦ test āϏāĻŦā§āĻ (green) āĻāĻā§ āĻāĻŋ āύāĻžāĨ¤ āϏāĻŦā§āĻ āĻĨāĻžāĻāϞ⧠āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŋ behavior āĻāĻžāĻā§āĻā§āύāĻŋ āĻŦāϰāĻ āĻā§āĻĄāĻā§ āĻāϰāĻ āϏā§āύā§āĻĻāϰ āĻāϰā§āĻāĻŋāĨ¤ āĻāĻāĻžāĻŦā§ āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ TDD āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰā§āύā§, āĻā§āĻāĻāĻŋāĻĒā§āϰā§āĻŖ, āĻā§āĻ āύāĻž-āĻā§āĻāϝāĻŧāĻž āĻā§āĻĄāĻā§āĻ āϧā§āϰ⧠āϧā§āϰ⧠safer, predictable āĻāϰ maintainable structure-āĻ āύāĻŋāϝāĻŧā§ āĻāϏāĻž āϝāĻžāϝāĻŧāĨ¤
Traditional development-āĻāϰ āĻāϞā§āĻā§ āĻĒāĻĨā§ āĻšāĻžāĻāĻā§ TDD
Classic development-āĻ flow āĻāĻž generaly āĻāĻŽāύ āĻšāϝāĻŧ: āĻāĻā§ āĻā§āĻĄ, āĻĒāϰ⧠TestāĨ¤ TDD āĻāĻ flow āĻāĻžāĻā§ āĻāϞā§āĻā§ āĻĻā§āϝāĻŧ āĻāĻā§ Test, āĻĒāϰ⧠CodeāĨ¤ āĻāĻ Iterative approach-āĻāϰ āĻāĻŋāĻā§ āĻŦāĻĄāĻŧ Benefit āĻšāϞā§:
- āĻā§āĻĄ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ readable āĻāϰ maintainable āĻšāϝāĻŧāĨ¤
- Workflow āĻā§āϞ⧠Naturally testable āĻāĻžāĻŦā§ design āĻšāϝāĻŧāĨ¤
- Unit level-āĻ High Quality āĻā§āĻĄ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤
Unit testing āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŽāϰāĻž āĻā§āĻ āĻā§āĻ logic-āĻāϰ āĻĻāĻŋāĻā§ Focus āĻāϰāĻŋ, āϝā§āĻŽāύ āĻāĻāĻāĻž Specific function āĻŦāĻž AlgorithmāĨ¤ TDD-āϤ⧠āĻāĻŽāϰāĻž āϏā§āĻ Logic-āĻāĻžāĻ āĻāĻŽāύāĻāĻžāĻŦā§ āϞāĻŋāĻāĻŋ āϝāĻžāϤ⧠Defined test pass āĻāϰā§āĨ¤ āĻĢāϞā§:
- āĻā§āĻĄ Clean āĻāĻŦāĻ Durable āĻšāϝāĻŧāĨ¤
- Behavior-āĻāĻž Test-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏā§āĻĒāώā§āĻ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
- Future Developer-āĻĻā§āϰ āĻāύā§āϝ Tests-āĻ āĻāĻ āϧāϰāύā§āϰ Living documentation āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āĻāĻ āĻāĻĨāĻžāϝāĻŧ, Test-Driven Development (TDD) āĻļā§āϧ⧠Test āϞāĻŋāĻā§ āĻā§āĻĄ pass āĻāϰāĻžāύā§āϰ āĻāĻĨāĻž āύāĻž, āĻŦāϰāĻ āĻļā§āϰ⧠āĻĨā§āĻā§ āĻā§āĻĄāĻā§ design āĻāϰāĻžāϰ āĻāĻāĻāĻž disciplined mindset, āϝā§āĻāĻž long-term quality āĻāϰ stability-āϰ āĻāύā§āϝ āĻĻāĻžāϰā§āĻŖ InvestmentāĨ¤
Test-Driven Development (TDD) āĻāϰ āĻŽā§āϞ āϏā§āĻŦāĻŋāϧāĻžāϏāĻŽā§āĻš
Test-driven development āĻŦāĻž TDD āĻļā§āϧ⧠āĻāĻžāϞ⧠āĻā§āĻĄ āϞā§āĻāĻžāϰ āĻā§āϞ āύāĻž, āĻāĻāĻž āĻāϏāϞ⧠Better developer āĻŦāĻžāύāĻžāύā§āϰāĻ āĻāĻāĻāĻž āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏāĨ¤ āĻāĻ Approach-āĻāĻž Extreme Programming-āĻāϰ āĻāĻāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻ āĻāĻļ, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāĻā§ Test āϞāĻŋāĻāĻŋ, āϤāĻžāϰāĻĒāϰ āϏā§āĻ Test pass āĻāϰāĻžāύā§āϰ āĻāύā§āϝ āĻā§āĻĄ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻŋāĨ¤
āĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāϞ⧠Developer Project-āϰ āĻā§āϤāϰā§āϰ āĻā§āĻšāĻžāϰāĻž āĻ āύā§āĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰāĻāĻžāĻŦā§ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻāĻž Feature implement āĻāϰāĻžāϰ āĻāĻā§āĻ āϤāĻžāĻā§ āĻāĻžāĻŦāϤ⧠āĻšāϝāĻŧ “āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻž āĻāϏāϞ⧠client āĻŦāĻž user āĻā§āĻāĻžāĻŦā§ use āĻāϰāĻŦā§?”
āĻŽāĻžāύā§, āĻāĻā§ āĻĨā§āĻā§ Interface-āĻāϰ āĻāĻĨāĻž āĻāĻžāĻŦāϤ⧠āĻšāϝāĻŧ, āϤāĻžāϰāĻĒāϰ ImplementationāĨ¤ āĻāϰ āĻĢāϞāĻžāĻĢāϞ āĻā§ āĻšāϝāĻŧ?
- Product āĻŦā§āĻļāĻŋ User-centric āĻšāϝāĻŧāĨ¤
- Design decision āĻā§āϞ⧠āĻŦā§āĻļāĻŋ āϏāĻā§āϤāύāĻāĻžāĻŦā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤
āĻāĻŽāĻŋ āύāĻŋāĻā§āϰ āĻāĻžāĻā§āĻ āĻĻā§āĻā§āĻāĻŋ, Test āĻāĻā§ āϞāĻŋāĻāϤ⧠āĻāĻŋāϝāĻŧā§ āĻ āύā§āĻ Hidden requirement āĻāϰ Edge case āϧāϰāĻž āĻĒāĻĄāĻŧā§, āϝā§āĻā§āϞ⧠āύāĻž āĻāϰāϞ⧠āĻĒāϰ⧠Production-āĻ āĻāĻŋāϝāĻŧā§ āϧāĻžāĻā§āĻāĻž āĻā§āϤ⧠āĻšāϤā§āĨ¤
TDD-āĻāϰ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻāĻŋāĻā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϏā§āĻŦāĻŋāϧāĻž
ā§§. Comprehensive test coverage āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§
āĻ āύā§āĻā§āĻ TDD-āĻā§ āĻāĻ āϧāϰāύā§āϰ “specification” āĻŦāĻž “documentation tool”-āĻ āĻŦāϞā§, āĻāĻžāϰāĻŖ āĻāĻ practice-āĻ āĻĒā§āϰāĻžāϝāĻŧ āϏāĻŦ āĻā§āĻĄā§āϰ āĻĒā§āĻāύā§āĻ āĻ āύā§āϤāϤ āĻāĻāĻāĻž āĻāϰ⧠test āĻĨāĻžāĻā§āĨ¤ āĻĢāϞ⧠āĻā§āύ āĻ āĻāĻļāĻāĻž untested āĻĒāĻĄāĻŧā§ āĻāĻā§ āϏā§āĻāĻž āĻā§āĻŦ āϏāĻšāĻā§āĻ āϧāϰāĻž āϝāĻžāϝāĻŧ, āĻāϰ blind spot āĻāĻŽā§ āϝāĻžāϝāĻŧāĨ¤
⧍. Documentation āĻāϰ specification āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻšāϝāĻŧ
āϝ⧠āĻāĻžāϰāĻŖā§ Test coverage āĻŦāĻžāĻĄāĻŧā§, āĻāĻāĻ āĻāĻžāϰāĻŖā§ documentation-āĻ strong āĻšāϝāĻŧāĨ¤ āĻāĻ test āĻā§āϞā§āĻ Project manager, Developer, āĻāĻŽāύāĻāĻŋ āĻ āύā§āϝ Stakeholder-āĻĻā§āϰ āĻāύā§āϝ living specification āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻā§āύ Feature āĻā§ āĻāϰāĻŦā§, āĻā§āύ Input-āĻ āĻā§ Output āĻāϏāĻŦā§; āϏāĻŦ test case-āĻ āĻŦā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāϤ⧠āĻĒā§āϰ⧠project lifecycle-āĻ āĻāĻāĻāĻž āĻļā§āĻā§āĻāϞāĻž āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤
ā§Š. Code āĻāϰ test āĻĻā§āĻāĻāĻžāĻ confidence āĻŦāĻžā§āĻžā§
āϝ⧠āĻāĻŋāĻŽ TDD follow āĻāϰā§, āϤāĻžāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āϤāĻžāĻĻā§āϰ codebase-āĻāϰ āĻāĻĒāϰ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āĻāϤā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāϏ⧠āĻĨāĻžāĻā§āĨ¤ āĻāĻžāϰāĻŖ āĻā§āĻ-āĻŦāĻĄāĻŧ change āĻšāϞā§āĻ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ Test suite run āĻāϰ⧠āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāϝāĻŧ āϏāĻŦāĻāĻŋāĻā§ āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻžāĨ¤
ā§Ē. Continuous Integration (CI) āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻā§ āĻĻāĻžāϰā§āĻŖ āĻĢāĻŋāĻ
TDD āĻāϰ continuous integration āĻāĻāϏāĻžāĻĨā§ āĻā§āϞ⧠relationship āĻ āύā§āĻ āĻāĻžāϞ⧠āĻāĻžāĻ āĻāϰā§āĨ¤ āϝā§āĻšā§āϤ⧠code āϏāĻŦāϏāĻŽāϝāĻŧ test-āĻāϰ protection-āĻ āĻĨāĻžāĻā§, āϤāĻžāĻ āĻŦāĻžāϰāĻŦāĻžāϰ āύāϤā§āύ feature, patch āĻŦāĻž change merge āĻāϰāϞā§āĻ CI pipeline-āĻ issue detect āĻāϰāĻž āϏāĻšāĻ āĻšāϝāĻŧ, āĻāϰ integration break āĻšāĻāϝāĻŧāĻžāϰ āĻā§āĻāĻāĻŋ āĻāĻŽā§āĨ¤
ā§Ģ. Debugging effort āĻ āύā§āĻ āĻāĻŽā§ āϝāĻžāϝāĻŧ
TDD āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ⧠Testing āϏāĻžāĻŽāύā§, Debugging āĻĒā§āĻāύā§āĨ¤ āĻļā§āϰ⧠āĻĨā§āĻā§āĻ Test āϞāĻŋāĻā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻĢāϞ⧠āĻļā§āώā§āϰ āĻĻāĻŋāĻā§ āĻāĻŋāϝāĻŧā§ “āĻāĻ āĻāĻžāĻĻāĻž bug fix” āĻāϰāĻžāϰ āĻĻāϰāĻāĻžāϰ āĻ āύā§āĻ āĻāĻŽā§ āϝāĻžāϝāĻŧāĨ¤ Bug āĻā§āĻ āĻĨāĻžāĻāϤā§āĻ āϧāϰāĻž āĻĒāĻĄāĻŧā§, āϤāĻžāĻ Late-night debugging marathon āĻāĻŽ āĻšāϝāĻŧāĨ¤
ā§Ŧ. Requirement-āĻā§āϞ⧠āĻāĻā§āĻ crystal clear āĻšāϝāĻŧ
āĻĒā§āϰāϤāĻŋāĻāĻž āύāϤā§āύ āĻāĻžāĻā§āϰ āĻāĻā§ test case āϞāĻŋāĻāϤ⧠āĻā§āϞ⧠developer-āĻā§ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻŦā§āĻāϤ⧠āĻšāϝāĻŧ, “āĻāĻ requirement-āĻāĻž āĻāϏāϞ⧠āĻ āĻŋāĻ āĻā§ āĻāĻžāϝāĻŧ?” āĻāĻ Clarity āĻāĻžāĻĄāĻŧāĻž Meaningful test āϞā§āĻāĻž āϝāĻžāϝāĻŧ āύāĻž, āϤāĻžāĻ naturally requirement grooming āĻāϰ understanding-āĻ āĻāĻžāϞ⧠āĻšāϝāĻŧāĨ¤
ā§. Developer Productivity āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāĻā§āϝāĻžāϞāĻŋ āĻŦā§āĻĄāĻŧā§ āϝāĻžāϝāĻŧ
āĻ āύā§āĻ Research āĻāϰ Practical experience-āĻ āĻĻā§āĻāĻž āϝāĻžā§, TDD follow āĻāϰāϞ⧠Developer productivity āĻ āύā§āĻ āĻŦā§ā§ā§ āϝāĻžā§āĨ¤ āĻāĻžāϰāĻŖ āĻŦāĻĄāĻŧ āĻŦāĻĄāĻŧ āĻāĻžāĻāĻā§āϞā§āĻā§ āĻā§āĻ āĻā§āĻ Test-driven step-āĻ āĻā§āĻā§ āĻĢā§āϞāĻž āĻšāϝāĻŧāĨ¤ āĻāĻā§āĻāĻāĻž Test pass āĻāϰāĻžāύ⧠āĻŽāĻžāύ⧠āĻā§āĻ āĻāĻāĻāĻž wināĨ¤ āĻāϤ⧠focus āĻĨāĻžāĻā§, overwhelm āĻāĻŽ āĻšāϝāĻŧ, āĻāϰ āĻāĻžāĻ steady āĻāϤāĻŋāϤ⧠āĻāĻā§āϝāĻŧāĨ¤
ā§Ž. Simple design-āĻā§ reinforce āĻāϰā§
TDD-āĻāϰ āĻŦāĻŋāĻā§āϝāĻžāϤ cycle: Red â Green â RefactorāĨ¤ āĻāĻ Refactor āϧāĻžāĻĒāĻāĻž āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻā§ āĻŦāĻžāϰāĻŦāĻžāϰ āĻĒā§āϰāĻļā§āύ āĻāϰāϤ⧠āĻŦāĻžāϧā§āϝ āĻāϰ⧠“āĻāĻāĻž āĻāĻŋ āĻāϰāĻ simple āĻāϰāĻž āϝāĻžāϝāĻŧ?” āĻāĻ habit-āĻāĻžāĻ Simple, Clean, Maintainable design-āĻāϰ Culture āϤā§āϰāĻŋ āĻāϰā§āĨ¤
⧝. Mental model āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāϰā§
āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āĻ āĻĢāĻžāĻāĻļāύ, requirement āĻāϰ behavior-āĻā§ test-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ explore āĻāϰāϤ⧠āĻāϰāϤ⧠developer-āĻāϰ āĻŽāĻžāĻĨāĻžāϝāĻŧ āĻĒā§āϰ⧠āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻāĻāĻž solid mental map āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤ āĻā§āĻĨāĻžāϝāĻŧ āĻā§ Logic āĻāĻā§, āĻā§āύ āĻ āĻāĻļ āĻā§āύ Behavior-āĻāϰ āĻĻāĻžāϝāĻŧāĻŋāϤā§āĻŦā§; āĻāĻā§āϞ⧠āĻ āύā§āĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻĨāĻžāĻā§, āĻĢāϞ⧠āύāϤā§āύ Change āĻāύāĻž āĻŦāĻž Refactor āĻāϰāĻž āϏāĻšāĻ āĻšāϝāĻŧāĨ¤
ā§§ā§Ļ. System stability āĻāϰ overall reliability āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ
Consistent TDD practice āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻž āĻāĻŋāύāĻŋāϏ āĻā§āϝāĻžāϰāĻžāύā§āĻāĻŋ āĻĻā§āϝāĻŧ:
- āϏāĻšāĻ Design
- Well-tested Code
- Predictable Behavior
āĻĢāϞ⧠āĻĒā§āϰ⧠Application-āĻāϰ Stability āĻ āύā§āĻ āĻāĻžāϞ⧠āĻĨāĻžāĻā§āĨ¤ Production-āĻ Unexpected crash āĻŦāĻž “āĻšāĻ āĻžā§ āĻā§āĻā§ āĻā§āϞ” āĻāĻžāĻāĻĒ āĻĄā§āϰāĻžāĻŽāĻž āĻ āύā§āĻāĻāĻžāĻ āĻāĻŽā§ āϝāĻžāϝāĻŧāĨ¤
āĻāĻ āĻāĻĨāĻžāϝāĻŧ, Test-Driven Development (TDD) āĻļā§āϧ⧠“Test āĻāĻā§ āϞāĻŋāĻā§āύ” āĻāϰ āĻāĻĨāĻž āύāĻž, āĻŦāϰāĻ āĻāĻŽāύ āĻāĻāĻāĻž Disciplined workflow, āϝā§āĻāĻž Developer-āĻāϰ āĻāĻŋāύā§āϤāĻž, Design āĻāϰ Coding Style āϏāĻŦāĻāĻŋāĻā§āĻā§āĻ āϧā§āϰ⧠āϧā§āϰ⧠āĻŦā§āĻļāĻŋ mature āĻāϰ User-focused āĻāϰ⧠āϤā§āϞā§āĨ¤
Test-Driven Development (TDD) āĻāϰ āĻŦāĻžāϏā§āϤāĻŦ āĻā§āϝāĻžāϞā§āĻā§āĻāϏāĻŽā§āĻš
TDD āĻļā§āύāϤ⧠āϝāϤ āϏā§āύā§āĻĻāϰ āϞāĻžāĻā§, āĻĒā§āϰā§āϝāĻžāĻā§āĻāĻŋāĻā§āϝāĻžāϞ āĻāĻžāĻā§āϰ āϏāĻŽāϝāĻŧ āĻāĻŋāύā§āϤ⧠āĻāĻŋāĻā§ āĻāĻžāĻŽā§āϞāĻžāĻ āĻŽāĻžāĻĨāĻž āϤā§āϞ⧠āĻĻāĻžāĻāĻĄāĻŧāĻžāϝāĻŧāĨ¤ āĻ āύā§āĻ āĻāĻŋāĻŽ āĻĒā§āϰāĻĨāĻŽ āĻĻāĻŋāĻā§ āĻā§āĻŦ excited āĻšāϝāĻŧā§ TDD āĻļā§āϰ⧠āĻāϰā§, āĻāϰāĻĒāϰāĻ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧ Mocks, Integration Test, Private method test āĻāϰāĻž āĻāĻā§āϞ⧠āύāĻŋāϝāĻŧā§ āϧā§āϰ⧠āϧā§āϰ⧠āĻŦāĻŋāϰāĻā§āϤāĻŋ āĻŦāĻžāĻĄāĻŧāĻā§āĨ¤ āĻāĻŽāĻŋ āύāĻŋāĻā§āĻ āĻĒā§āϰāĻĨāĻŽ āĻĻāĻŋāĻā§ āĻ āĻŋāĻ āĻāĻ āĻāĻžāϝāĻŧāĻāĻžāĻā§āϞā§āϤ⧠āĻāĻŋāϝāĻŧā§ āϧāĻžāĻā§āĻāĻž āĻā§āϝāĻŧā§āĻāĻŋāĨ¤ āύāĻŋāĻā§ āĻĻā§āĻāĻāĻž āϏāĻŦāĻā§āϝāĻŧā§ Common āĻāϰ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻā§āϝāĻžāϞā§āĻā§āĻ āĻāϰ āϤāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āϏāĻŽāĻžāϧāĻžāύ āύāĻŋāϝāĻŧā§ āĻāĻĨāĻž āĻŦāϞāĻāĻŋāĨ¤
ā§§) Fakes, Mocks āĻāϰ Integration Test-āĻāϰ āĻāĻžāĻŽā§āϞāĻž
Unit test-āĻāϰ āĻŽā§āϞ āĻāĻāĻĄāĻŋāϝāĻŧāĻž āĻšāϞā§: āĻā§āĻ, Isolated component-āĻā§ āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ test āĻāϰāĻžāĨ¤ āĻāĻŋāύā§āϤ⧠āĻŦāĻžāϏā§āϤāĻŦā§ āĻāĻ Component āĻā§āϞ⧠āĻĒā§āϰāĻžāϝāĻŧāĻ External system-āĻāϰ āϏāĻžāĻĨā§ āĻāĻĨāĻž āĻŦāϞ⧠āϝā§āĻŽāύ Database, Message queue, External API āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻāĻžāύ⧠āĻāϏāϞ⧠āĻāĻŽāϰāĻž fakes āĻāϰ mocks āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ, āϝā§āύ:
- Test fast āĻšāϝāĻŧāĨ¤
- Environment setup āĻāĻŽ āϞāĻžāĻā§āĨ¤
- External dependency āĻāĻžāĻĄāĻŧāĻžāĻ logic verify āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
āĻāĻŋāύā§āϤ⧠āϏāĻŽāϏā§āϝāĻžāĻāĻž āĻšāϞā§, āĻāĻ fake āĻŦāĻž mock āĻāϏāϞ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻāϰāĻŖ āĻĒā§āϰā§āĻĒā§āϰāĻŋ Reflect āύāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻĢāϞ⧠Unit test āϏāĻŦā§āĻ, āĻāĻŋāύā§āϤ⧠Real environment-āĻ āĻāĻŋāϝāĻŧā§ āĻāĻāĻŽāĻāĻž āĻā§āĻā§ āϝāĻžā§ āĻāĻžāϰāĻŖ āĻāϏāϞ component āĻā§āϞ⧠āĻāĻāϏāĻžāĻĨā§ āĻ āĻŋāĻ āĻŽāϤ⧠āĻāĻžāĻ āĻāϰāĻā§ āύāĻžāĨ¤
āϏāĻŽāĻžāϧāĻžāύ āĻā§ āĻšāϤ⧠āĻĒāĻžāϰā§?
- Uunit test-āĻ mocks/fakes āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž, āϝā§āύ Logic isolated āĻāĻžāĻŦā§ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻĨāĻžāĻā§āĨ¤
- āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻ āĻŦāĻļā§āϝāĻ āĻāĻŋāĻā§ Solid integration test āϰāĻžāĻāĻž, āϝā§āĻāĻžāύ⧠Real database, Real API āĻŦāĻž Real component āĻā§āϞ⧠āĻāĻāϏāĻžāĻĨā§ run āĻāϰā§āĨ¤
- āĻāĻ Integration test āĻā§āϞ⧠end-to-end flow verify āĻāϰāĻŦā§āĨ¤
āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āϏāĻŦ āĻ āĻāĻļ (functionality) āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻž āύāĻž āĻĻā§āĻā§, āĻŦāϰāĻ āϏāĻŦ āĻ āĻāĻļ āĻāĻāϏāĻžāĻĨā§ āĻā§āĻĄāĻŧāĻž āϞāĻžāĻāĻžāϞ⧠āĻĒā§āϰ⧠āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋ āύāĻž; āĻāĻ verify āĻāϰāĻžāϰ āĻāĻžāĻāĻāĻžāĻ integration test-āĻāϰ
āĻŽāĻžāύā§, mocks/fakes-āĻāϰ āϏā§āĻŦāĻŋāϧāĻž āύā§āĻŦā§, āĻāĻŋāύā§āϤ⧠āϤāĻžāϰ āĻāĻĒāϰ ā§§ā§Ļā§Ļ% āĻāϰāϏāĻž āĻāϰāĻŦā§ āύāĻžāĨ¤ āϏāĻŦāĻļā§āώ⧠Integration test-āĻ confirm āĻāϰāĻŦā§ āĻāϏāϞ āĻāĻāϤ⧠Code āĻāϏāϞ⧠āĻ āĻŋāĻ āĻŽāϤ⧠āĻāϞāĻā§ āĻāĻŋ āύāĻžāĨ¤
⧍) Code Visibility āĻāϰ Encapsulation-āĻāϰ āĻāύāĻĢā§āϞāĻŋāĻā§āĻ
TDD āĻāϰāϞ⧠āĻāĻāĻāĻž Practical āϏāĻŽāϏā§āϝāĻž āĻā§āĻŦ āĻĻā§āϰā§āϤ āϧāϰāĻž āĻĒāĻĄāĻŧā§ āϤāĻž āĻšāϞ⧠Test code-āĻāϰ āϤ⧠āϏā§āĻ āĻā§āĻĄā§āϰ access āϞāĻžāĻāĻŦā§, āϝā§āĻāĻž āϏ⧠test āĻāϰāĻŦā§āĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻžāϞ⧠Design principle āĻŦāϞ⧠Information hiding āĻāϰ encapsulation follow āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āϏāĻŦ Method public āĻāϰāĻž āĻāĻžāϞ⧠design āύāĻžāĨ¤ Internal/Private detail āĻŦāĻžāĻāϰ⧠āĻāĻā§āϏāĻĒā§āĻ āĻāϰāĻž Clean Architecture-āĻāϰ āĻŦāĻŋāϰā§āĻĻā§āϧ⧠āϝāĻžāϝāĻŧāĨ¤
TDD āĻāϰāϤ⧠āĻāĻŋāϝāĻŧā§ āϝāĻāύ Private method, Private field āĻŦāĻž Internal logic test āĻāϰāϤ⧠āĻšāϝāĻŧ, āϤāĻāύ Developer-āϰāĻž āĻ āύā§āĻ āϏāĻŽāϝāĻŧ āĻāĻāĻā§ “āĻŦā§āĻāĻāύāĻŋ āĻļāϰā§āĻāĻāĻžāĻ” āĻāĻžāĻāĻĒ āĻāĻŋāĻā§ āĻāĻŋāύāĻŋāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āϝā§āĻŽāύ:
ā§§) Reflection
Reflection āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž āĻŽā§āĻāĻžāύāĻŋāĻāĻŽ, āϝā§āĻāĻž āĻĻāĻŋāϝāĻŧā§ runtime-āĻ āĻā§āύ⧠Class, Method, Field āĻāϤā§āϝāĻžāĻĻāĻŋāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻĒāĻĄāĻŧāĻž āĻāϰ āĻ
āύā§āĻ āĻā§āώā§āϤā§āϰ⧠āϏā§āĻā§āϞā§āϤ⧠āĻĸā§āĻā§ āĻāĻžāĻ āĻāϰāĻžāĻ āϝāĻžāϝāĻŧ, āĻāĻŽāύāĻāĻŋ āĻāĻā§āϞ⧠Private āĻšāϞā§āĻāĨ¤ āĻŽāĻžāύā§, Normally āϝā§āĻāĻžāϤ⧠Direct access āύā§āĻ, Reflection āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏā§āĻāĻžāύā§āĻ āĻĸā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāĻ āĻāĻžāϰāĻŖā§ test-āĻ hidden/private āĻāĻŋāύāĻŋāϏ⧠āĻĸā§āĻā§ Assertion āĻāϰāĻž āϏāĻŽā§āĻāĻŦ āĻšāϝāĻŧāĨ¤
⧍) Inner class
Inner class āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž class, āϝāĻž āĻ
āύā§āϝ āĻāĻāĻāĻž class-āĻāϰ āĻā§āϤāϰ⧠āĻĄāĻŋāĻĢāĻžāĻāύ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻ
āύā§āĻā§ test-āĻāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž Inner class āĻŦāĻžāύāĻžāϝāĻŧ, āϝāĻžāϤ⧠Outer class-āĻāϰ Private āĻŦāĻž Internal āĻāĻŋāύāĻŋāϏāĻā§āϞā§āϰ āĻāĻžāĻā§ āϏāϰāĻžāϏāϰāĻŋ access āĻĒāĻžāϝāĻŧāĨ¤ āĻāϤ⧠Test āĻā§āĻĄ āĻ Outer āĻā§āϞāĻžāϏā§āϰ āĻā§āϤāϰā§āϰ Implementation-āĻāϰ āĻā§āĻŦ āĻāĻžāĻā§ āĻāϞ⧠āϝāĻžāϝāĻŧāĨ¤
ā§Š) Partial classes
āĻāĻŋāĻā§ āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻā§ (āϝā§āĻŽāύ C#) Partial class āĻŽāĻžāύ⧠āĻšāϞ āĻāĻāĻāĻž class-āĻāϰ āĻĄā§āĻĢāĻŋāύāĻŋāĻļāύāĻā§ āĻāĻāĻžāϧāĻŋāĻ āĻĢāĻžāĻāϞ⧠āĻāĻžāĻ āĻāϰ⧠āϞā§āĻāĻžāĨ¤ āĻ
āύā§āĻ āϏāĻŽāϝāĻŧ Test context-āĻāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž partial āĻ
āĻāĻļā§ Extra helper āĻŦāĻž Internal access āϝā§āĻā§āϤ code āϞā§āĻāĻž āĻšāϝāĻŧ, āϝā§āĻā§āϞ⧠Production build-āĻ āύāĻž-āĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāϤ⧠test-āĻāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž behavior add āĻāϰāĻž āϝāĻžāϝāĻŧ, āĻāĻŋāύā§āϤ⧠āϏāĻŦ āĻŽāĻŋāϞāĻŋāϝāĻŧā§ āĻĄāĻŋāĻāĻžāĻāύ āĻāĻāĻā§ āĻāĻāĻŋāϞ āĻšāϝāĻŧā§ āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻ āϧāϰāύā§āϰ Technique āĻā§āϞ⧠āĻāĻžāĻ āĻ āĻŋāĻāĻ āĻāϰā§, āĻāĻŦāĻžāϰ āĻ āύā§āĻ āϏāĻŽāϝāĻŧ āĻŦāĻžāϏā§āϤāĻŦā§ āĻĻāϰāĻāĻžāϰāĻ āĻšāϝāĻŧ, āĻāĻŋāύā§āϤ⧠āĻāĻā§āϞā§āϰ āĻāĻĒāϰ āĻŦā§āĻļāĻŋ āĻāϰāϏāĻž āĻāϰāϞ⧠Design compromise āĻšāϝāĻŧ, Code structure āĻāĻŽ āĻā§āϞāĻŋāύ āϞāĻžāĻā§ āĻāϰ Future maintenance āĻāĻ āĻŋāύ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ āϤāĻžāĻ āĻāĻā§āϞā§āĻā§ Emergency tool āĻŦāĻž Temporary Solution āĻšāĻŋāϏā§āĻŦā§ āϧāϰāĻžāĻ āĻāĻžāϞā§, Long-term design pattern āĻšāĻŋāϏā§āĻŦā§ āύāĻžāĨ¤
āĻĒā§āϰā§āϝāĻžāĻā§āĻāĻŋāĻā§āϝāĻžāϞ āϏāĻŽāĻžāϧāĻžāύ āĻā§ āĻšāϤ⧠āĻĒāĻžāϰā§?
- āĻĒā§āϰāϝāĻŧā§āĻāύ⧠Reflection, Partial class āĻŦāĻž Inner class āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Test-āĻā§ Limited access āĻĻā§ā§āĻžāĨ¤
- āĻāĻŋāύā§āϤ⧠āĻāĻā§āϞā§āĻā§ Permanent solution āĻāĻžāĻŦāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤ āĻāĻā§āϞ⧠āϝā§āύ āĻŦā§āĻļāĻŋ āĻāϰ⧠Test context-āĻ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻĨāĻžāĻā§āĨ¤
- āĻ āύā§āĻ language-āĻ Conditional compilation āĻŦāĻž āĻāϞāĻžāĻĻāĻž Test-only configuration āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžāϝāĻŧ, āϝā§āĻāĻžāύ⧠test-āĻāϰ āĻāύā§āϝ extra access āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ, āĻāĻŋāύā§āϤ⧠production build-āĻ āĻāĻā§āϞ⧠exclude āĻāϰ⧠āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧāĨ¤
āĻāĻāĻžāĻŦā§ āĻāĻĒāύāĻŋ āĻĻā§āĻ āĻĻāĻŋāĻāĻ Balance āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ Test Code āϤāĻžāϰ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ visibility āĻĒāĻžāĻŦā§ āĻāĻŋāύā§āϤ⧠Production Design-āĻāϰ āĻāĻĒāϰ āĻā§āύ⧠āϏā§āĻĨāĻžāϝāĻŧā§ Negative effect āĻĒāĻĄāĻŧāĻŦā§ āύāĻž
āϏāĻāĻā§āώā§āĻĒā§, Test-Driven Development (TDD) āύāĻŋāĻā§ āĻā§āύ⧠āĻŽā§āϝāĻžāĻāĻŋāĻ āύāĻž, āĻāϰāĻ āύāĻŋāĻāϏā§āĻŦ āĻāĻŋāĻā§ āĻā§āϝāĻžāϞā§āĻā§āĻ āĻāĻā§āĨ¤ āĻāĻŋāύā§āϤ⧠fakes/mocks + integration test-āĻāϰ āϏāĻ āĻŋāĻ āĻāĻŽā§āĻŦāĻŋāύā§āĻļāύ āĻāϰ Smart code visibility strategy āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāϞā§, āĻāĻā§āϞā§āĻā§ āϏā§āύā§āĻĻāϰāĻāĻžāĻŦā§ handle āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤ āϤāĻāύ TDD āĻļā§āϧ⧠“āĻāϰāĻ Test āϞāĻŋāĻāĻŋ” āύāĻž, āĻŦāϰāĻ Clean design, Stable system āĻāϰ āϏā§āĻŽāĻžāϰā§āĻ Developer Mindset-āĻāϰ āĻāĻāĻāĻž āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻā§āϞ āĻšāϝāĻŧā§ āĻāĻ ā§āĨ¤
Agile Development āĻ TDD (Test-Driven Development) āĻā§āĻāĻžāĻŦā§ āĻĢāĻŋāĻ āĻāϰā§?
Agile āĻāϰ TDD-āĻā§ āĻāϞāĻžāĻĻāĻž āĻĻā§āĻā§ āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ āĻŽāύ⧠āĻšāϞā§āĻ, āĻāϏāϞ⧠āĻāϰāĻž āĻāĻā§-āĻ āĻĒāϰā§āϰ perfect partnerāĨ¤ AgileâāĻāϰ core value āϝā§āĻāĻžāύ⧠flexibility āĻāϰ collaboration, āϏā§āĻāĻžāύ⧠TDD āϏā§āĻ valueâāĻā§āϞā§āĻā§ āĻāϰāĻ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāϰā§āĨ¤ āĻāĻŽāĻŋ āύāĻŋāĻā§āϰ āĻāĻžāĻā§āĻ āĻĻā§āĻā§āĻāĻŋ, āϝ⧠āĻāĻŋāĻŽ Agile follow āĻāϰ⧠āĻāĻŦāĻ āϤāĻžāϰ āϏāĻžāĻĨā§ TDD use āĻāϰā§, āϤāĻžāĻĻā§āϰ delivery rhythm āĻ āύā§āĻ āĻŦā§āĻļāĻŋ predictable āĻāϰ āĻāĻŽ āĻāĻžāĻŽā§āϞāĻžāĻĒā§āϰā§āĻŖ āĻšāϝāĻŧāĨ¤
Agile āĻāϰ TDD-āϰ āĻāĻāĻāĻž āĻŦāĻĄāĻŧ common āĻŦāĻŋāώāϝāĻŧ āĻšāϞ⧠āĻĻā§āĻā§āĻ iterativeāĨ¤ Agile development āĻā§āĻ āĻā§āĻ iteration āĻŦāĻž sprint-āĻ āĻāĻžāĻ āĻšāϝāĻŧā§ āĻāϞā§, āĻāϰ TDD-āĻ āĻā§āĻ āĻā§āĻ feedback cycle-āĻ āĻāϞā§: Write Test â Test Fail â Write Code to pass â refactorāĨ¤
āĻĢāϞ⧠āĻā§āĻŦ āϏāĻšāĻā§āĻ TDD activities-āĻā§āϞā§āĻā§ Agile sprint-āĻāϰ āĻā§āϤāϰ āĻĒā§āϞā§āϝāĻžāύ āĻāϰāĻž āϝāĻžāϝāĻŧ āϝā§āĻŽāύ, āĻĒā§āϰāϤāĻŋāĻāĻž user story-āϰ āĻāύā§āϝ āĻāĻā§ Test case define, āϤāĻžāϰāĻĒāϰ ImplementationāĨ¤

Agile āĻāĻŋāĻŽā§āϰ āĻāϰā§āĻāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻā§āĻŖ āĻšāϞ⧠change-āĻāϰ āĻĒā§āϰāϤāĻŋ resilience āĻŽāĻžāύ⧠requirement change āĻšāϞā§āĻ āϤāĻžāϰāĻž āĻā§āĻā§ āĻĒāĻĄāĻŧā§ āύāĻž, āĻŦāϰāĻ adopt āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻžāύ⧠TDD āĻāĻŦāĻžāϰ extra safety net āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāĻžāϰāĻŖ āϝāĻāύ requirement change āĻšāϝāĻŧ, āϤāĻāύ developer āĻāĻžāύā§:
- āĻāĻŽāĻžāĻĻā§āϰ already āĻāĻāĻāĻž TDD-based test suite āĻāĻā§āĨ¤
- āύāϤā§āύ change āĻāύāĻžāϰ āĻĒāϰ āĻāĻā§āϞ⧠run āĻāϰāϞā§āĻ āĻŦā§āĻāĻž āϝāĻžāĻŦā§ āĻāĻŋāĻā§ āĻā§āĻā§ āĻā§āĻā§ āĻāĻŋ āύāĻžāĨ¤
āĻāĻ confidence āύāĻž āĻĨāĻžāĻāϞā§, requirement change āĻŽāĻžāύā§āĻ āĻā§āϤāϰ⧠āĻā§āϤāϰ⧠āĻāϝāĻŧ āĻāϰ āĻāĻŋāĻŽāĻŽā§āĻāĻĻā§āϰ āϏāĻžāĻĨā§ āĻāĻā§āϝ-āĻŦāĻžāĻā§āϝ “āĻāĻāĻž change āĻāϰāϞ⧠āĻāϰ āĻā§āĻĨāĻžāϝāĻŧ āĻā§ āĻāĻžāĻāĻŦā§ āĻā§ āĻāĻžāύā§!” “āĻāϤ āĻāύ āĻāύ āĻā§āĻā§āĻ āĻāύāϞ⧠āĻāĻžāĻ āĻāϰāĻž āϝāĻžā§?” “āĻāĻĒāύāĻžāϰāĻž āĻāĻžāĻā§āϰ āĻāĻŋāĻā§āĻ āĻŦā§āĻā§āύ āύāĻž!” “āĻā§āĻā§āĻ āĻāϰāĻŦā§āύ āϤāĻž āĻāĻā§ āĻāĻžāύāĻžāĻŦā§āύ āϤā§, āϤāĻžāĻšāϞ⧠āϤ⧠āĻāĻŽāϰāĻž āĻ āύā§āϝāĻāĻžāĻŦā§ āĻāϰāϤāĻžāĻŽ” āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
āĻāϰ āĻāĻāĻāĻžāĻ āĻāĻžāϰāύ āĻā§āĨ¤ āĻāĻžāϰāύ āĻāĻŽāĻžāϰ āύāĻŋāĻā§āϰ āϞā§āĻāĻž āĻā§āĻĄ āĻāĻŽāĻŋ āύāĻŋāĻā§āĻ āĻĒā§āϤ⧠āĻĒāĻžāϰāĻŋ āύāĻž, āĻāϰ āĻĒāĻžāϰāϞā§āĻ āĻā§āĻšāĻžāϰāĻž āϏā§āύā§āĻĻāϰ āύāĻžāĻāĨ¤ āĻāĻžāϰāύ AI āĻāϰ human āĻĻā§āĻ āĻŽāĻŋāϞ⧠āĻšāĻŋāĻā§āĻžāĻ (huai) āĻšā§ā§ āĻā§āĻā§āĨ¤ āĻāĻāύ āύāĻŋāĻā§āϰ āĻŽāĻžāĻĨāĻžāϰ āĻā§āϞ āύāĻŋāĻā§āϰ-āĻ āĻāĻŋā§āϤ⧠āĻŽāύ āĻāĻžā§āĨ¤
āĻāĻŋāύā§āϤ⧠TDD āĻĨāĻžāĻāϞ⧠Agile āĻāĻŋāĻŽ requirement change-āĻā§ threat āύāĻž, opportunity āĻšāĻŋāϏā§āĻŦā§ āĻĻā§āĻāϤ⧠āĻļā§āĻā§ āĻāϰ āĻāĻāĻŋāĻ āϏāĻĢāϞ Agile development-āĻāϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻļāĻā§āϤāĻŋāĻā§āϞā§āϰ āĻāĻāĻāĻŋāĨ¤
CI/CD Pipeline āĻ Test-Driven Development (TDD) Implement āĻāϰāĻžāϰ āĻāĻĒāĻžāϝāĻŧ
Test-Driven Development (TDD)-āĻāϰ āĻŽā§āϞ philosophy āĻāϏāϞ⧠āĻāĻāĻĻāĻŽ āϏā§āύā§āĻĻāϰāĻāĻžāĻŦā§ āĻŽāĻŋāϞ⧠āϝāĻžāϝāĻŧ continuous integration / continuous delivery (CI/CD)-āϰ goals-āϰ āϏāĻžāĻĨā§āĨ¤ Assured code quality, āĻĻā§āϰā§āϤ āĻāϰ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ release, āĻāϰ āĻĒā§āϰ⧠development process āĻā§āĻĄāĻŧā§ consistent feedback loopāĨ¤
CI/CD pipeline āĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻāĻžāĻāϞ⧠clean, efficient āĻāϰ easily maintainable āĻāĻāĻāĻž codebase āĻĻāϰāĻāĻžāϰ āĻšāϝāĻŧāĨ¤ TDD follow āĻāϰāϞā§, āύāϤā§āύ āϝ⧠āĻā§āύ⧠feature āĻŦāĻž functionality āĻļā§āϰ⧠āĻĨā§āĻā§āĻ āĻāĻāĻāĻŋ comprehensive test suite-āĻāϰ āĻāĻĒāϰ āĻĻāĻžāĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻĨāĻžāĻā§āĨ¤ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ refactor āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻā§āĻĄā§āϰ structure āĻāϰ readability āĻāϰāĻ āĻāĻžāϞ⧠āĻšāϝāĻŧ, āϝāĻž CI/CD-āϰ āĻāύā§āϝ āĻāĻāĻĻāĻŽ āĻāĻĒāϝā§āĻā§āϤāĨ¤
CI/CD environment-āĻ problem detect āĻāϰ resolve āĻāϰāϤ⧠āĻšāϝāĻŧ āĻā§āĻŦ āĻĻā§āϰā§āϤāĨ¤ TDD-āϰ early bug detection-āĻāϰ āĻā§āώāĻŽāϤāĻž āϝ⧠āĻā§āύ issues-āĻā§ development-āĻāϰ āĻāĻāĻĻāĻŽ early stage-āĻ āϧāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§, āĻĢāϞ⧠āϏā§āĻā§āϞ⧠main codebase-āĻ āĻŦāĻžāϰāĻŦāĻžāϰ āĻĢāĻŋāϰ⧠āĻāϏāĻžāϰ āϏā§āϝā§āĻ āĻĒāĻžāϝāĻŧ āύāĻžāĨ¤
āĻāϰā§āĻāĻāĻž important āĻŽāĻŋāϞ āĻšāĻā§āĻā§ automationāĨ¤ TDD āĻāϰ CI/CD-āĻĻā§’āĻā§āĻ Testing process automation-āĻā§ encourage āĻāϰā§āĨ¤ āϝāĻāύ āĻāĻĒāύāĻŋ TDD-driven automated test-āĻā§āϞā§āĻā§ CI/CD pipeline-āϰ āϏāĻžāĻĨā§ integrate āĻāϰāĻŦā§āύ, āϤāĻāύ Testing āĻāϰ āĻāϞāĻžāĻĻāĻž āĻā§āύ⧠āϧāĻžāĻĒ āĻĨāĻžāĻā§ āύāĻž āĻŦāϰāĻ development āĻāϰ deployment process-āĻāϰ āĻāĻ āĻ āĻŦāĻŋāĻā§āĻā§āĻĻā§āϝ āĻ āĻāĻļ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
CI/CD setup-āĻ frequent āĻāϰ rapid change āĻāĻāĻĻāĻŽ normal, āϤāĻžāĻ developer-āĻĻā§āϰ āύāĻŋāĻā§āϰ āĻā§āĻĄ āύāĻŋāϝāĻŧā§ confident āĻĨāĻžāĻāĻž āĻā§āĻŦāĻ āĻāϰā§āϰāĻŋāĨ¤ TDD āĻĨāĻžāĻāϞ⧠dev-āϰāĻž āĻ āύā§āϤāϤ āĻāĻāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻĨāĻžāĻā§ āϝ⧠āϤāĻžāĻĻā§āϰ latest code change already āĻāĻāĻāĻž āĻļāĻā§āϤ test battery āĻĒāĻžāϏ āĻāϰā§āĻā§āĨ¤
āϏāĻŦ āĻŽāĻŋāϞāĻŋāϝāĻŧā§, TDD āĻļā§āϧ⧠CI/CD-āϰ āϏāĻžāĻĨā§ compatible āύāĻž, āĻŦāϰāĻ āĻ āύā§āĻ āĻā§āώā§āϤā§āϰ⧠CI/CD pipeline-āĻā§ āĻŦāĻžāϏā§āϤāĻŦā§ workable āĻāϰ⧠āϤā§āϞāĻžāϰ āĻ āύā§āϝāϤāĻŽ āĻāĻŋāϤā§āϤāĻŋ āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ CI/CD-āϰ āĻŽāϧā§āϝ⧠Test environment manage āĻāϰāϤā§āĻ āĻāĻāĻ mindset āĻāϰ automation driven āĻāĻ approach āĻĻāĻžāϰā§āĻŖ āĻāĻžāĻā§ āϞāĻžāĻā§āĨ¤
TDD āĻĻāĻŋāϝāĻŧā§ CI/CD-āϤ⧠Reliable Software Delivery
Test-first approach āĻ āύā§āϏāϰāĻŖ āĻāϰāĻž Test-Driven Development (TDD) āϏāĻĢāĻāĻāϝāĻŧā§āϝāĻžāϰāĻā§ āĻāϰ⧠āĻŦā§āĻļāĻŋ reliable, bug āϧāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āĻ āύā§āĻ earlier stage-āĻ, āĻāϰ long-term maintenance cost āĻāĻŽāĻŋāϝāĻŧā§ āĻāύā§āĨ¤ Expressive āĻāϰ well-covered test case-āĻāϰ āĻāĻĒāϰ āĻāϰ āĻāϰ⧠āĻĒā§āϰ⧠software development process āĻ āύā§āĻ āĻŦā§āĻļāĻŋ optimized āĻāϰ āĻā§āĻĄā§āϰ overall quality āĻ āύā§āĻ āĻāύā§āύāϤ āĻāϰā§āĨ¤
TDD-āϰ āĻāĻ structured framework-āĻāϰ āĻāĻžāϰāĻŖā§ āĻā§āĻĄ āĻšāϝāĻŧ rigorously tested āĻāϰ dependable āϝāĻž fast CI/CD deployment cycle-āĻāϰ āĻāύā§āϝ āĻāĻā§āĻŦāĻžāϰ⧠core requirementāĨ¤ āĻāĻāĻā§āϰ āĻĻā§āϰā§āϤ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ delivery world-āĻ CI/CD-āĻā§ TDD āĻāĻžāĻĄāĻŧāĻž āĻāϞā§āĻĒāύāĻž āĻāϰāĻžāĻāĻžāĻ āĻāĻ āĻŋāύāĨ¤
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāĻā§āϰ CI/CD pipeline-āĻāϰ āĻ
āĻāĻļ āĻšāĻŋāϏā§āĻŦā§ TDD adopt āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āϧā§āϰ⧠āϧā§āϰ⧠āĻĻā§āĻāĻŦā§āύ more reliable, high-quality software delivery āĻāĻĒāύāĻžāϰ āĻāĻŋāĻŽā§āϰ āĻāύā§āϝ āĻāĻāĻāĻž consistent reality āĻšāϝāĻŧā§ āĻāĻ āĻā§, āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽ āύāĻž āĻŦāϰāĻ āύāĻŋāϝāĻŧāĻŽāĨ¤
TDD Best Practices
What to do – āϤāĻžāĻšāϞ⧠āĻā§ āĻāϰāĻž āĻāĻāĻŋāϤ?
ā§§) āĻāĻāĻāĻž Test method-āĻāϰ āĻāĻŋāϤāϰ⧠āĻā§āĻĄā§āϰ layout āĻŦāĻž āϏāĻžāĻāĻžāύā§-āĻā§āĻāĻžāύ⧠āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻā§āĻŦ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤ āĻā§āύ āϧāĻžāĻĒā§ āĻā§ āĻšāĻā§āĻā§, āϏā§āĻāĻž āĻā§āĻā§ āĻĒāĻĄāĻŧāĻžāϰ āĻŽāϤ⧠āĻšāϞ⧠Test āĻĒāĻĄāĻŧāϤ⧠āĻāϰ āĻŦā§āĻāϤ⧠āϏāĻšāĻ āĻšāϝāĻŧāĨ¤ Logical flow āĻ āĻŋāĻ āĻĨāĻžāĻāϞ⧠āĻā§āϞ āĻāϰ⧠āĻā§āύ⧠āϏā§āĻā§āĻĒ āĻŦāĻžāĻĻ āĻĒāĻĄāĻŧā§ āϝāĻžāĻāϝāĻŧāĻžāϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻžāĻ āĻāĻŽā§ āϝāĻžāϝāĻŧāĨ¤ āĻāĻžāϞ⧠layout āĻŽāĻžāύ⧠āĻšāϞ⧠āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻĒāĻĄāĻŧāϤ⧠āĻāĻŋāϝāĻŧā§āĻ āĻŦā§āĻā§ āĻĢā§āϞāĻž āϝāĻžāϝāĻŧ, Test āĻāĻž āĻāϏāϞ⧠āĻā§ verify āĻāϰāĻā§āĨ¤
⧍) āϏāĻŦ Test case āϝāĻĻāĻŋ āĻāĻāĻ āϧāϰāύā§āϰ āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ⧠āϞā§āĻāĻž āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧠āĻāĻā§āϞ⧠āύāĻŋāĻā§āĻ āĻāĻ āϧāϰāύā§āϰ Documentation āĻšāϝāĻŧā§ āĻĻāĻžāĻāĻĄāĻŧāĻžāϝāĻŧāĨ¤ āύāϤā§āύ āĻā§āĻ āĻāϏ⧠āĻā§āĻĄ āĻĻā§āĻāϞā§āĻ āĻļā§āϧ⧠Test-āĻ āĻĒāĻĄāĻŧā§ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§ āϏāĻŋāϏā§āĻā§āĻŽ āĻā§āĻāĻžāĻŦā§ Behave āĻāϰāĻŦā§āĨ¤ Consistent structure āĻāĻŋāĻŽā§ Shared understanding āϤā§āϰāĻŋ āĻāϰā§, āĻĢāϞ⧠āϏāĻŦāĻžāĻ āĻāĻāĻ Pattern follow āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāϤ⧠Test maintenance-āĻ āϏāĻšāĻ āĻšāϝāĻŧāĨ¤
ā§Š) āĻāĻžāϞ Test case āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻž Common Pattern āĻĢāϞ⧠āĻāϰā§āĨ¤ āĻāĻā§ Setup (āĻĄāĻžāĻāĻž/āϏā§āĻā§āĻ āĻĒā§āϰāϏā§āϤā§āϤ), āϤāĻžāϰāĻĒāϰ Execution (āϝ⧠action āĻāĻž test āĻāϰāĻŦ), āĻāϰāĻĒāϰ Validation (assertion āĻĻāĻŋāϝāĻŧā§ result āϝāĻžāĻāĻžāĻ), āĻāϰ āĻļā§āώ⧠Cleanup (resource free āĻāϰāĻž)āĨ¤ āĻāĻ flow follow āĻāϰāϞ⧠Test āĻ āύā§āĻ āĻŦā§āĻļāĻŋ Predictable āĻšāϝāĻŧāĨ¤ āĻ āύā§āĻā§āĻ āĻāĻāĻžāĻā§ Arrange-Act-Assert āύāĻžāĻŽā§āĻ āĻā§āύā§, āĻŽā§āϞ āĻāĻĨāĻž āĻšāĻā§āĻā§ āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻž Responsibility-āĻā§ Clear Block-āĻ āĻāĻžāĻ āĻāϰāĻžāĨ¤
ā§Ē) āĻ āύā§āĻ Test case-āĻāϰ setup āĻāϰ Teardown āĻ āĻāĻļ āĻāĻāĻ āϰāĻāĻŽ āĻšāϝāĻŧ, āϝā§āĻŽāύ Database connect āĻāϰāĻž, Dummy user create āĻāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻā§āϞ⧠āĻĒā§āϰāϤā§āϝā§āĻ Test-āĻāϰ āĻā§āϤāϰ⧠āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻž āϞāĻŋāĻāϞ⧠Duplication āĻŦāĻžāĻĄāĻŧā§ āĻāϰ Maintenance-āĻ āĻāĻžāĻŽā§āϞāĻž āĻŦāĻžā§ā§āĨ¤ āĻŦāϰāĻ Common setup/teardown-āĻā§āϞā§āĻā§ āĻāϞāĻžāĻĻāĻž Helper, Base class āĻŦāĻž Test support service-āĻ āύāĻŋāϝāĻŧā§ āĻā§āϞ⧠Reuse āĻāϰāĻž āϏāĻšāĻ āĻšāϝāĻŧāĨ¤ āĻāϤ⧠Test āĻā§āϞ⧠āĻā§āĻ, āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻāϰ āĻļā§āϧā§āĻ behavior-āĻ focus āĻĨāĻžāĻā§āĨ¤
ā§Ģ) Test oracle āĻŽāĻžāύ⧠āĻšāϞ⧠āϏā§āĻ āĻ āĻāĻļāĻāĻž, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž assert āĻŦāĻž verify āĻāϰāĻŋ, āĻāϏāϞ result āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻžāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž test-āĻ āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻāĻŋāύāĻŋāϏ Validate āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāϞ⧠Test brittle āĻŦā§āĻāĻž āĻāĻ āĻŋāύ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ āĻŦāϰāĻ āĻāĻāĻāĻž Test case-āĻā§ āĻ āϞā§āĻĒ āĻāĻŋāĻā§ Critical behavior āĻŦāĻž outcome-āĻāϰ āĻāĻĒāϰ focus āϰāĻžāĻāϤ⧠āĻĻā§āĻā§āĻžāĨ¤ āĻāϤ⧠Bug āϧāϰāĻž āϏāĻšāĻ āĻšāϝāĻŧ, āĻāϰ Failure āĻĻā§āĻāϞā§āĻ āĻŦā§āĻāĻž āϝāĻžāϝāĻŧ āĻ āĻŋāĻ āĻā§ āĻā§āĻā§āĻā§āĨ¤
ā§Ŧ) āϝ⧠āϏāĻŦ Test-āĻ time, Delay āĻŦāĻž Timeout āύāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧ, āϏā§āĻā§āϞā§āϤ⧠āϧāϰ⧠āύā§āĻāϝāĻŧāĻž āϝāĻžāĻŦā§ āύāĻž āϝ⧠āϏāĻŦāĻāĻŋāĻā§ Millisecond accurate āĻšāĻŦā§āĨ¤ Operating system, scheduler, CI environment āĻāϏāĻŦ āĻāĻžāϰāĻŖā§ āĻāĻāĻā§ up-down āĻšāĻāϝāĻŧāĻžāĻ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻāĨ¤ āϤāĻžāĻ āĻāĻ āϧāϰāύā§āϰ Test āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϧāϰ⧠āύāĻŋāϤ⧠āĻšāĻŦā§ Environment real-time āύāĻž, āĻŦāϰāĻ Approximate Timing-āĻ āĻāĻžāĻ āĻāϰāĻā§āĨ¤ āύāĻāϞ⧠āĻā§āĻ Timing variance-āĻāϰ āĻāĻžāϰāĻŖā§ āĻ āĻāĻžāϰāĻŖā§ Test Fail āĻāϰāĻŦā§āĨ¤
ā§) āϝāĻāύ āϏāĻŽāϝāĻŧ-āύāĻŋāϰā§āĻāϰ Behavior test āĻāϰāĻž āĻšāϝāĻŧ (āϝā§āĻŽāύ ā§§ āϏā§āĻā§āύā§āĻĄā§āϰ āĻŽāϧā§āϝ⧠āĻāĻŋāĻā§ āĻšāϤ⧠āĻšāĻŦā§), āϤāĻāύ Exact ā§§.ā§Ļā§Ļ āϏā§āĻā§āύā§āĻĄā§āϰ āĻāĻĒāϰ assertion āĻĻāĻŋāϞ⧠often test false negative āĻĻā§āϝāĻŧ (āĻāϏāϞ⧠āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻžāĻ āĻāϰāĻā§ āĻ āĻŋāĻāĻ āĻāĻŋāύā§āϤ⧠Test āĻŦāϞāĻā§, “āĻā§āϞ āĻšā§ā§āĻā§”)āĨ¤ āĻāĻāύā§āϝ āĻāĻāĻāĻž small margin āϰāĻžāĻāĻž āĻāĻžāϞā§, āϝā§āĻŽāύ ā§Ģ-ā§§ā§Ļ% extra windowāĨ¤ āϧāϰā§āύ ā§§ āϏā§āĻā§āύā§āĻĄā§āϰ āĻāĻžāĻ, āĻāĻĒāύāĻŋ ā§§.ā§§ āϏā§āĻā§āύā§āĻĄ āĻĒāϰā§āϝāύā§āϤ acceptable āϧāϰ⧠āύāĻŋāϞ⧠āĻā§āĻāĻāĻžāĻā§ delay āĻšāϞā§āĻ Test āĻĒāĻžāϏ āĻāϰāĻŦā§āĨ¤ āĻāϤ⧠Flaky test āĻāĻŽāĻŦā§ āĻāϰ Pipeline āĻāϰāĻ Stable āĻšāĻŦā§āĨ¤
ā§Ž) āĻ āύā§āĻā§āĻ āĻā§āϞ āĻāϰ⧠āĻāĻžāĻŦā§ Test Code “āĻŽāĻžāĻŽā§āϞāĻŋ”, āϤāĻžāĻ āĻāĻāĻžāύ⧠āĻā§āĻāĻŋāϝāĻŧā§ āϞā§āĻāĻž āϞāĻžāĻā§ āύāĻž, āĻāĻāĻž āĻŦāĻĄāĻŧ āĻā§āϞāĨ¤ Test code-āĻ āϤ⧠Production code-āĻā§ Protect āĻāϰā§, āϤāĻžāĻ āĻāĻāĻžāĻ long-term āĻāϞāĻžāϰ āĻŽāϤā§, Readable āĻāϰ Clean āĻšāĻāϝāĻŧāĻž āĻāĻžāĻāĨ¤ Refactor, Naming, Structure āϏāĻŦ Production-āĻāϰ āĻŽāϤā§āĻ āĻā§āϰā§āϤā§āĻŦ āĻĻāĻŋāϝāĻŧā§ āĻĻā§āĻāĻž āĻĻāϰāĻāĻžāϰāĨ¤ āύāĻžāĻšāϞ⧠āĻāĻŋāĻā§āĻĻāĻŋāύ āĻĒāϰ Test code-āĻ Technical Debt āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
⧝) āĻļā§āϧ⧠Production Code Review āύāĻž, Test code-āĻāϰāĻ Regular review āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤāĨ¤ āĻāϤ⧠āĻāĻŋāĻŽā§āϰ āĻŽāϧā§āϝ⧠āĻāĻžāϞ⧠pattern, naming, structure, mocking strategy āĻāϏāĻŦ āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāĻāĻ āϏāĻžāĻĨā§ āĻā§āĻ āϝāĻĻāĻŋ fragile test āĻŦāĻž over-mocking, over-assertion āĻāϰ āĻŽāϤ⧠bad habit āĻĢāϞ⧠āĻāϰā§, āϏā§āĻāĻž āϏāĻŽāϝāĻŧāĻŽāϤ⧠āϧāϰāĻž āĻĒāĻĄāĻŧā§āĨ¤ āĻāĻ collective learning āĻāĻŋāĻŽ-āĻāϰ overall testing quality āĻ āύā§āĻ āĻŦāĻžāĻĄāĻŧāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧāĨ¤
What to avoid – āϝā§āĻā§āϞ⧠āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻāϞāĻž āĻāĻāĻŋā§
ā§§) āĻāĻāĻāĻž Test āϝā§āύ āĻāϰā§āĻāĻāĻž Test-āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āύāĻž āĻāϰ⧠āϝā§āĻŽāύ “āĻāĻā§āϰ Test āϰāĻžāύ⧠āĻāĻ āĻĄāĻžāĻāĻž āϤā§āϰāĻŋ āĻāϰā§āĻā§, āϤāĻžāĻ āĻāĻŽāĻŋ āϧāϰ⧠āύāĻŋāĻā§āĻāĻŋ āϏā§āĻāĻž āĻāĻā§āĨ¤” āĻāĻāĻžāĻŦā§ dependency āϤā§āϰāĻŋ āĻšāϞ⧠āĻāĻāĻāĻž test āĻŦā§āϰā§āĻ āĻāϰāϞ⧠āĻāϰ āϏāĻžāĻĨā§ āĻ āύā§āĻāĻā§āϞ⧠Test-āĻ āĻŦā§āϰā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϤāĻžāĻāĻžāĻĄāĻŧāĻž Test run-āĻāϰ Order āĻŦāĻĻāϞāĻžāϞā§āĻ behavior āĻĒāĻžāϞā§āĻā§ āϝāĻžāϝāĻŧ, āϝāĻž āĻā§āĻŦāĻ āĻŦāĻŋāĻĒāĻā§āĻāύāĻāĨ¤ āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž test-āĻā§ Independent āĻāϰ self-contained āϰāĻžāĻāϤ⧠āĻšāĻŦā§āĨ¤
⧍) Interdependent test āĻŽāĻžāύā§, āĻāĻāĻāĻŋ Fail āĻāϰāϞ⧠āϤāĻžāϰ āĻĒāĻŋāĻāύ⧠āĻāϰāĻ āĻāϝāĻŧā§āĻāĻāĻž test āĻ āĻāĻžāϰāĻŖā§ fail āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϤāĻāύ āĻāϏāϞ root cause āĻā§āĻāĻāϤ⧠āĻāĻŋāϝāĻŧā§ āϏāĻŽāϝāĻŧ āύāώā§āĻ āĻšāϝāĻŧ, āĻāĻžāϰāĻŖ āϏāĻŦ failure-āĻ āĻāϏāϞ⧠āĻāĻāĻāĻžāĻ āϏāĻŽāϏā§āϝāĻžāϰ symptomāĨ¤ āĻāĻāĻžāĻā§ cascading false negatives āĻŦāϞāĻž āϝāĻžāϝāĻŧāĨ¤ āϤāĻžāĻ design-āĻāϰ āϏāĻŽāϝāĻŧāĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻšāĻŦā§, āĻāĻ test-āĻāϰ result āϝāĻžāϤ⧠āĻāϰā§āĻ test-āĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āύāĻž āĻāϰā§āĨ¤
ā§Š) Unit test-āĻ āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ functional behavior verify āĻāϰāĻŋ, ultra-precise timing āĻŦāĻž performance āύāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋ millisecond, āĻĒā§āϰāϤāĻŋ instruction count, āĻā§āĻŦ specific timing window āĻāϏāĻŦ āϧāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāϞ⧠test flaky āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ āĻ āϧāϰāύā§āϰ sensitivity āĻĻāϰāĻāĻžāϰ āĻšāϞ⧠āĻāϞāĻžāĻĻāĻž performance test, load test āĻŦāĻž benchmark āϤā§āϰāĻŋ āĻāϰāĻž āĻāĻžāϞā§āĨ¤ Unit test-āĻā§ stable, deterministic āĻāϰ environment-independent āϰāĻžāĻāĻž āĻŦā§āĻļāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤
ā§Ē) āĻāĻžāϞ⧠test āϏāĻžāϧāĻžāϰāĻŖāϤ “āĻā§ outcome āĻšāĻŦā§” āϏā§āĻāĻž verify āĻāϰā§, “āĻāĻŋāϤāϰ⧠āĻā§āĻāĻžāĻŦā§ āĻāϰāĻž āĻšāϞ⧔ āϏā§āĻāĻž āύāĻžāĨ¤ Implementation detail test āĻāϰāϞ⧠āĻāĻĒāύāĻŋ āĻā§āĻĄ āϰāĻŋāĻĢā§āϝāĻžāĻā§āĻāϰ āĻāϰāϞā§āĻ āĻĒā§āϰāĻā§āϰ test āĻā§āĻā§ āϝāĻžāĻŦā§, āϝāĻĻāĻŋāĻ behavior āĻ āĻŋāĻāĻ āĻāĻā§āĨ¤ āĻāϤ⧠test āĻāĻ āϧāϰāύā§āϰ constraint āĻŦāĻž āĻŦāĻžāĻāϧāĻž āĻšāϝāĻŧā§ āĻĻāĻžāĻāĻĄāĻŧāĻžāϝāĻŧāĨ¤ āϤāĻžāĻ test-āĻā§ āĻŦā§āĻļāĻŋ āĻāϰ⧠public API, observable behavior āĻāϰ business rule-āĻāϰ āĻāĻĒāϰ āĻĢā§āĻāĻžāϏ āĻāϰāϤ⧠āĻĻā§ā§āĻž āĻāĻāĻŋā§āĨ¤
ā§Ģ) āĻ āϤāĻŋāϰāĻŋāĻā§āϤ Slow test suite Developer-āĻĻā§āϰ test āĻāĻžāϞāĻžāϤ⧠āύāĻŋāϰā§ā§āϏāĻžāĻšāĻŋāϤ āĻāϰā§, āĻĢāϞ⧠āϞā§āĻāĻāύ shortcut āύāĻŋāϤ⧠āĻļā§āϰ⧠āĻāϰā§āĨ¤ CI/CD pipeline-āĻāĻ slow test āĻŽāĻžāύ⧠feedback āĻ āύā§āĻ āĻĻā§āϰāĻŋāϤ⧠āĻāϏā§, āϝāĻž Agile āĻāϰ TDD-āĻāϰ āϏā§āĻĒāĻŋāϰāĻŋāĻā§āϰ āĻŦāĻŋāϰā§āĻĻā§āϧ⧠āϝāĻžāϝāĻŧāĨ¤ āĻāĻāύā§āϝ heavy āĻŦāĻž long-running test āĻā§āϞā§āĻā§ āĻāϞāĻžāĻĻāĻž āĻāϰ⧠āϰāĻžāĻāϤ⧠āĻšāϝāĻŧ (āϝā§āĻŽāύ nightly āĻŦāĻž extended suite), āĻāϰ core fast test-āĻā§āϞā§āĻā§ āϏāĻŦāϏāĻŽāϝāĻŧ āĻĻā§āϰā§āϤ āϰāĻžāĻāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤ Fast feedback āĻŽāĻžāύā§āĻ productive development, āĻāϰ āϏā§āĻāĻž āĻļā§āϰ⧠āĻšāϝāĻŧ āĻĻā§āϰā§āϤ āĻāϞāĻž test suite āĻĻāĻŋāϝāĻŧā§āĨ¤
Glossary
Big Bang QA:
āĻŽāĻžāϏā§āϰ āĻĒāϰ āĻŽāĻžāϏ āϧāϰ⧠āϏāĻŦāĻžāĻ āĻā§āĻĄ āϞāĻŋāĻāϞ, āĻā§āύ āĻāĻŋāĻā§āĻ properly test āĻšāϞ⧠āύāĻž, āϤāĻžāϰāĻĒāϰ release-āĻāϰ āĻāĻā§ āĻšāĻ āĻžā§ āĻāϰ⧠āϏāĻŦāĻāĻŋāĻā§ QA āĻāĻŋāĻŽā§āϰ āĻāĻžāĻā§ āĻā§āĻĄāĻŧā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϞ⧠“āĻāĻ āύāĻžāĻ, āĻāĻāύ āϏāĻŦ āĻāĻāϏāĻžāĻĨā§ test āĻāϰā§!“
āĻāĻ āĻāĻāϏāĻžāĻĨā§, āĻāĻāĻŦāĻžāϰā§, āϏāĻŦāĻāĻŋāĻā§ test āĻāϰāĻžāϰ culture-āĻā§āĻ āĻ
āύā§āĻā§ āĻŽāĻāĻž āĻāϰ⧠“Big Bang QA” āĻŦāϞā§āĨ¤
TDD āĻāϰāĻžāϰ āĻāĻžāϰāĻŖā§ āϝā§āĻāĻž āĻšāϝāĻŧ, āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āĻāĻāĻĻāĻŽ āĻļā§āώ⧠āĻāϏ⧠āĻāĻ “Big Bang” testing phase-āĻāĻž āĻā§āĻŦ āĻŦā§āĻļāĻŋ āύāĻžāĻāĻā§āϝāĻŧ āĻāϰ āĻāϝāĻŧāĻāĻāϰ āĻĨāĻžāĻā§ āύāĻžāĨ¤ āĻāĻžāϰāĻŖ āĻā§āĻ āĻā§āĻ āϧāĻžāĻĒā§ āĻāĻā§āĻ āĻ āύā§āĻ bug āϧāϰāĻž āĻĒāĻĄāĻŧā§ āĻāϰ āĻĢāĻŋāĻā§āϏ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ āϤāĻžāĻ āϞāĻžāϏā§āĻā§āϰ āĻŦāĻĄāĻŧ QA round āĻāĻž āϤā§āϞāύāĻžāĻŽā§āϞāĻāĻāĻžāĻŦā§ smooth āĻāϰ āĻāĻŽ surprise āĻāϝāĻŧāĻžāϞāĻž āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
ArrangeâActâAssert (AAA):
ArrangeâActâAssert āĻšāϞ⧠unit test āϞā§āĻāĻžāϰ āĻāĻāĻāĻž āĻāύāĻĒā§āϰāĻŋāϝāĻŧ structure, āϝā§āĻāĻžāύ⧠test-āĻāϰ āĻāĻžāĻāĻā§ āϤāĻŋāύāĻāĻž āϧāĻžāĻĒā§ āĻāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ Arrange āϧāĻžāĻĒā§ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ data, object āĻāϰ state āϤā§āϰāĻŋ āĻŦāĻž setup āĻāϰāĻž āĻšāϝāĻŧāĨ¤ Act āϧāĻžāĻĒā§ āĻāϏāϞ action āĻāĻž āĻāĻžāϞāĻžāύ⧠āĻšāϝāĻŧ, āĻŽāĻžāύ⧠āϝ⧠method āĻŦāĻž function test āĻāϰāĻŦ āϏā§āĻāĻž execute āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϰ Assert āϧāĻžāĻĒā§ check āĻāϰāĻž āĻšāϝāĻŧ result āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋ āύāĻž āĻ
āϰā§āĻĨāĻžā§ expected āĻāϰ actual outcome āĻŽāĻŋāϞāĻŋāϝāĻŧā§ āĻĻā§āĻāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ pattern follow āĻāϰāϞ⧠test āĻ
āύā§āĻ readable, predictable āĻāϰ self-explanatory āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
Test Brittle:
Test brittle āĻŦāϞāϤ⧠āĻāĻŽāύ test case-āĻā§ āĻŦā§āĻāĻžāϝāĻŧ, āϝā§āĻāĻž āĻ
āϞā§āĻĒ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āĻ āϏāĻšāĻā§ āĻā§āĻā§ āϝāĻžāϝāĻŧ āĻāĻŽāύāĻāĻŋ āϝāĻāύ āĻāϏāϞ software behavior āĻ āĻŋāĻāĻ āĻĨāĻžāĻā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ āϧāϰāύā§āϰ Test implementation detail-āĻāϰ āϏāĻā§āĻā§ tightly coupled āĻĨāĻžāĻā§, āϤāĻžāĻ āĻā§āĻ refactor, UI āĻĒāϰāĻŋāĻŦāϰā§āϤāύ, āĻŦāĻž environment-āĻāϰ āϏāĻžāĻŽāĻžāύā§āϝ āĻāĻŋāύā§āύāϤāĻžāϰ āĻāĻžāϰāĻŖā§āĻ fail āĻāϰāϤ⧠āĻļā§āϰ⧠āĻāϰā§āĨ¤ āĻĢāϞ⧠developer-āĻĻā§āϰ āϏā§āĻ test-āĻā§āϞā§āϰ āĻāĻĒāϰ āĻāϰāϏāĻž āĻāĻŽā§ āϝāĻžāϝāĻŧ, āĻāϰ āĻāĻā§āϞ⧠maintain āĻāϰāĻžāĻ āĻŦāĻŋāϰāĻā§āϤāĻŋāĻāϰ āĻšāϝāĻŧā§ āĻāĻ ā§āĨ¤
Flaky Test (āĻĢā§āϞā§āĻāĻŋ āĻā§āϏā§āĻ)
Flaky test āĻšāϞ⧠āĻāĻŽāύ āĻā§āϏā§āĻ, āϝā§āĻāĻž āĻāĻāύ⧠āĻĒāĻžāϏ āĻāϰ⧠āĻāĻŦāĻžāϰ āĻāĻāĻ āĻā§āĻĄ, āĻāĻāĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ⧠āĻšāĻ āĻžā§ āĻāϰ⧠āĻĢā§āĻāϞ āĻāϰ⧠āĻāϰ āĻāĻ āĻāĻ āĻž-āύāĻžāĻŽāĻžāϰ āĻĒā§āĻāύ⧠āĻāϏāϞ āĻā§āĻĄā§āϰ bug āĻĨāĻžāĻā§ āύāĻžāĨ¤ āĻāĻžāĻāĻŽāĻŋāĻ āĻāϏā§āϝā§, external dependency, random data, network delay, environment change āĻāϏāĻŦā§āϰ āĻāĻžāϰāĻŖā§ āĻāĻ āĻā§āϏā§āĻāĻā§āϞ⧠āĻ
āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ āĻšāϝāĻŧāĨ¤ āĻĢāϞ⧠āĻĄā§āĻā§āϞāĻĒāĻžāϰāϰāĻž āĻŦā§āĻā§ āĻāĻ āϤ⧠āĻĒāĻžāϰ⧠āύāĻž āĻāϏāϞā§āĻ problem āĻāĻā§, āύāĻžāĻāĻŋ āĻā§āϏā§āĻāĻāĻžāĻ āĻā§āĻāĻžāϞāĨ¤ āĻāϰ āĻ āĻāĻžāϰāĻŖā§ flaky test CI/CD pipeline āĻāϰ āĻāĻŋāĻŽā§āϰ confidence āĻĻā§āĻā§āĻ āύāώā§āĻ āĻāϰā§āĨ¤
Cascading False Negatives
Cascading false negatives āĻŽāĻžāύ⧠āĻšāϞā§, āĻāĻāĻāĻž āĻāϏāϞ āϏāĻŽāϏā§āϝāĻž āĻŦāĻž bug āĻĨā§āĻā§ āĻāĻāϏāĻžāĻĨā§ āĻ
āύā§āĻāĻā§āϞ⧠āĻā§āϏā§āĻ āĻĢā§āĻāϞ āĻāϰāĻž, āϝā§āύ āĻŽāύ⧠āĻšāϝāĻŧ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāĻžāĻĻāĻž āĻāĻžāĻĻāĻž āĻāϏā§āϝ⧠āĻāĻā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ Interdependent āĻŦāĻž āĻāĻā§-āĻ
āĻĒāϰā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰāĻļā§āϞ āĻā§āϏā§āĻāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āĻāĻāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻāĻž āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ problem āĻšāϞ⧠āĻĒāϰā§āϰ āĻā§āϏā§āĻāĻā§āϞā§āĻ chain āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύā§āϰ āĻŽāϤ⧠āĻĢā§āĻāϞ āĻāϰāϤ⧠āĻĨāĻžāĻā§āĨ¤ āĻāϤ⧠āĻāϏāϞ root cause āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻž āĻāĻ āĻŋāύ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ, āĻāĻžāϰāĻŖ āĻāĻāĻ āĻāϏā§āϝā§āϰ āĻāύā§āϝ āĻ
āύā§āĻāĻā§āϞ⧠āĻā§āϏā§āĻ āĻŽāĻŋāĻĨā§āϝāĻž negative signal āĻĻā§āĻāĻžāĻā§āĻā§āĨ¤
Tag:DevOps