นี่คือบทความแรกในซีรีย์ การทำ Acceptance test ด้วย Codeception โดยมีทั้งหมดสามตอน ดังนี้

ตอนที่ 2

ตอนที่ 3
หลังจากที่เราผ่าน “เรื่องยาก” อย่างการใช้ PHPUnit เพื่อใช้ทดสอบ CodeIgniter ไปแล้ว
คราวนี้มาถึงส่วนที่ทำให้เราสนุก (พี่หวังไว้แบบนั้น) กับการ test กับบ้างแล้ว

มาเริ่มกันเลย

Installing Project

ให้ทำการ clone project จาก https://github.com/himaeng/citest.git โดยใช้คำสั่งต่อไปนี้

โดยให้ทำการ clone ไว้ในตำแหน่งของ server ของตัวเอง

 

Installing and Configuring Codeception

CodeCeption คืออะไร

Codeception คือเฟรมเวิร์คสำหรับทดสอบ PHP ซึ่งเปิดให้เราทำการทดสอบระบบได้ถึงสามระดับ คือ Acceptance/Integration Test, Functional Test, และ Unit Test (ตัวนี้เราจะใช้ PHPUnit แทน) สำหรับบทความนี้ เราจะเน้นไปที่การทำ Acceptance Test (เป็นการเทสต์ก่อนส่งถึงมือ user) เท่านั้น (และระบบของเราต่อจากนี้ไปจะทำแค่ acceptance test เท่านั้น หากสนุก เราจึงค่อยขยายไปยัง unit test และ functional test ต่อ)

Installing Codeception

ดาวน์โหลด codeception เวอร์ชั่นล่าสุดจาก http://codeception.com/codecept.phar แล้วให้นำไฟล์ codecept.phar ไปวางไว้ยัง root project
CITest/
└── codecept.phar

Initializing Codeception

Codeception จะมี template เตรียมไว้เป็นต้นแบบให้เราทำงานได้สะดวกขึ้น โดยให้ทำการรันคอมมานด์ดังต่อไปนี้ ในตำแหน่ง Root project (ในที่นี้คือ CITest/)

สำหรับ Windows user ให้รัน คำสั่งดังนี้

หลังจากรันคำสั่งดังกล่าวไปแล้ว codecept จะทำการสร้างไฟล์ โฟลเดอร์เทสต์ขึ้นมา ดังนี้

 

Configuring Integration Tests

ให้เข้าไปที่ไฟล์ CITest/tests/acceptance.suite.yml แก้ดังนี้

