Yii Framework Unit Testing
Unit testing ของ Yii Framework ถูกเขียนอยู่บน PHPUnit, สรุปหลักการพื้นฐานของการเขียน unit Testing ใน Yii มีดังนี้
- ชื่อ Class เขียนอยู่ในรูปแบบ XyzTest โดยต้อง extends จาก CTestCase หรือ CDbTestCase เมื่อ Xyz คือชื่อ class สำหรับ test เช่นถ้าเราต้องการเขียน test Post class ชื่อที่ตั้งคือ PostTest ส่วนการ extends นั้น extends CTestCase สำหรับ test ทั่วๆไป ถ้าจะ test active record ควรใช้ CDbTestCase แทน CTestCase เพราะ class PHPUnit_Framework_TestCase เป็น class แม่ของทั้งสอง class นั้นอยู่แล้ว คุณสมบัติต่างๆ ก็จะถูกสือถอดจาก class นั้น
- Save ไฟล์ด้วยชื่อตามรูปแบบ XyzTest.php ไว้ที่ protected/tests/unit/
- ชื่อ method ภายใน class ที่ต้องการ test เขียนตามรูปแบบ testAbc เมื่อ Abc คือชื่อ method
- วิธีการ test method มักจะใช้วิธีใส่ลำดับคำสั่งยืนยัน (assertion statements) เช่น assertTrue, assertEquals ซึ่งทำหน้าที่เป็น checkpoints ในการตรวจสอบความถูกต้องของ Class ของเรา
ตัวอย่างโค้ดการเขียน CommentTest
<?php
class CommentTest extends CDbTestCase
{
/**
* We use both 'Post' and 'Comment' fixtures.
* @see CWebTestCase::fixtures
*/
public $fixtures=array(
'posts'=>'Post',
'comments'=>'Comment',
);
public function testFindRecentComments()
{
$this->assertEquals(array(), Comment::model()->findRecentComments());
$comment=new Comment;
$comment->setAttributes(array(
'content'=>'comment 1',
'status'=>Comment::STATUS_APPROVED,
'create_time'=>time(),
'author'=>'me',
'email'=>'[email protected]',
'post_id'=>$this->posts['sample1']['id'],
),false);
$this->assertTrue($comment->save(false));
$this->assertEquals(1,$comment->id);
$comments=Comment::model()->findRecentComments();
$this->assertEquals(1,count($comments));
$this->assertEquals($comment->attributes, $comments[0]->attributes);
}
public function testApprove()
{
$comment=new Comment;
$comment->setAttributes(array(
'content'=>'comment 1',
'status'=>Comment::STATUS_PENDING,
'create_time'=>time(),
'author'=>'me',
'email'=>'[email protected]',
'post_id'=>$this->posts['sample1']['id'],
),false);
$this->assertTrue($comment->save(false));
$comment=Comment::model()->findByPk($comment->id);
$this->assertTrue($comment instanceof Comment);
$this->assertEquals(Comment::STATUS_PENDING,$comment->status);
$comment->approve();
$this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
$comment=Comment::model()->findByPk($comment->id);
$this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
}
}ทดลองรัน
>phpunit functional/CommentTest.php
ทดสอบรันในรูปแบบอื่นๆอ่านที่บทความ
เตรียมเครื่องทำ สำหรับ PHPUnit และ Selenium
ก่อนรัน ถ้ายังไม่ได้ satrt selenium ให้ start มันก่อนด้วยคำสั่ง
D:\xampp\htdocs\Yii_Framework>java -jar selenium-server.jar