Trang chủ » Blog » Phát triển hướng kiểm thử TDD (Test-Driven Development) – Phần 2: Unit Testing, PHPUnit

Phát triển hướng kiểm thử TDD (Test-Driven Development) – Phần 2: Unit Testing, PHPUnit

bởi CodeGym | 06/12/2023 17:30 | Blog

Chào mừng bạn đến với phần 2 của loạt bài “PHP Test Driven Development” với chủ đề: Unit Testing. Hôm nay chúng ta sẽ đi qua cách thiết lập PHPUnit một cách chi tiết.

Chúng ta sẽ sử dụng Laravel framework để bắt đầu dễ dàng hơn. Nó cũng sẽ giúp tôi hướng dẫn cho bạn cách kiểm thử trong các ứng dụng thực tế.

Tôi sẽ giả sử bạn đã sử dụng Laravel trước đây. Điều này sẽ giúp tôi tập trung hướng dẫn phần kiểm thử và làm cho hướng dẫn dễ nắm bắt hơn. Nếu bạn chưa quen với Laravel, tôi khuyên bạn nên tìm hiểu Laravel trước khi chúng ta tiếp tục.

Bước 1: Cài đặt dự án Laravel mới

Bạn có thể chạy lệnh sau:

composer create-project --prefer-dist laravel/laravel laravel5

Nếu bạn đang dùng Linux/Mac, bạn cũng cần đặt quyền ghi vào bộ nhớ và thư mục bootstrap/cache cho người dùng máy chủ web của bạn

Bước 2: Cài đặt PHPUnit

Một trong những điều tuyệt vời về Laravel là PHPUnit đã được cài đặt theo mặc định nên chúng ta sẽ không cần cài thư viện này về nữa.

Hãy xem những gì mặc định trong cấu trúc thư mục tests.

Trong thư mục “tests” có 2 thư mục chính là: Unit và Feature. Thư mục “Unit” chứa các bài kiểm thử đơn vị – unit test. Thư mục “Feature” chứa các bài kiểm thử tính năng – feature test. Các kiểm thử tính năng về cơ bản là các kiểm tra chức năng mà chúng ta đã mô tả trong phần 1. Vì vậy chúng ta sẽ đi tập trung vào unit test trong phần này.

Một tệp khác rất quan trọng là tệp phpunit.xml trong thư mục gốc.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
        backupStaticAttributes="false"
        bootstrap="vendor/autoload.php"
        colors="true"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        processIsolation="false"
        stopOnFailure="false">
   <testsuites>
       <testsuite name="Feature">
           <directory suffix="Test.php">./tests/Feature</directory>
       </testsuite>
       <testsuite name="Unit">
           <directory suffix="Test.php">./tests/Unit</directory>
       </testsuite>
   </testsuites>
   <filter>
       <whitelist processUncoveredFilesFromWhitelist="true">
           <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>

Tập tin này chứa tất cả các cài đặt phpunit mà chúng ta cần. Như bạn có thể nhận thấy, vì chúng tôi đã xóa thư mục của Feature, chúng tôi cũng có thể xóa nội dung thẻ <testsuite> đó. Vì vậy, loại bỏ phần hiển thị trong hình dưới đây.

Bây giờ, hãy mở terminal của bạn và điều hướng đến thư mục gốc project của bạn, đó là thư mục của laravel5 đã đề cập ở trên trong bước 1 sau đó chạy phpunit đầu tiên bằng câu lệnh: “vendor\bin\phpunit”.

Có một lưu ý, màn hình trên không có màu sắc. TDD là tất cả về chu kỳ tái cấu trúc màu đỏ-xanh lá cây, vì vậy một phản hồi trực quan sẽ mang lại cho chúng ta nhiều thông tin hơn. Tôi khuyên bạn nên sử dụng một cái gì đó như ConEmu để trình giả lập giao diện điều khiển tốt hơn. Dưới đây là cùng một lệnh theo ConEmu.

