Tips: WordPress Unit Test

Thanthiya Phatharamalai
odds.team
Published in
2 min readSep 21, 2017

เนื่องจากที่ Pronto Tools เรามี Product ที่ใช้ WordPress Platform ด้วย Product ตัวนี้ของเราค่อนข้างใหญ่และมี custom plugins เยอะมาก เรียกได้ว่าใครที่อยากมีประสบการณ์กับ WordPress, PHP ถ้าได้มาทำงานที่นี่คือได้ครบ และ code เหล่านี้ก็มีการเขียน unit test ด้วย blog นี้เลยอยากแชร์ trick บางอย่างที่พวกเราใช้ ส่วน tutorial นี่หาอ่านได้ทั่วไปเลยจ้ะ เช่น site ของ Juan Treminio เค้าเขียนให้อ่านตั้ง 5 part แล้วก็มีของเว็บ wpmudev

blog นี้จะอธิบายเหมือน take note กันลืมมากๆ เลยนะ ฮาๆ

สมมตินี่คือ class ของเรา ก็จะค่อยๆ เติมของเข้ามา

class TestProntoAPI extends WP_UnitTestCase {
....
....
}

การใช้ dbDelta

function setUp(){
parent::setUp();
$sql = 'CREATE TABLE ...';
dbDelta($sql)
}

การใช้ Factory

ที่ใช้กันบ่อยๆ เลยก็จะเป็น post object ก็จะทำประมาณนี้

function _create_post () {
$post_id = $this->factory->post->create( array (
'post_type' => 'post',
'post_status' => 'publish',
'post_content' => '',
'post_title' => 'Test Blog feed'
));
return $post_id;
}

อันนึงที่มีประโยชน์มากสำหรับการ test multisite คือ blog factory หาตัวอย่างคนทำไม่ค่อยได้ด้วย สามารถใส่ parameter เข้าไปได้ด้วย เช่น domain อยากรู้ว่าใส่ parameter อะไรได้อีกก็ ดูที่นี่

$blog_id = $this->factory->blog->create(
'domain' => 'example.org'
)

ถ้าอยากดูตัวอย่าง factory ว่ามีอะไรที่ WordPress ให้ใช้บ้าง ดูที่นี่

อย่าลืมว่าวิธีการรันเทสของ single site และ multisite ไม่เหมือนกัน และถ้าเรารัน test แบบ single site เราจะไม่สามารถใช้คำสั่งของ multisite ได้เลย เช่นพวก switch_to_blog() หรือ wp_get_sites()

คำสั่งรัน PHP single site phpunit
คำสั่งรัน PHP multisite phpunit -c yourpath/tests/phpunit/multisite.xml

ในนี้มีตัวอย่าง multisite test ให้ดูอีกนิดหน่อย ดูที่นี่

ทำยังงัยถ้าเราจะ mock สิ่งที่รับมาจาก $_POST $_REQUEST

คำถามนี้ถ้าคิดลึกจะโคตรยาก แต่ถ้าคิดตื้นๆ จะง่ายมาก สมมติเรามี function นี้ ซึ่งมีการรับค่ามา $apple เข้ามาทาง $_REQUEST

function get_apple(){
extract( $_REQUEST );
$text = "You know? I'm {$apple}";
return $text;

เวลาเขียน test ก็แบบนี้เลย

function test_get_apple(){
$_REQUEST['apple'] = 'apple';
$result = get_apple();
$this->assertEquals("You know? I'm apple", $result);
}

สามารถ activate plugin ตอน test ได้ด้วย อ่านเกี่ยวกับการ test plugin activate ได้ ที่นี่

$plugin = activate_plugin( WP_PLUGIN_DIR . '/akismet/akismet.php' );

ดูเพิ่มเติมได้ ที่นี่ ถ้าอยากรู้ว่าเรา Assert อะไรได้บ้าง

search ไปๆ มาๆ ไปเจอกันทำ wp scaffold plugin-tests ดูน่าสนใจมาก น่าจะทำให้ชีวิตการ install ง่ายขึ้น เพราะจริงๆ การ set environment ของการรัน phpunit ค่อนข้างลำบาก ยังไม่เคยลองเหมือนกัน

อ่าน PHP coding standard ที่นี่

--

--

Thanthiya Phatharamalai
odds.team

Agile Coach ผู้ชื่นชอบในการทำ Organization Transformation องค์กรไหนก็ได้ เอามา เราสู้!!!