unit test trong laravel (phần 8): Kiểm thử với database

Để test với database thì chúng ta có rất nhiều cách làm, có thể sử dụng các kỹ thuật mock để tạo dữ liệu giả trong file xml, json, yaml hoặc là từ mảng. Tuy nhiên cách làm này tương đối phức tạp và khá là loằng ngoằng, rất tốn thời gian chuẩn bị dữ liệu. Chúng ta có một cách khác đơn giản & hiệu quả hơn nhiều đó là sử dụng trực tiếp database để test. Có 2 cách mà mình đề cập tới ở đây

Cách 1 : Tạo riêng một database cho việc test, ví dụ web của bạn dùng mysql thì sẽ có riêng 1 database mysql

Cách 2: Sử dụng database sqlite để test, ưu điểm gọn lẹ và database được tạo và hủy hoàn toàn trên ram

Trong bài viết này mình sẽ hướng dẫn các bạn thực hiện cả 2 cách

Cách 1 : Tạo riêng một database cho việc test

Đầu tiên bạn mở file config/database.php ra, chúng ta sẽ thấy đoạn cấu hình kết nối tới database như sau

Đây là kết nối dành cho việc chạy thật, giờ muốn chạy test thì chúng ta sẽ tạo thêm 1 kết nối nữa là mysql_test. Toàn bộ đoạn cấu hình mới của chúng ta sẽ như sau

Bây giờ hãy đảm bảo rằng file .env của bạn có những dòng cấu hình như dưới đây, chưa có thì copy vào nhé và đổi thông tin cho phù hợp

OK, từ đầu tới giờ là bạn đã xong các thiết lập cơ bản. Vấn đề mấu chốt ở đây là khi chạy thật thì chương trình sẽ lấy thông tin kết nối mysql, còn khi test thì sẽ chuyển sang sang mysql_test để làm. Bây giờ chúng ta sửa đổi lại file test/TestCase.php một chút như sau

Nhìn vào hàm createApplication, trong hàm này chúng ta sẽ làm 1 việc đó là thay đổi lại cấu hình kết nối tới database thành mysql_test. Ngoài ta còn sử dụng kỹ thuật fixture để khởi tạo và xóa dữ liệu cho việc test. Bây giờ bạn có thể viết các đoạn code test thao tác tới database như thế này

Chú ý : Ở trên chúng ta dùng migration để tạo cấu trúc bảng đồng thời cũng xóa sau khi chạy test xong. Nếu như ứng dụng của bạn sử dụng migration ngay từ đầu thì mới làm như trên, còn nếu không thì bạn phải đảm bảo database test của bạn có đủ tất cả các bảng và bạn buộc phải xóa dữ liệu bằng các câu lệnh truncate trước khi chạy test.

Cách 2 : Sử dụng database sqlite

Tương tự như trên bạn mở file config/database.php, trong đó có đoạn cấu hình tới sqlite như sau

Bạn sẽ thấy nó trỏ tới 1 file sqlite, và nếu dùng như này thì mình nghĩ cách 1 là lựa chọn tốt hơn rất nhiều. Tuy nhiên ưu điểm khi sử dụng sqlite là bạn có thể cấu hình để toàn bộ database test được lưu trên ram, tức là ko cần tới bất kỳ một database nào cả. Nếu bạn có mang source sang máy khác để chạy test thì cũng không cần bận tâm tới cấu hình gì nữa cả. Rất hay phải không, chúng ta chỉ cần điều chỉnh lại config như bên dưới đây là được.

Cách sử dụng thì tương tự như cách 1 nhưng có một chú ý là nếu bạn sử dụng sqlite trên ram thì bạn buộc phải tạo bảng bằng migration nhé.