PHP Test tools: How to use SimpleTest in Eclipse (part 1)

Cài đặt SimpleTest trong Eclipse

  • Cài đặt từ Remote Site

  • Cài đặt từ Local Site

Cấu hình SimpleTest trong Eclipse

  1. Chọn Window > Preferences… trên menu bar
  2. Chọn “Simple Test” trong danh mục liệt kê bên tay trái.
  3. Nhập hoặc chọn đường dẫn tới file php.exe
  4. Nhập định dạng file cho file dùng để test. Ví dụ “.php” hooặc “.test.php”.
  5. Click OK.

Sử dụng SimpleTest trong Eclipse

  • Tạo mới một PHP Project với tên là Test gồm các thư mục con:
    • Test\classes: dùng chứa các class cần test.
    • Test\test: chứa các file test.
  • Tạo files Calculator.php trong thư mục ‘classes’.
<?php
class Calculator{
  function add($x, $y){
    return $x + $y;
  }

  function subtract($x, $y){
    return $x - $y + 1; // Hiện thực sai
  }
}
?>
  • Tạo file testCalculator.php trong thư mục ‘test’.
<?php
require_once(dirname(__FILE__). '/../classes/Calculator.php');
class testCalculator extends UnitTestCase {
	function test_exists(){
		$url = dirname(__FILE__);
		$this->assertTrue(file_exists($url . '/../classes/Calculator.php'),"File not existed at $url");
	}

	function test_add(){
		$cal = new Calculator();
		$result = $cal->add(1,2);
		$this->assertEqual(3, $result, "Passed");

	}

	function test_subtract(){
		$cal = new Calculator();
		$result = $cal->subtract(1,2);
               $this->assertEqual(-1, $result, " Value what we expected is '-1' is not equal '$result' which is returned from subtract function");
	}

}
?>
  • Chọn Run As > Simple Test (hoặc tổ hợp phí Alt+Shift+X, G). Hộp thoại kết quả sẽ xuất hiện như sau:
Failed Testing

Failed Testing

  • Cửa sổ kết quả cho thấy phần hiện thực hàm “subtract” của lớp Calculator đã hiện thực sai. Sửa lại file Calculator.php như sau:
<?php
class Calculator{
  function add($x, $y){
    return $x + $y;
  }

  function subtract($x, $y){
    return $x - $y + 1; // Hiện thực sai
    return $x - $y;
  }
}
?>
  • Chọn Run As > Simple Test, kết quả như sau:
Passed Testing

Passed Testing

Một số lưu ý:

  • Không có yêu cầu cụ thể đối với việc đặt tên file dùng để test (nhưng nên theo chuẩn).
  • Tên function trong file test (cụ thể là testCalculator.php) phải bắt đầu bằng tiền tố “test” (không phân biệt chữ viết hoa hay chữ viết thường).
  • Có thể test trực tiếp qua browser, khi đó:
    • Download và giải nén gói simpletest ở trang http://simpletest.org/en/download.html
    • Chép thư mục simpletest vào trong thư mục Test/test/ chung với file testCalculator.
    • Thêm dòng lệnh sau vào đầu file testCalculator.php:
          require_once(dirname(__FILE__) . '/simpletest/autorun.php');
    • Mở browser (IE, Firefox, Safari…) gõ vào url  sau đây, trường hợp của mình file testCalculator nằm trong thư mục /demo/Test/test/:
          http://localhost/demo/test/test/testCalculator.php
    • Kết quả sẽ như sau:

    Passed Testing in Safari Browser

    Passed Testing in Safari Browser

Resource:

  • http://simpletest.org/eclipse/readme.html

PHP test tools: SimpleTest or PHPUnit

Trang opensourcetesting.org giới thiệu 9 công cụ hỗ trợ tiến trình Unit Test đối với lập trình PHP gồm có:

  • Amock
  • izh_test
  • PHP Assertion Unit Framework
  • PHPUnit (dựa trên nền tảng JUnit)
  • PHPUnit (trong gói PEAR)
  • Simple Test
  • Spike PHPCheckstyle
  • Spike PHPCoverage
  • Testilence.

Tuy nhiên, căn cứ vào số lượng download, có thể thấy nổi bật lên trong số đó chính là Simple Test (>100k lượt) và PHPUnit (>35k lượt).

Simple Test chủ yếu được phát triển bởi Marcus Barker và một số thành viên khác trong khi đó PHPUnit được phát triển bởi  Sebastian Bermann dựa trên nền tảng của JUnit nên có vẻ phát triển ổn định và được hỗ trợ bởi một cộng đồng lớn hơn so với Simple Test. Điều này thể hiện qua việc việc PHPUnit đã đưa ra phiên bản 4.0 so với phiên bản 1.0.1 của Simple Test.

Vậy chúng ta cần gì ở một PHP test tools:

  • Hỗ trợ mô hình test tăng dần, cho phép tạo các test case trước khi triển khai.
  • Hỗ trợ quá trình test qua browser hoặc command-line.
  • Có thể thực hiện cả việc test độc lập, theo nhóm và các bài test tổng thể
  • Có thể customize phần hiển thị kết quả.
  • Cho phép kiểm tra cấu trúc của lớp.
  • Kiểm tra các biệt lệ và sự kiểm soát biệt lệ.
  • Cung cấp các plug-in để tích hợp với IDE

May thay, cả SimpleTest và PHPUnit đều đáp ứng được hầu hết những yêu cầu đó. Tuy nhiên, mỗi công cụ cũng có những ưu và nhược điểm riêng:

Về phía PHPUnit.

  • Ưu điểm:
    • Được sử dụng và hỗ trợ rộng rãi từ cộng đồng  Zend: Cập nhật thường xuyên, mức độ lỗi ít, tài liệu chi tiết.
    • Có thể tạo nhiều loại report khác nhau.
  • Khuyết điểm:
    • Mock Objects được đưa ra trong phiên bản PHPUnit 3 song vẫn chưa thể sánh bằng SimpleTest
    • Không thực thi trực tiếp từ browser.
    • Ít chức năng hơn Simple Test

Về phía SimpleTest.

  • Ưu điểm:
    • Hỗ trợ Mock Objects mạnh mẽ
    • Hoạt động chung với PHPUnit
    • Có thể thực thi trực tiếp từ browser lẫn command-line.
    • Có thể test cả hành vi lẫn trạng thái của đối tượng.
    • Người dùng  Drupal có thể cài đạt module để sử dụng SimpleTest
  • Khuyết điểm:
    • Phần tài liệu không bằng PHPUnit
    • Cần thêm sự bổ sung mở rộng để dùng chung với Zend Framework

Mock Objects mô phỏng lại các đối tượng thực sự trong ứng dụng, chúng cũng có các phương thức giống như các đối tượng mà nó mô phỏng, chính vì vậy nó thường được tạo ra nhằm kiểm tra tính đúng đắn của một đối tượng phụ thuộc vào đối tượng mà nó mô phỏng.

Như chúng ta đã biết, trong các ứng dụng, một đối tượng thường phụ thuộc vào sự tồn tại của một (hay nhiều) đối tượng khác, chính vì vậy sẽ gây ra trở ngại khi phải thực hiện công đoạn Unit Test (mục đích là cách ly các thành phần của ứng dụng).

Giả sử có class StudentBSO cung cấp các business services cho các đối tượng Student và sử dụng StudentDAO để lưu dữ liệu vào database. Khi muốn test class StudentBSO, chúng ta chỉ cần gọi đối tượng mock object mô phỏng đối tượng StudentDAO, thực hiện triệu gọi các phương thức với các đối số tương ứng (đã được xác định) nhằm đạt được kết quả mong muốn thay vì phải gọi trực tiếp tới đối tượng StudentDAO.

Về mặt tính năng, giữa chúng có nhiều tính năng tương đồng và dễ dàng tích hợp với người dùng Eclipse. Nếu như trước đây người dùng PHPUnit cảm thấy yếu thế hơn khi mà PHPUnit không hỗ trợ Mock Object thì giờ đây, từ phiên bản 3 đã hỗ trợ Mock Object (tuy vẫn còn rất hạn chế) và nhiều tính năng khác như Database Testing… Tuy nhiên, người dùng SimpleTest có thể thực sự thấy quá trình Test thực sự “Simple” bởi những tính năng mà nó đem lại.

Resource:

Tản mạn về LAMP và .NET

Gác lại những gì thuộc về LAMP, gác lại những gì thuộc về open source, miễn phí và nhỏ gọn; gác lại những Text Editor quen thuộc; gác lại những dòng hand code trong sáng; gác lại chiếc computer với bộ xử lý celeron đã 3 năm vẫn chạy tốt (dù mainboard vẫn tự động kích hoạt khi kích điện, dù nắp case đã được mở tan hoang “khêu gợi” lũ thằn lằn, ổ CD cũng đã được tháo ra, chiếc màn hình Samsung Flat 17inches có triệu chứng già cỗi đã gần 1 năm)… mọi thứ đã từng dùng!Chuyển sang Microsoft, đồng nghĩa với việc phải sử dụng những bộ Visual Studio với size được tính bằng giga, chứa trên những đía DVD đen bóng, cũng đồng nghĩa với việc tốn hàng ngàn USD cho vấn đề license, và rồi sẽ được nhận những dòng code được tự động sinh ra chỉ sau vài cú drag and drop. Mọi thao tác trở nên visual hơn và dĩ nhiên… tiện lợi hơn rất nhiều, thời gian theo đó sẽ được giảm thiểu đáng kể… bonus thêm là work on hẳn trên lappy!Quả thật, khi mọi thứ đều được đánh đồng, khách hàng “chẳng thèm” quan tâm tới vấn đề “thuộc về” phe developers. Hãy nói chuyện, hãy đàm phán với kết quả là một product hoàn chỉnh trong một thời gian ngắn! Thế thôi!Ngẫm cũng phải, thứ quý nhất bây giờ chẳng phải là những lá vàng bốn số chín, chẳng phải là những đồng dollars mỹ kim, cũng chẳng phải là những đồng ECU (European Currency Unit) mà hầu như cả châu Âu đang xài, mà là… là diamond! Đùa thôi, là thời gian, chính thời gian mới là quý nhất chí ít là tới thời điểm hiện nay (bởi từ khi Doraemon bị “hết pin”, cỗ máy thời gian đã ngừng hoạt động, và cho tới nay, chưa thấy vị professor nào đề cập tới việc sửa chữa cỗ máy ấy cả). Vì vậy, “bắt tay” với Microsoft không phải là một giải pháp quá tệ đâu!Chẳng cần phải bàn cãi, tranh luận về cuộc chiến giữa LAMP vs .NET, giữa Java vs C#, giữa PHP vs ASP hay giữa Jbuilder, Netbeans vs Visual Studio xem ai lợi hại hơn ai, ai có “nội lực thâm hậu” hơn ai? Quy cho cùng, dó chỉ là một dạng câu hỏi “trứng” với “gà” (lan man một chút, theo tui, cái trứng có trước! Nhưng đó là trứng của con chuẩn bị tiến hóa thành con gà)! Kết quả thế nào không rõ, chỉ biết tốn thời gian vô ích. Mà với khoảng thời gian tranh cãi đó, thế giới đã sang một kỷ nguyên mới (có thể hai phe đã bắt tay, sát nhập thành một cũng nên như cái thời kỳ “war method” của thập niên 90 thế kỷ 20).Chuyển sang .NET không có nghĩa là mọi thứ của .NET đều là best, có những thứ bad lắm chớ bộ! (Hôm trước, tearcher “khen” thằng bạn, “You are a bad student” mà nhìn thấy mặt nó tươi hớn hở, tieHandDotCom). Nếu như những cái best của .NET đã trở thành truyền thống, trở thành mẫu mực thì… cái bad của nó cũng tiếp bước, “chình ình” trong phòng truyền thống. Thế nên cũng chẳng cần phải “yêu cầu” nó thay đổi làm gì. Học cách sống chung là tốt nhất…Chuyển sang một môi trường mới cũng chẳng dễ dàng gì, thay đổi thói quen, thay đổi “tư duy”, thay đổi… mọi thứ. Rồi mọi thứ sẽ ổn, mình lại có thêm khả năng adaptive nè. Cứ nhìn xem, trends cứ change liên lục, technology thì vụt sáng vụt tắt, mấy ai trung thành mãi với fomula 67, smalltalk 80, với Fox… nên rồi sẽ mấy ai quan tâm tới .NET là gì, LAMP là gì. “Mọi thứ đều là tương đối, duy chỉ có thuyết tương đối của Einstein là tuyệt đối!” – [Không phải tui nói].Mà cũng chẳng việc gì phải “bợ đỡ” nó, đơn giản nó chỉ là một trong muôn vàn “công cụ” để mưu sinh. Có thể sống với nó trọn đời, nhưng cũng có thể “anh sẽ đến, dù chỉ bên em một phút thôi”. Còn đam mê ư, hãy nghiên cứu những Algorithm, Database Theory, Maths hay Philosophy … để nếu có lạc hậu, thì mình cũng “trở về với cát bụi mấy lần!”. Còn technology, bản thân nó vốn đã cũ ngay từ trước khi released.Cũng chẳng cần phải bao biện cho lý do say goodbye to LAMP, welcome to .NET. Nhưng thực sự, tôi vẫn yêu LAMP, vẫn thích free “hợp pháp” (vẫn còn bản chất của sinh dziên VN mừh) và có thói quen hand-code, v.v…Tản mạn thế thôi…