Test code coverage cho dự án Laravel

Test code coverage cho dự án Laravel
Coverage Reports

Chào các bạn, sau đây mình xin giới thiệu cho các bạn về Test code coverage cho dự án Laravel.

Khi thực hiện một dự án có khi nào bạn hỏi: “Cần test bao nhiêu code là đủ?”. Và câu trả lời là: “Khi nào cover được 100% code là đủ” chắc hẳn đến đoạn này các bạn cũng có thể sẽ chưa hiểu về code coverage như mình :D.Vậy thì test code coverage là gì và làm sao để xác định được cover được bao nhiêu % code. Hãy tìm hiểu cùng mình nhé:

Test code coverage là gì?

Test code coverage là việc tạo ra các testcase để thỏa mãn code coverage (ví dụ như người viết test có thể tạo ra các test case sao cho tất cả các câu lệnh của chương trình được thực thi ít nhất 1 lần khi đó thì chương trình có code coverage là 100%)

Code coverage là độ phủ các dòng code (số dòng code được chạy qua các test case mà chúng ta đã viết)

Test code coverage được tính trên những thành phần nào?

Code coverage là độ bao phủ trung bình mà mà test đã chạy qua:

lines(dòng code)

Functions & methods (các hàm và phương thức)

Classes & traits

Tại sao phải thực hiện test code coverage cho dự án?

  • Đảm bảo code được viết ra là code sạch, được viết theo một logic đúng và hợp lý.
  • Đảm bảo ít bugs nhất xảy ra với những gì chúng ta code ra.
  • Đảm bảo chúng ta đang code đúng specs, yêu cầu mà khách hàng đưa ra.
  • Sản phẩm đưa đến tester, QA là một sản phẩm hoàn thiện ít bugs đẩy nhanh quá trình release dự án.

Một số lưu ý khi viết test

  • Chỉ nên test và cover những phần code có ý nghĩa, trong Laravel thì chúng ta không cần viết test cho các phần base của Laravel ví dụ như: Provider, Middleware, hay 1 số command (Console)...
  • Nên chủ động tách code cho hợp lý, chẳng hạn như: trong Controller không nên sử lý logic, ta nên chuyển phần code thao tác đến database vào Repositories, code logic tính toán, xử lý điều kiện vào services, factory, ... Và khi đó chúng ta sẽ test api (feature tests), repositories thao tác đến database (Integration Tests), những phần xử lý logic services, ...(Unit Tests).
  • Nên viết test trước khi viết code.
  • Tránh việc cố tình pass tests để kiếm code coverage.

=> Mình gợi ý một giải pháp đó chính là viết TDD cho các chức năng mình sẽ tạo ra

Tìm hiểu về Code Coverage Report

Định nghĩa: Coverage Report là một công cụ có chức năng generate các file HTML tĩnh giúp bạn có thể xem thống kê về việc testing code của bạn một cách dễ dàng, bao gồm các thống kê bao nhiêu % code được test và độ phức tạp của code. Nó thậm chí còn cho bạn biết liệu unit test của bạn có bỏ qua trường hợp nào không.

Cách tạo coverage report

Ở đây chúng ta sẽ sử dụng Laravel, PHPUnitXDebug. PHP để viết các test case và XDebug để tạo Coverage Report. Mình sẽ không nói kỹ  về việc cài đặt Laravel, PHPUnit và XDebug ở đây.

Bây giờ giả sử chúng ta có một controller tên là LoginController như sau:


Sau đó, chúng ta phải viết một số test case trong file test\Features\LoginTest.(file test được tạo mới) (Mình sẽ mặc định là mọi người cũng có hiểu biết về Unit Test). Mình đã viết một testcase đơn giản như sau:

Sau khi code đã sẵn sàng để tạo code coverage report bạn chỉ cần chạy lệnh vendor/bin/phpunit --coverage-html reports/

(reports là thư mục để mình lưu các reports, và các bạn có thể tùy chỉnh tên thư mục lưu các reports theo ý các bạn miễn là phải đặt tên đó sau vendor/bin/phpunit --coverage-html)

Bây giờ hãy kiểm tra dự án của bạn mới thư mục reports bạn vừa mới tạo. Mở tệp dashboard.html và index.html trên trình duyệt của bạn. Một báo cáo đã sẵn sàng cho bạn.

Và chi tiết về test coverage của LoginController.

Not Executed Màu đỏ: biểu thị code chưa được thực thi

Executed Màu xanh: biểu thị code đã được thực thi khi chạy test

Dead Code Màu vàng: là những đoạn code thừa, có thể được thực thi nhưng không gây ảnh hưởng gì đến kết quả của hàm/method

Nếu bạn hover chuột vào từng dòng code một popup sẽ hiện ra thông tin unit test nào đã cover dòng đó.

=> Từ đó bạn có thể điều chỉnh test case, điều chỉnh code hợp lý để đạt kì vọng tất cả các dòng code đều có màu xanh khi đó đạt code coverage là 100%!!!

CRAP

Nếu bạn nhìn vào bản report bên trên bạn thấy một cột là CRAP viết tắt của Change Risk Analysis and Predictions hay Change Risk Anti-Patterns. Có thể hiểu nó là độ khó để bạn có thể đọc hiểu được một đoạn code. Chỉ số CRAP càng cao thì nó càng khó để hiểu. Giá trị nhỏ nhất của CRAP là 1 (là code mà đơn giản để hiểu nhất).

THAM KHẢO:

Một số tips khi viết test code coverage cho dự án laravel được hiệu quả
I. Đặt vấn đề 1. Test code coverage là gì ?
Code Coverage Report in Laravel and make 100% coverage of your code
Have you heard about the Code Coverage Report? This is good if you already know that, but don’t worry if you don’t know anything. I’ll…