in Technology

เริ่มต้นทำ CI/CD – Automation Testing ด้วย PHPUnit และ Jenkins (2)

บล็อกที่แล้วเขียนเรื่อง วิธีติดตั้ง Jenkin ไว้ เพื่อเตรียมทำ CI (Continuous Integration)
แต่ก่อนจะไปถึงตรงนั้น นอกจากต้องใช้ Version Control เป็นแล้ว ก็ต้องมีวิธีการทดสอบโค้ดที่เขียนก่อน

และคุณประโยชน์ที่เราจะไปใช้ Scrum เพื่อทำ Agile คือ การส่งมอบงาน หรือ Software ที่ใช้ได้ ให้ได้ไวๆ
ดังนั้น การส่งมอบให้ได้ไว คือการทำงานเป็นรอบ และการทำงานเป็นรอบ เราจะได้ผลตอบรับไว (fast feedback) ว่าใช่หรือไม่ใช่ ผิดหรือถูก

เช่นกัน Software ที่ใช้ได้และส่งมอบงานได้ไว ก็ต้องมี Automate Test ที่ทำงานได้แทนเรา และครอบคลุม หนึ่งในนั้นคือ Unit Test

ว่าแล้วก็ลองมาดูกัน

ติดตั้ง PHPUnit บน Ubuntu

ใช้คำสั่งเดียว ดังนี้

$ sudo apt-get install phpunit

ทดสอบด้วยคำสั่ง

$ phpunit --version

จะแสดงข้อความ ประมาณ PHPUnit 3.7.21 by Sebastian Bergmann. ก็พร้อมใช้แล้วครับ

ติดตั้ง PHPUnit บน Windows

ซับซ้อนนิด ลองทำตามดู

  1. .ไป Download PHPUnit ที่ https://phpunit.de/
  2. จะได้ไฟล์ชื่อประมาณว่า phpunit-6.2.1.phar ให้เอามันไปไว้ที่ไหนโฟลเดอร์ไหนสักแห่ง ในที่นี้ผมไว้ที่ C:\bin
  3. จากนั้นเข้าไปที่ windows command ด้วยการกด ปุ่มรูป windows ที่ keyboard + R
  4. พิมพ์คำสั่ง
    cd C:\bin
    echo @php "%~dp0phpunit-6.2.1.phar" %* > phpunit.cmd
  5. ถ้าสังเกตในโฟลเดอร์ของเรา จะพบไฟล์ชื่อ phpunit.cmd ขึ้นมาไฟล์หนึ่ง
  6. จากนั้นไปตั้งค่า Environment Variables และใส่ Path เป็นที่อยู่โฟลเดอร์ที่เราเก็บไฟล์ไว้ นั่นก็คือ C:\bin
  7. คราวนี้เราจะสามารถใช้งาน phpunit ที่โฟลเดอร์อื่นๆ นอกเหนือจาก C:\bin ได้แล้ว

เริ่มต้นลองเขียน PHPUnit แบบง่ายๆ

สมมติว่าผมสร้างไฟล์ชื่อ Calculate.php ในนั้นมี Class ชื่อ Calculate และมี Function บวกเลขขึ้นมาตัวหนึ่ง

ผมต้องสร้างไฟล์ทดสอบขึ้นมาประกบ Function นี้ โดยผมตั้งชื่อว่า test_calculate.php และมีโค้ด ดังนี้

ไฟล์ นี้ผมจะ include ไฟล์ที่จะทำการทดสอบมาด้วย นั่นคือ Calculate.php
จากนั้นผมจะ extends เรียกใช้ตัว PHPUnit_Framework_TestCase เพื่อเรียกใช้งานคำสั่งต่างๆของ PHPUnit

class Test_calculate extends PHPUnit_Framework_TestCase

เรียกใช้ function setup() ซึ่งมันจะทำคำสั่งทั้งหมดในนี้ทุกครั้งที่มีการทดสอบ function อื่นๆ เสมอ

public function setup() {
$this->calculate = new Calculate();
}

