Tìm hiểu chung về Symfony Phpunit test (tiếp)

simpletest-logo.png


  • Như đã giới thiệu ở phần trước (https://viblo.asia/posts/XogBG2ZyGxnL/edit) phần testing trong phát triền 1 project là rất quan trọng . Ở phần trước tôi đã giới thiệu cho các bạn một số khái niệm test cơ bản với sfPhpunitPlugin. Plug in này giúp việc xử lý các dữ liệu test và function test của PHPUnit một cách dễ dàng hơn, nhưng nhìn chung cũng không khác nhiều lắm với việc ta chỉ sử dụng thuần PHPUnit để thực hiện việc test. Hay nói một cách đơn giản thì sau khi đọc bài này bạn cũng có thể làm tưởng tự với PHPUnit test ở các framework khác.

1. Testing sử dụng fixtures

** a) Đặt vấn đề **

  • Một điều rất quan trong trong việc thực thi test đó chính là sử dụng các dữ liệu cố định (fixture file). Việc này có thể chiếm đến một nửa thời gian trong toàn bộ công việc viết test để tạo một môi trường test phù hợp .Việc sử dụng fixture data giúp cho công việc test có thể tích kiệm nhiều thời gian . Ví dụ như chúng ta muốn xây dựng file test có thể chạy trên nhiều hệ điều hành, nhiều môi trường web khác nhau mà khi đó CSDL ở nhưng môi trường này có thể khác nhau . Nếu không xây dựng 1 CSDL test cố định thì rất khó để các test case có thể hoạt động được trên tất cả các môi trường này .

There are four places where you can save your fixtures. You can use all of them or just one.

  • Việc này cũng giúp cho các test được đơn giản và dễ hiểu hơn. Có bốn nơi mà ta có thể đạt các file fixture được . Bạn có thể sử dụng cả 4 nơi này hay đởn giản là chỉ dùng 1

    Own – Fixtures ở trong thư mục này chỉ có thể được sử dụng bởi test hiện tại.

    Package – Fixtures ở trong thử mục này chỉ có thể được sử dụng bởi các file test nằm cùng thư mục.

    Common – Fixtures có thể được sử dụng bởi bất kì file test nào.

    Symfony – Fixture ở trong thư mục này, được lưu trữ trong thư mục symfony chuẩn(data/fixtures) và có thể được sử dụng ở mọi nơi.

Screenshot from 2015-06-26 17:28:50.png

  • Có 2 dạng file fixture đó chính là DoctrinePropel. Ở trong hướng dẫn này chúng ta sẽ sử dụng dạng Doctrine.

Như ta có thể thấy rằng việc khai báo là rất đơn giản . Việc sử dụng thì bạn chỉ cần khai báo trong file test là được .

** b) ví dụ: **

Bây giờ chúng ta hãy xây dựng 1 ví dụ đơn giản cho việc sử dụng fixture data cho xây dựng file test .

Bài toán ở đây chẳng hạn bạn có một form đăng kí tài khoản trong đó có trường email. Và bạn phải chắc rằng người dùng phải nhập email chưa được đăng kí . Vì vậy bạn đã tạo 1 validator cho trường email của form này. Bây giờ bạn muốn tạo file test nhằm test xem validator này chạy có chính xác không .

Step 1: Tạo dữ liệu test (fixture data).

  • Như đã nói ở trên dữ liệu test có thể là file doctrine hay propel . Ở đây tôi sẽ tạo ví dụ một file fixture trong đó có bảng user và user_email
  • file có tên là user.doctrine.yml (ở đây doctrine là kiểu file fixture còn yml là file của symfony có thể hiểu). Và đặt trong thư mục common để bất kì test case nào có thể sử dụng được . Nội dung file có thể như sau:

Screenshot from 2015-06-26 17:44:21.png

Trong phần đầu file là tên bảng user_email tiếp theo là các bản ghi giải định trong bảng.

Bạn có thể thấy cuối mỗi bảng có 1 trường User đó chính là trường tượng trưng cho khóa ngoài của bảng này . Có bao nhiêu khóa ngoài thì có tương ứng từng đó trường tương ứng.

Ví dụ bản ghi có tên UserEmail_418 có User: User_410 có thể hiểu nghĩa là nó có khóa ngoài là bản ghi User_410. Bản ghi này cần được khai báo trong cùng file fixture.

Screenshot from 2015-06-26 17:49:42.png

Step 2 : Tạo file test sử dụng fixture vừa tạo

Giả sử validator ta xây dựng để check email user nhập vào đã tồn tại hay chưa có dạng :

Screenshot from 2015-06-26 18:04:52.png

Validator này trả về giá trị true nếu email nhập vào chưa được sử dụng và throw lỗi về ngược lại.

Bây giờ ta sẽ xây dựng 1 file test để test thử validator này .

Screenshot from 2015-06-26 18:08:25.png

Screenshot from 2015-06-26 18:09:16.png

Trên đây là dữ liệu test và function test. Ta có thể thấy

Screenshot from 2015-06-26 18:11:22.png

  • function này là function của Symfony Plugin cho phép ta khai báo file dữ liệu nào sẽ được sử dụng : Ở đây là file user.doctrine.yml ở trong thư mục common.
  • Khi chạy file test thì PHPUnit sẽ chuyển hóa và tạo một CSDL tạm thời từ file fixture của chúng ta . Chạy như khi trên một môi trường thật nào đó. Kết quả :

Screenshot from 2015-06-26 18:13:52.png

** 2. Một số chú ý **

  • Khi khai báo file fixture ở dạng doctrine thì phải test bắt buộc phải implements sfPhpunitFixtureDoctrineAggregator ngược lại nếu bạn khai báo file fixture ở dạng propel thì phải implements sfPhpunitFixturePropelAggregator như vậy thì Symfony Plugin test mới có thể đọc được file fixture của bạn.

  • Bạn có thể khai báo file fixture trực tiếp trong từng function test : Screenshot from 2015-06-26 18:22:00.png

Tài liệu tham khảo : https://github.com/makasim/sfPhpunitPlugin/wiki/Fixtures https://phpunit.de/manual/current/en/database.html