Lưu ý tôi sử dụng lệnh phpunit ‘thay vì vendor\bin\phpunit’. ConEmu hỗ trợ tính năng định danh, nơi bạn có thể lưu trữ các lệnh dài dưới dạng định danh ngắn.

Tuyệt vời, một test case đã được chạy thành công! Đây là bài kiểm tra đơn vị mặc định trong Laravel.

Hãy để xem nội dung của nó:

<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ExampleTest extends TestCase
{
   /**
    * A basic test example.
    *
    * @return void
    */
   public function testBasicTest()
   {
       $this->assertTrue(true);
   }
}

Điều đầu tiên kiểm tra đơn vị có một không gian tên. Đây là một thực hành tốt để làm theo. Không gian tên sẽ ngăn chúng ta đặt tên xung đột.

Câu lệnh sử dụng đầu tiên tham chiếu class ‘TestCase, bên trong không gian tên‘ Tests. Trong đoạn mã trên, trên dòng 8, chúng ta có thể thấy rằng nó đang được mở rộng bởi lớp ExampleTest của chúng ta. Vì vậy, hãy vào tập tin đó và xem những gì nó có.

<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
   use CreatesApplication;
}

TestCase thực sự kế thừa BaseTestCase, và nó có một loạt các hàm được cài đặt sẵn.

Và class CreatesApplication chứa mã để kích hoạt một class thông qua Laravel IoC. Đây sẽ là rất hữu ích cho Feature tes. Nhưng vì chúng ta hiện đang thực hiện các bài kiểm tra đơn vị, nên chúng ta mở rộng lớp TestCase này.

Quay trở lại tệp ExampleTest, chúng ta có một tuyên bố sử dụng khác tham chiếu tính năng RefreshDatabase. Chúng ta sẽ không cần nó cho các bài kiểm thử đơn vị. Điều này là do chúng ta hoàn toàn không tương tác với cơ sở dữ liệu khi viết các trường hợp kiểm thử đơn vị. Vì vậy hãy xoá bỏ nó đi.

Bây giờ, đây là tệp ExampleTest của chúng ta trông như sau:

<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
   /**
    * A basic test example.
    *
    * @return void
    */
   public function testBasicTest()
   {
       $this->assertTrue(true);
   }
}

Điều tiếp theo chúng ta thấy ở đây là các dòng comment. Chúng ta thường không viết comment cho các phương thức test. Thay vào đó, chúng ta viết các chú thích sửa đổi hành vi test chạy.

Bây giờ đến với tiêu chuẩn đặt tên phương thức. Chúng ta thường sử dụng cách đặt tên theo dạng camelCase. Cá nhân tôi sử dụng tiêu chuẩn này (sự kết hợp của camelCase và snake_case).

Cuối cùng chúng ta thấy phương thức assertTrue() được gọi. Các Asserts là các tuyên bố mà chúng ta sử dụng để xác minh hoặc kiểm tra xem đầu ra của chúng ta có phải là những gì chúng ta cần không.

Kiểm tra các Assettions trên trang của tài liệu PHPUnit chính thức tại đây:

https://phpunit.de/manual/current/en/appendixes.assertions.html

Đừng lo lắng, chúng ta không cần phải ghi nhớ tất cả. Trong thực tế, bạn sẽ sử dụng lại hầu hết các bài kiểm thử tương tự cho phần lớn các bài kiểm tra bạn viết. Chúng ta sẽ tìm hiểu về hầu hết những cái thường xuyên sử dụng khi chúng ta đi qua loạt bài hướng dẫn này.

Như vậy, chúng ta đã trải qua thiết lập PHPUnit và tìm hiểu một chút về PHPUnit. Trong phần tiếp theo, chúng ta sẽ tìm hiểu làm thế nào để giả lập các đối tượng và viết các trường hợp thử nghiệm trong ứng dụng thực tế để bạn nắm bắt tốt hơn.

Author: Phan Văn Luân

Xem thêm các bài viết, tài liệu hướng dẫn học lập trình khác tại đây.

Tags:

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

1 + 7 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM