Rất nhiều developer:
- Không viết test
- Hoặc viết test cho có
Nhưng trong production:
Không có test = hệ thống không an toàn
#Testing là gì?
Là quá trình kiểm tra code hoạt động đúng như mong đợi
Mục tiêu:
- Tránh bug
- Đảm bảo chất lượng
- Refactor an toàn
#Các loại test trong Laravel
#Unit Test
Test một class/function riêng lẻ
public function test_add()
{
$this->assertEquals(2, 1 + 1);
}
Nhanh, không phụ thuộc DB
#Feature Test
Test flow của hệ thống
$response = $this->get('/login');
$response->assertStatus(200);
Test gần với thực tế
#Integration Test
Test nhiều component cùng nhau
Ví dụ: controller + service + DB
#Database Testing
Laravel hỗ trợ:
use RefreshDatabase;
Reset DB mỗi test
#Mock & Fake
#Mock
$this->mock(UserService::class, function ($mock) {
$mock->shouldReceive('create')->once();
});
Giả lập dependency
#Fake
Mail::fake();
Queue::fake();
Không thực thi thật
#HTTP Testing
$this->post('/login', [
'email' => 'test@example.com'
]);
Test API / form
#Real Case Production
Case: Register User
- Validate input
- Create user
- Send email
Test full flow bằng feature test
Case: Service logic
Test bằng unit test
#Test Strategy
- Unit test cho logic
- Feature test cho flow
- Không cần test mọi thứ
Focus vào:
- Business logic
- Critical path
#Anti-pattern
-
Không viết test: Rất nguy hiểm
-
Test quá nhiều UI: Chậm, không cần thiết
-
Test phụ thuộc môi trường: Không ổn định
#Performance Tips
- Dùng SQLite in-memory
- Tách test nhanh/chậm
#Mindset
Junior:
Test để pass CI
Senior:
Test để bảo vệ hệ thống và refactor an toàn
#Câu hỏi thường gặp (Interview)
1. Unit test là gì?
Test một đơn vị code nhỏ, không phụ thuộc bên ngoài
2. Feature test là gì?
Test flow của hệ thống từ request đến response
3. Khi nào dùng mock?
Khi cần giả lập dependency
4. Fake trong Laravel là gì?
Là cách giả lập service như Mail, Queue mà không chạy thật
5. Có cần test 100% coverage không?
Không, chỉ cần test phần quan trọng
#Kết luận
Testing không phải optional.
Nó là bắt buộc nếu bạn muốn build hệ thống lớn.
Test tốt giúp:
- Tự tin deploy
- Giảm bug
- Dễ refactor