Unit Testing phần 1 – Giới thiệu PHPUnit

Bài viết được sự cho phép của tác giả Kien Dang Chung

1. Kiểm thử ứng dụng là gì?

Kiểm thử phần mềm là một khâu quan trọng trong phát triển phần mềm, trước đây chúng ta thường xem nhẹ việc này vì mấy lý do: thích làm tùy tiện cho nhanh, thực hiện tốn kém hơn… Những sản phẩm được gọt dũa cẩn thận mang lại trải nghiệm tốt cho người dùng và cũng vì thế nó tồn tại lâu hơn, thành công hơn. Kiểm thử phần mềm được chia thành nhiều dạng khác nhau theo phạm vi và giai đoạn triển khai, chúng ta cùng xem một số dạng kiểm thử chính:

  • Unit testing: Kiểm thử ở mức đơn vị mã nguồn. Một đơn vị mã nguồn là thành phần nhỏ nhất trong mã nguồn mà chúng ta có thể kiểm tra. Như vậy, trong Unit testing chúng ta sẽ kiểm thử các lớp (class), phương thức (method)… Mục tiêu của unit testing là kiểm tra tính đúng đắn trong các xử lý của từng đơn vị mã nguồn.
  • Integration testing: Kiểm thử tích hợp các thành phần một ứng dụng, được thực hiện sau Unit test. Trong Integration testing chúng ta có thể kiểm tra cấu trúc ứng dụng, kiểm tra chức năng, hiệu năng sản phẩm cũng như khả năng chịu tải ứng dụng.
  • Ngoài ra còn rất nhiều các dạng kiểm thử khác như Acceptance testing, kiểm tra xem ứng dụng đã đạt được yêu cầu khách hàng chưa, security testing – kiểm tra tính bảo mật của ứng dụng…
  Hướng dẫn viết unit test trong React
  Kiểm thử đơn vị trong C# với Nunit và .Net Core

Trong loạt bài viết này, chúng ta sẽ chỉ tập trung vào Unit testing khi thực hiện một dự án bằng ngôn ngữ PHP.

Giới thiệu PHPUnit

2. Unit testing với PHPUnit

PHPUnit là một gói thư viện mã nguồn mở sử dụng trong Unit testing với ngôn ngữ PHP rất tốt, nó cung cấp rất nhiều các class, phương thức giúp cho việc viết các đoạn mã kiểm thử trở nên nhanh chóng và thuận lợi. Chúng ta sẽ cùng nhau khám phá PHPUnit để thấy được sức mạnh của nó trong việc kiểm thử ứng dụng PHP.

2.1 Cài đặt PHPUnit

Đầu tiên, để sử dụng được PHPUnit chúng ta cần cài đặt nó vào dự án. Trong loạt bài viết này, chúng ta sẽ tạo ra một dự án tên phpunit nằm trong C:/xampp/htdocs (do tôi dùng XAMPP). PHPUnit được cài đặt thông qua composer:

Admin@ADMIN-PC c:\xampp\htdocs\phpunit
$ composer require phpunit/phpunit
Using version ^5.7 for phpunit/phpunit
./composer.json has been updated
Loading composer repositories with package information
...
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files

Cài đặt PHPUnit như vậy đã xong, chúng ta cùng xem cấu trúc thư mục dự án PHPUnit:

Giới thiệu PHPUnit

Các thư mục và file trong thư mục phpunit như sau:

  • app: Chứa code ứng dụng.
  • test: Chứa code cho kiểm thử ứng dụng.
  • vendor: được tạo ra bởi composer, chứa mã nguồn của gói thư viện PHPUnit.
  • composer.json: thiết lập các gói thư viện trong ứng dụng với composer.
  • phpunit.xml là file cấu hình cho PHPUnit.

Mặc định file phpunit.xml chưa có, bạn có thể tạo ra với nội dung như sau:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./test/</directory>
        </testsuite>
    </testsuites>
</phpunit>

Giải thích qua một số thiết lập trong phpunit.xml:

  • colors=”true” thiết lập để PHPUnit hiển thị màu trong kết quả test.
  • ./test/

2.2 Các quy ước trong PHPUnit

2.2.1 Cấu trúc thư mục và tên file

PHPUnit có một số quy ước để quá trình test thuận lợi. Quy ước đầu tiên là về cấu trúc file và tên file. Các file test cần được ánh xạ 1-1 với codebase và tên file được thêm chữ Test. Ví dụ:

./app/Foo.php
./app/Bar.php
./app/Controller/Baz.php

Cấu trúc thư mục Test sẽ như sau:

./test/FooTest.php
./test/BarTest.php
./test/Controller/BazTest.php

2.2.2 Class và phương thức

Tên class là giống với tên file và phải mở rộng class PHPUnit_Framework_TestCase. Phương thức kiểm thử cần được đặt tên với bắt đầu bằng test, tên phương thức phải mô tả được hành động test. Ví dụ, nếu bạn test một phương thức verifyAccount(), bạn có thể đặt tên phương thức kiểm thử là testVerifyAccountMatchesPasswordGiven(). Các phương thức test phải là public, PHPUnit không thể chạy các test với các phương thức protected hoặc private. ## 3. Ví dụ kiểm thử đầu tiên

Chúng ta thực hiện ví dụ kiểm thử đầu tiên, trong ví dụ này việc test chỉ đơn giản là kiểm tra xem một biến có giá trị là true hay không? Tạo ra file FirstTest.php trong thư mục test với nội dung:

<?php
namespace Test;
class FirstTest extends \PHPUnit_Framework_TestCase
{
    public function testTrueIsTrue()
    {
        $foo = true;
        $this->assertTrue($foo);
    }
}

không có gì đặc biệt, chỉ đơn giản là tạo ra một Class mở rộng PHPUnit_Framework_TestCase. Tiếp theo chúng ta sẽ tạo ra một phương thức để kiểm tra xem biến $foo có giá trị true hay không? OK, giờ là lúc chạy PHPUnit từ màn hình dòng lệnh để thực hiện kiểm thử:

Admin@ADMIN-PC c:\xampp\htdocs\phpunit
$ vendor\bin\phpunit
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 53 ms, Memory: 2.25MB

OK (1 test, 1 assertion)

PHPUnit đã thông báo là có 1 kiểm thử được thực hiện và kết quả là kiểm thử này có kết quả tốt. Ví dụ đầu tiên này có vẻ quá đơn giản, nhưng cũng nhờ đó chúng ta kiểm tra các thiết lập ban đầu cho PHPUnit và cũng là để chúng ta thấy việc kiểm thử không phải là một cái gì đó phức tạp.

4. Lời kết

Trong bài đầu tiên này, bạn đã hiểu sơ lược về Unit testing và cách sử dụng gói thư viện PHPUnit với ví dụ khá đơn giản. Việc kiểm thử ứng dụng là phải tìm ra nhiều các trường hợp thử nghiệm khác nhau để tránh bị bỏ sót lỗi, chính vì thế các đoạn mã kiểm thử cũng phải vét cạn được các trường hợp kiểm thử. Phần tiếp theo chúng ta sẽ đi sâu hơn về Assertsion và Anotation, những ý tưởng này giúp cho việc kiểm thử gọn gàng hơn.

Bài viết gốc được đăng tải tại allaravel.com

Có thể bạn quan tâm:

Xem thêm các tuyển dụng php hấp dẫn tại TopDev