บรรทัด url ให้เราใส่ url สำหรับใช้ run โปรแกรม citest ในเครื่องเรา (ในกรณีของผู้เขียนคือ http://localhost/citest)

 

เริ่มเขียน test

มาตรฐานการเขียน test ใน Codeception

เวลาเราจะเขียน acceptance test ใน Codeception ให้เราปฏิบัติตัวดังต่อไปนี้

  1. ไฟล์เทสต์ทุกตัวจะต้องลงท้ายด้วย Cept.php
  2. Code test จะต้องเริ่มต้นด้วย
  3. ชื่อของ test จะเขียนอยู่ใน $I->wantTo() โดยเราจะต้องเขียนชื่อที่บอกถึงฟีเจอร์ใหญ่ที่เทสต์นั้นๆ ต้องการทดสอบ
  4. ไฟล์ Acceptance/Integration Test จะวางไว้ในโฟลเดอร์ tests/acceptance/

เขียน Test แรกกัน!

เมื่อเรารู้มาตรฐานการเขียน test ของ Codeception แล้ว ก็ได้เวลาเขียน  test ตัวแรกเลย

CITest/tests/acceptance/HomeCept.php

จาก Code ข้างต้น หากอ่านดีๆ เราจะเห็นได้อย่างง่ายๆ เลยว่า code นี้ทำการทดสอบอะไร
หากสังเกตให้ดี test ตัวนี้เราจะลงท้ายด้วย Cept.php (HomeCept.php) จากนั้นเริ่มต้น test ด้วย $I = new AcceptanceTester($scenario); เพื่อเป็นการ initial object ที่ชื่อว่า $I

จากนั้นก็ตั้งชื่อ (หรือบอกจุดประสงค์) ของเทสต์ตัวนี้ (ซึ่งในที่นี้ก็คือ “เพื่อความมั่นใจว่า หน้า Home page ทำงานได้เป็นปรกติ”) ในบรรทั $I->wantTo(); ตัวฟังก์ชั่น amOnPage จะเป็นการเข้าไปยัง path บนระบบของเรา (ในที่นี้คือ ระบบ http://localhost/citest) ส่วนฟังก์ชั่น see ใช้เพื่อเช็คว่า เรา “เห็น” คำว่า Home อยู่บนหน้าดังกล่าวหรือเปล่า

 

Running test

Running Codeception

เปิด Terminal (Windows user ให้เปิด CMD) แล้วรัน command ดังต่อไปนี้เพื่อรันเทสต์ทั้งหมด

สำหรับ Windows user ให้รันดังนี้

เมื่อรันแล้วหากไม่มีอะไรผิดพลาด Terminal จะโชว์ข้อมูลดังนี้

จะเห็นว่า Codeception จะมีการแบ่งการรันออกเป็น 3 test คือ Acceptance, Functional, Unit โดยในที่นี้ Functional Test และ Unit Test จะไม่มีเลย

หากเราอยากรันแต่ acceptance ให้เรารันด้วยคำสั่งต่อไปนี้

เตรียม Database Fixtures เพื่อใช้เป็น Data สำหรับเทสต์

การทำ Acceptance Test นั้นคือการทดสอบทั้งระบบ ซึ่งแน่นอนว่าจะต้องมี Database เข้ามาเกี่ยวข้องด้วย ดังนั้น เราจึงจำเป็นต้องมีการเตรียมชุดข้อมูลเฉพาะไว้เพื่อการทดสอบ โดยภาษาในวงการเขาเรียกกันว่าเป็น Fixture ตัว Codeception จะเตรียมฟังก์ชั่นสำหรับการนำเข้า SQL dump file ในตอนเทสต์ไว้ให้ด้วย แต่ในที่นี้ เราจะใช้วิธี Migration และ Seed ข้อมูลสำหรับเทสต์ (ซึ่งเป็น Code เก่าที่เราเคยใช้ไปตอนฝึกเขียนเทสต์ก่อนหน้านี้) อีกประการ เรายังไม่มี SQL dump file (แต่สำหรับงานจริงเราจะใช้ dump file)

โดยตัว Fixture นั้น จะอยู่ใน DbFixture ใน Controller โดยเราจะรัน code ชุดนี้ทุกครั้งก่อนรันเทสต์ โดยตัว code จะมีรายละเอียดดังนี้

application/controllers/DbFixture.php

Code ข้างต้นจะมีการเช็คให้มั่นใจว่า การรันโค้ดต้องรันจาก CLI (หรือ command line) เท่านั้น ส่วนฟังก์ชั่น all() จะเป็นการรัน migrate ฟังก์ชั่น และ seed ฟังก์ชั่น ซึ่งจะเป็นรัน code ทุกไฟล์ที่ลงท้ายด้วย Seeder.php ที่อยู่ภายในโฟลเดอร์ application/database/seeder/ ทั้งหมด นั่นเอง

เริ่มเขียน test ที่สอง

เราจะเริ่มต้นเขียนเทสต์ตัวที่สอง แบบเดียวกับ HomeCept.php แต่คราวนี้จะไปทดสอบที่หน้า /news แล้วตรวจสอบผลลัพธ์โดยใช้ฟังก์ชั่น $I->see() กับ $I->seeInTitle()

ให้สร้างไฟล์  tests/acceptance/NewsCept.php แล้วเขียนเทสต์ดังนี้

เพิ่ม Database Fixtures

ก่อนจะเขียน test ต่อไป จะต้องทำการเตรียมฐานข้อมูลของเราเสียก่อน ซึ่งเราได้จัดทำไว้เรียบร้อยแล้วใน DbFixture โดยเราจะนำไปวางไว้ในฟังก์ชั่นที่ชื่อว่า system() และวางไว้เหนือสุดของ code

tests/acceptance/NewsCept.php

 

ทดสอบเนื้อหาใน index page ของ news controller

ฟังก์ชั่น amGoingTo จะเป็นตัวแยกเทสต์ย่อยภายในเทสต์ใหญ่ โดย wantTo() จะเป็นตัวกำหนดชื่อเทสต์ใหญ่ (ประมาณฟีเจอร์) โดย amGoingTo() จะเป็นการทดสอบย่อยๆ ภายในฟีเจอร์นั้นๆ นั่นแปลว่า ในแต่ละ wantTo() หรือแต่ละฟีเจอร์ จะประกอบไปด้วยการทดสอบย่อย หรือ amGoingTo() หลายชุด

การทดสอบตัวนี้จะเริ่มด้วยการเข้าไปที่หน้า /news (หรือเต็มๆ ว่า http://localhost/citest/news/index) ด้วยคำสั่ง

จากนั้นจะเป็นการทำ assertion (ตรวจสอบความถูกต้อง) ของหน้า news index ล้วน

เริ่มจาก

เป็นการตรวจสอบว่า หน้า news index ต้องมีคำว่า News archive และ News test ปรากฎบน page index ตามลำดับ

ต่อมาจะเป็นการตรวจสอบที่ดูประหลาดหน่อย

มันคือการตรวจสอบว่า ในหน้า news index นั้นจะต้องมีคำว่า News text ปรากฎอยู่ และคำดังกล่าวถูกตกแต่งด้วย css ที่มี class ชื่อว่า main

จากนั้นจะเป็นการตรวจสอบว่าใน title ของเพจว่า มีคำที่เราต้องการหรือไม่

หากสนใจ สามารถเข้าไปดูฟังก์ชั่นสำหรับการทำ assertion ของ codeception เพิ่มเติมได้ที่ Codeception’s assertion document

 

เทสต์เนื้อหาใน page เพิ่มเติม

ฟังก์ชั่นใหม่ที่เขียนไว้ตรงนี้คือ dontSeeInTitle() ซึ่งน่าจะพอเดาได้ว่า มันเป็นการตรวจสอบว่า จะต้องไม่เจอคำว่า CodeIgniter Tutorial ใน title ของเพจที่เรากำลังตรวจสอบ นั่นเอง

 

เทสต์การกรอก Form

Codeception สามารถทำการกอรกแบบฟอร์ม รวมทั้ง submit ฟอร์มในการทำเทสต์ได้ด้วย โดยเราจะใช้ฟังก์ชั่น $I->fillField() ในการกรอกแบบฟอร์ม และใช้ฟังก์ชั่น $I->click() ในการกดปุ่ม submit

ให้ทำการเขียนเทสต์สำหรับการ create news ดังนี้

เพื่อความกระจ่าง เรากลับไปดู code ในหน้า view create กันก่อน

สังเกตมั๊ยครับว่า ในส่วนของฟังก์ชั่น fillField() จะมีการกรอกสอง argument โดย argument แรกจะเป็นชื่อของ  field ที่เราจะกรอก อย่างในตัวอย่างข้างต้นจะมีการกรอกข้อความลงไปใน input ที่มี attribute name ว่า title และ textarea ที่มี name ว่าเป็น text

ดังนั้นเวลากรอกฟอร์มโดยใช้ฟังก์ชั่น fillField() จะอ้างถึง title และ name ตามลำดับ

ส่วน argument ที่สองของ fillField() คือสิ่งที่เราจะกรอกเข้าไปใน component นั้นๆ

ส่วนฟังก์ชั่น click(‘Create news item’) คือคลิกไปบนปุ่มที่มี value (หรือ label บนหน้าปุ่ม)

ส่วน $I->see(‘Successfully created’) คือ คือการตรวจสอบว่า ระบบจะเห็นคำดังกล่าว หลังจาก submit form หรือไม่ เพราะหลังจาก submit form แล้ว จะไปที่หน้า success.php

หากต้องการศึกษาเรื่องการ test form ของ Codeception เพิ่มเติม สามารถเข้าไปดูได้ที่ Codeception’s Form assertion document

เทสต์สองตัวสุดท้าย

เป็นการทดสอบเพื่อกลับไปที่หน้า index อีกครั้งเพื่อทดสอบว่า เมื่อมีการ insert  news เข้าไปใหม่หนึ่ง record แล้ว บนหน้า index จะต้องแสดงผลข้อมูลที่เพิ่งกรอกเข้าไป

ส่วน test ตัวสุดท้ายคือการลองกรอกฟอร์มแบบผิดๆ แล้วดูว่า ตัว validate จะปรากฎขึ้นมาหรือไม่

ต่อไปนี้คือ code ของ NewsCept.php ทั้งหมด

ให้ทำการรัน code ด้วย command ดังนี้

โดย command ข้างต้น คือ การรัน acceptance test แต่เพียงอย่างเดียว ซึ่งจะทำให้ terminal แสดงผลแต่ส่วนของ acceptance test เพียงอย่างเดียว

เป็นอันจบการทดสอบด้วย Codeception ขั้นต้นแล้วนะครับ

บทความต่อไปจะเป็นการ setup ให้ Codeception รันบน chrome โดยจะมีการเปิด page และกรอกข้อมูลให้เห็นแบบสดๆ ซึ่งสามารถไปดูกันได้ที่ Codeigniter Acceptance Testing with Codeception ตอน 2

3 COMMENTS