F.I.R.S.T
- Fast
- Independent
- Repeatable
- Self-Validatable
- In-Time, written before production code
Types of Tests
- Unit Tests – verify the behavior of a unit under tests in isolation
- Integration Tests – verify the behavior of either a part of the system or a whole system. These tests are often brittle.
- Acceptance Tests – verify the software from the user’s point of view.
Frameworks & Tools
- SpecFlow – BDD
- xUnit – unit testing
- Moq – Mocking
- NCrunch
- Resharper
Notes
- Triangulation
- We generalize the implementation when we have two or more test cases. We add test cases until the right way of implementation starts to emerge.
- Faking
- Faking means returning constants and gradually replacing the value with variables and evolving the solution.
- Obvious Implementation
- Sometimes the implementation appears obvious, but as you start to poke at it with tests, it begin to crumble.
- Grabbing the gold
- You start from writing unit tests which cover the core functionality right away, and it fails with edge cases.
- Suggestion: Write as many tests as possible before approaching the core functionality. Check for max values, empty strings, null values, min values… etc.
- Uncle Bob’s Suggestions: Write tests exactly in the following order: exceptional, degenerate, and ancillary
- Degenerative cases are those which cause the core functionality to do "nothing"
- Ancillary behaviors are those which support the core functionality