← Tech & Engineering
Tech & Engineering/8 min read
Unit Testing Best Practices: Writing Tests That Actually Matter
Writing good tests is an art form. Here's what I've learned after years of testing production code.
The AAA Pattern
The Arrange-Act-Assert pattern is your foundation:
1describe(class="text-category-music">'calculateTotal', () => {2 it(class="text-category-music">'should apply discount correctly', () => {3 // Arrange4 class="text-category-tech font-medium">const items = [{ price: 100 }, { price: 50 }]5 class="text-category-tech font-medium">const discount = 0.167 // Act8 class="text-category-tech font-medium">const result = calculateTotal(items, discount)910 // Assert11 expect(result).toBe(135)12 })13})Test Behavior, Not Implementation
Don't test how something works, test what it does:
1// Bad: Testing implementation2it(class="text-category-music">'should call sort class="text-category-tech font-medium">function', () => {3 class="text-category-tech font-medium">const spy = jest.spyOn(array, class="text-category-music">'sort')4 sortUsers(users)5 expect(spy).toHaveBeenCalled()6})78// Good: Testing behavior9it(class="text-category-music">'should class="text-category-tech font-medium">return users sorted by name', () => {10 class="text-category-tech font-medium">const result = sortUsers([{ name: class="text-category-music">'Zoe' }, { name: class="text-category-music">'Alice' }])11 expect(result[0].name).toBe(class="text-category-music">'Alice')12})Keep Tests Independent
Each test should be able to run in isolation. Avoid shared state that can cause flaky tests.