Unit Testing Strategies
FREEintermediatev1.0.0tokenshrink-v2
# Unit Testing Strategies ## 1. The AAA Pattern Every unit test should follow the **AAA** structure to maintain readability and separation of concerns. - **Arrange**: Initialize the SUT, mock dependencies (DOCs), and configure state. - **Act**: Execute the specific method or function under test. - **Assert**: Verify the actual outcome against expected behavior. ## 2. Test Doubles and Mocking Effective isolation is critical for unit testing. Use the following strategies: - **Stubs**: Provide canned answers to calls made during the test. - **Mocks**: Verify interactions (e.g., ensuring a repository method was called exactly once). - **Fakes**: Simplified implementations (e.g., an in-memory database). ## 3. Boundary Value Analysis Tests should focus on edge cases rather than just the happy path: - **Equivalence Partitioning**: Group inputs into valid and invalid sets. - **Boundary Analysis**: Test values at the edges of ranges (e.g., -1, 0, 1 for a non-negative constraint). ## 4. Test-Driven Development (TDD) Lifecycle - **Red**: Write a failing test for a new requirement. - **Green**: Write the minimum amount of code to pass the test. - **Refactor**: Clean up the code while ensuring tests remain green. ## 5. Best Practices - **Isolation**: Tests should not rely on external networks or databases. - **Speed**: Unit tests must execute in milliseconds. - **Determinism**: Tests must yield the same result every time. - **Naming Conventions**: Use descriptive names like `Should_ThrowException_When_InputIsNull`.