สร้าง function ทดสอบการบวกเลขขึ้นมา โดยการตั้งชื่อของ PHPUnit จะต้องขึ้นต้นด้วย test เสมอ
และผทใช้คำสั่ง assertEquals() เพื่อตรวจสอบว่า ผลลัพธ์ที่ได้จาก $this->calculate->add($a, $b) เท่ากับ $expected หรือไม่
โดยตัวแปล $a, $b, $expected ผมให้เรียกใช้มาจากชุดตัวเลขทดสอบ ที่เก็บไว้ใน function additionProvider()
โดยวิธีการเรียกใช้นั้น คือคำสั่ง @dataProvider ที่อยู่ในกรอบคอมเม้น
/**
* @dataProvider additionProvider
*/
public function testAdd($a, $b, $expected) {
$this->assertEquals($expected, $this->calculate->add($a, $b));
}

public function additionProvider()
{
return [
‘0+0=0’ => [0, 0, 0],
‘0+1=1’ => [0, 1, 1],
‘1+0=0’ => [1, 0, 0],
‘1+4=3’ => [1, 4, 3]
];
}

จากนั้นทำการรันคำสั่ง

$ phpunit test_calculate.php

ผลที่ได้จะเป็นดังรูปนี้

ความหมายคือ ผลการทดสอบ ไม่ผ่าน
โดยทดสอบด้วย 4 ชุดข้อมูล ไม่ผ่าน 2 ชุดข้อมูล

ให้ Jenkins ทดสอบ PHPUnit อัตโนมัติ ทุกครั้งที่มีการ Push สู่ Git

กลับไปที่ Jenkins Project ที่สร้างไว้จากบล็อก สอนติดตั้ง Jenkins
ในส่วนของ Build ให้กดปุ่ม Add build step เพื่อเพิ่มการทำงานในตอน build
จากนั้นเลือกเมนู Excute shell และใส่โค้ดไปว่า

phpunit --log-junit test/results/phpunit.xml test/test_calculate.php

ส่วนของ test/results/phpunit.xml จะเป็น path ที่เก็บไฟล์ report, ส่วน test/test_calculate.php คือไฟล์ที่ใช้ทดสอบ
ดังนั้นใครไฟล์ทดสอบไว้อย่างไร ก็แก้กันตามนั้นส่วนไฟล์ report ก็แล้วแต่จะตั้งนะ

ต่อมา ในส่วนของ Post-build Actions ให้กดปุ่ม Add post-build action เพื่อเพิ่มการทำงานหลัง build เสร็จ
จากนั้นเลือกเมนู Publish JUnit test result report และใส่ที่อยู่ของ report เมื่อสักครู่เข้าไป

test/results/phpunit.xml

(มันจะแจ้งตัวอักษรแดงๆ ว่าไม่พบไฟล์ก็ปล่อยมันไป)

หลังจากนั้นให้ลองกดปุ่ม Build ดู และให้กดไปที่รายการที่ Build ครั้งล่าสุด

ให้เลือกเมนู Test Result ก็จะพบผลการทดสอบที่แยก Function การทำงานพร้อม Progress Bar บอกผลด้วยว่า ผ่าน/ไม่ผ่าน กี่ Function

ในหน้าของ History ก็จะบอกประวัติของการพบข้อผิดพลาดว่ามากขึ้นหรือลดลง

เมื่อไปดูหน้าของ Project ก็จะมี Trend การพบข้อผิดพลาด

สรุป

หลังจากไดทำ Unit Test และไปให้ Jenkins เป็นตัวรันทดสอบให้อัตโนมัติทุกครั้งที่ Commit Code คราวนี้เราก็สบายใจได้แล้วว่า ทุกครั้งที่ทำงานและนำโค้ดขึ้น Git เราจะมีโค้ดที่สามารถทำงานได้ เราได้เริ่มต้นเข้าสู่ Continuous Integration ด้วย Unit Test แล้ววว

ในบล็อกตอนหน้า ผมจะนำโค้ดที่ใช้งานได้บน Git เข้าสู่ Production Server เพื่อลองทำ Continuous Deployment กันครับ

 

เว็บอ้างอิง

ซี่รี่ “เริ่มต้นทำ CI/CD”