Tìm hiểu về unit test phần 2: Tổ chức thư mục bằng testsuite

1 - Giới thiệu về unit test

2 - Tìm hiểu về unit test phần 2: Tổ chức thư mục bằng testsuite

Tổng quan

  • Đây là bài thứ 2 trong loạt bài tìm hiểu về unit test trong laravel. Trong bài này mình sẽ hướng dẫn cách tổ chức thư mục trong unit test

Tại sao phải tổ chức thư mục cho test case ?

  • Khi mới bắt đầu viết unit test ta thường "tiện tay" viết các class một cách tràn lan với mục đích viết nhanh nhất có thể. Tuy nhiên qua thời gian thì ứng dụng của bạn cũng tăng lên. Chính vì thế việc tổ chức thư mục sao cho dễ nhìn dễ test cũng là một phần vô cùng quan trọng.
  • Khi ứng dụng của bạn thiết kế theo kiểu module thì việc test một lúc toàn bộ các test case đôi khi là không cần thiết và tốn thời gian.
  • testsuite được ra đời nhằm mục đích giải quyết các vấn đề trên. từ đó giúp lập trình viên dễ quản lý test case của mình. Đồng thời cũng có thể tiết kiệm thời gian chạy những test case không cần thiết như khi không tổ chức test case theo thư mục

Sử dụng testsuite như thế nào ?

  • Vì laravel đã hỗ trợ sẵn unit test nên bạn có thể tìm thấy tìm thấy ngay một ví dụ đầu tiên khi mở file phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">app/</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>
  • Hãy chú ý đến nhân vật chính của chúng ta
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
  • Đây chính là nơi ta sẽ cấu hính thư mục test của mình.
  • thẻ testsuites là thẻ cha. tất cả các khai báo nhóm cây thư mục đều được đặt ở trong này.
  • thẻ testsuite là nơi khai báo cho từng group riêng biệt
  • thuộc tính name dùng để đặt tên cho nhóm
  • thẻ directory dùng để khai báo một thư mục các test case.
  • thẻ file dùng để khai báo thêm một file cho một cây thư mục test case
  • Vd:
<testsuite name="controller">
    <directory>./tests/Controller</directory>
</testsuite>
<testsuite name="money">
    <file>tests/IntlFormatterTest.php</file>
    <file>tests/MoneyTest.php</file>
    <file>tests/CurrencyTest.php</file>
</testsuite>
  • Đây là một ví dụ về việc phân nhóm riêng biệt cho test case. ở trên ta đã tạo ra thêm 2 nhóm testcase với những mục đích sử dụng khác nhau

Đặt tên testsuite như thế nào ?

  • Về lý thuyết ta có thể đặt tên testsuite như thế nào là tùy thích miễn sao thuận tiện, dễ quản lý là được. tuy nhiên ta nên đặt testsuite theo cấu trúc thư mục của thư mục test là tốt nhất. Nó sẽ đảm bảo được các test case không bị bỏ xót đồng thời cũng không bị chồng chéo các test case như việc đặt 1 class test case vào 2 testsuite khác nhau.
  • Để việc đặt tên testsuite cho hợp lý thì ta cũng nên cấu trúc các forder trong thư mục tests cho tương đồng với các testsuite.

Chạy testsuite như thế nào?

  • thông thường để chạy unit test ta chỉ cần ra command chạy lệnh phpunit là xong. tuy nhiên việc này đồng nghĩa với việc ta sẽ chạy toàn bộ các test case trong project. Tuy nhiên việc này sẽ gây tốn thời gian chạy những test case không cần thiết.
  • phpunit hỗ trợ cho việc chạy từng testsuite khác nhau như sau
//Cú pháp
phpunit --testsuite <tên testsuite>
//Ví dụ
phpunit --testsuite controller
phpunit --testsuite money

Tổng kết

  • Tuy việc viết testsuite là đơn giản nhưng nó cũng quan trọng không kém việc bạn tạo ra những test case đủ mạnh cho projecet của mình. việc tạo ra testsuite tốt sẽ giúp ta dễ dàng quản lý hơn các test case của mình đồng thời giảm thiểu được thời gian chạy những test case không cần thiết.