11/08/2018, 23:39

Tìm hiểu chung về Symfony Phpunit test

1. Đặt vấn đề , tại sao ta phải test code ? Khi phát triển 1 dự án nào đó thì việc phát sinh lỗi khi phát triển các module là điều không thế tránh khỏi . Việc phát sinh lỗi có thể gây ra tổn thất to lớn (Ví dụ như những module thanh toán tiền) . Nếu không được phát hiện kịp thời có ...


Screenshot-2013-12-27-08.36.11-1024x550.png


1. Đặt vấn đề , tại sao ta phải test code ?

  • Khi phát triển 1 dự án nào đó thì việc phát sinh lỗi khi phát triển các module là điều không thế tránh khỏi . Việc phát sinh lỗi có thể gây ra tổn thất to lớn (Ví dụ như những module thanh toán tiền) .
  • Nếu không được phát hiện kịp thời có thể làm cho tiến độ dự án bị trậm trễ .
  • Ảnh hưởng đến chất lượng sản phẩm và cũng gây ảnh hưởng đến sự hài lòng của khách hàng .

2. Mục tiêu khi test code là gì ?

  • Tìm ra các lỗi và các lỗi tiềm ẩn
  • Đảm bảo các thành phần làm việc ăn khớp với nhau và giống với tài liệu yêu cầu
  • Ngăn cản lỗi trước khi nó ảnh hưởng đến sản phẩm , sự trải nghiệm sản phẩm của khách hàng .

3.Unit Test là gì ?

  • Unit Test có ý nghĩa là bạn kiểm tra một đơn vị code hoạt động có ổn như bạn mong muốn không chứ không phải kiểm tra một thành phần. Để cho rõ hơn ta sẽ lấy ví dụ về đơn vị và thành phần để bạn có thể hiểu được phạm vi của hai thuật ngữ này. Đơn vị bạn có thể hiểu là các class và thành phần bạn có thể hiểu là tập hợp các class để thực hiện một chức năng nào đó . Và do vậy, khi thực hiện Unit Test, tuyệt đối không được thực hiện test quá một đơn vị trong mỗi test, tất cả các thành phần sử dụng đơn vị đó lẫn các thành phần được đơn vị đó sử dụng đều phải được cô lập (làm thế nào để giả định các đơn vị khác đã hoạt động chính xác và sẽ không có chuyện đơn vị này lỗi do đơn vị phụ thuộc kia bị lỗi).

**4. Unit Test với project PHP ? **

  • Có rất nhiều cách để thực hiện việc Unit Test , cũng có rất nhiều framework để thực hiện việc này trên php.
  • Theo recommend thì Symfony khuyến khích lập trình viên sử dụng Phpunit.
  • Bạn cũng có thể sử dụng plug in Phpunit của symfony . Đây là 1 plug in được phát triển nhằm cho việc sử dụng phpunit trên symfony được dễ dàng hơn .

**5. sfPhpunitPlugin **

  • Ý tưởng chính của plugin là để tích hợp phpunit và symfony lại gần hơn. Làm cho quá trình kiểm code chuẩn hơn, linh hoạt và dễ dàng cho các nhà phát triển symfony. Một ý tưởng khác là để cho phép các nhà phát triển sử dụng các tính năng mà chỉ họ muốn và không gây bất kỳ yêu cầu thêm nào .

Viêc cài đặt bạn có thể xem thêm ở https://github.com/makasim/sfPhpunitPlugin/wiki

Trong bài nay ta sẽ tập trung vào việc viết test unit như thế nào .

**6. Tạo test đơn giản **

  • Trên thực tế bạn có thể đặt file test ở bất kì thư mục nào . Nhưng để dễ quản lý bạn nên đặt các file test ở trên cùng 1 folder .

Ví dụ :

Screenshot from 2015-03-25 13:40:16.png

Như trên hình . Chúng ta đặt các file test vào trong thư mục phpunit .

Bây giờ chúng ta tạo 1 file test . Class của file test phải được đc extends từ PHPUnit_Framework_TestCase của phpunit để có thể chạy được .

Trong function test này ta sẽ extends từ class sfBasePhpunitTestCase của plugin Symfony . sfBasePhpunitTestCase cung cấp cho chúng ta 1 số tiện lợi hơn trong việc load dữ liệu giả(fixture) cho việc test (sẽ được đề cập sau) và tất nhiên để chạy được thì class này phải được extends từ PHPUnit_Framework_TestCase

Screenshot from 2015-03-25 13:55:34.png

  • Đối với việc dùng phpunit ngoài việc class test phải thừa kế PHPUnit_Framework_TestCase thì còn 1 điều phải chú ý nữa đó là các hàm test bắt buộc phải có chứ test khi bắt đầu tên hàm
  • Như bạn có thể thấy function này so sánh số lượng phần tử của $$rray với 1 số cho trước .
  • Function assertEquals trả về true nếu 2 giá trị nhập vào giống nhau và ngược lại . Bạn có thể tham khảo thêm tại : https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals
  • Nếu tất cả phù hợp thì hàm test sẽ không báo lỗi Screenshot from 2015-03-25 14:23:34.png

Ở đây chúng ta chỉ có 1 test và 1 hàm so sánh nên có thể thấy thông báo OK (1 test, 1 assertion)

  • Bạn có thể sử dụng nhiều hàm so sánh khác để kiểm trả dữ liệu trả về của cá hàm Có thể tham khảo ở : https://phpunit.de/manual/4.5/en/index.html

**7. Test function class **

Giả sử đây là class ta muốn test

Screenshot from 2015-03-25 15:16:29.png

Trong class StackTest ta thêm 1 function để test function của class ExampleFunction như hình dưới

Screenshot from 2015-03-25 15:17:08.png

  • Tương tự nếu muốn test function non static , Chúng ta cũng sẽ test tương tự : Thêm function add (non static)

Screenshot from 2015-03-25 15:30:51.png

Rồi thêm hàm test cho hàm add

Screenshot from 2015-03-25 15:31:49.png

Kết quả khi chạy

Screenshot from 2015-03-25 15:32:26.png


**8. Test với dữ liệu đầu vào cho trước **

  • Trong 1 file test thì ngoài những function test ta còn có thể tạo nhiều function với các chức năng phụ trợ cho function test . Như function dùng để cung cấp dữ liệu cho function test .

Ta gọi chúng là hàm dataProvider. Chúng giúp cho việc test trở nên dễ dàng hơn khi chúng ta muốn test 1 function nào đó với nhiều trường hợp input đầu vào .

  • Để sử dụng chúng ta phải khai báo trong phần comment của function test với từ khóa @dataProvider
  • Bạn có thể tham khảo thêm về hàm provider và ví dụ khi sử dụng chúng ở đây : https://phpunit.de/manual/4.5/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers

Screenshot from 2015-03-25 16:00:17.png

Như chúng ta thấy hàm testRegularModuloWithProvider có dataProvider là hàm dataRegularModulo . Hàm dataRegularModulo sẽ trả về dữ liệu là kiểu mảng , mỗi phần tử trong mảng tương ứng sẽ là input data trong mỗi lần chạy của function test

Kết quả ta thấy

Screenshot from 2015-03-25 16:07:49.png

Hàm provider đã giúp chúng ta không phải viết đi viết lại hàm test nhiều lần .

0