Testing with Database

บทความนี้เป็นบทความที่สามใน Series การทำ Acceptance Test ใน CodeIgniter ซึ่งตอนนี้มี 3 ตอนแล้ว โดยผู้อ่านสามารถย้อนกลับไปอ่านสองตอนก่อนหน้าได้ที่
ตอนที่ 1
ตอนที่ 2
ตอนที่สามนี้ จะเป็นเรื่องว่าด้วยการทดสอบกับ ฐานข้อมูลทั้งหมด โดยหัวข้อจะมีดังนี้

  1. Setup Db module for Codeception
  2. Create DB test

Setup Db module for Codeception

งานนี้เราจะเราจะทำการ config ให้ Codeception สามารถใช้งาน SQL dump file หรือไฟล์ sql ที่ export จาก database ตรงๆ ซึ่งช่วยอำนวยความสะดวกในการเตรียมข้อมูลสำหรับทดสอบโดยสามารถเอาข้อมูลจากฐานข้อมูลที่มีอยู่ตรงๆ ได้เลย โดยไม่ต้องเขียน seeder หรือ fixture ขึ้นมาเอง
หมายเหตุ: สำหรับการทดสอบในบทความนี้จะใช้ sqlite เป็นหลัก ซึ่งเมื่อเปลี่ยนไปใช้ mysql หรือ Postgres ก็คงไม่ต่างกันมากนัก เปลี่ยนแค่ connection หรือ dsn ก็เพียงพอแล้ว

  1. เปิดไฟล์ codeception.yml ขึ้น ซึ่งไฟล์ดังกล่าวอยู่ใน root project folder

CITest/
└── codeception.yml

โดยให้เขียน Code ดังนี้ (เปลี่ยนเฉพาะตรงส่วนที่ไฮไลท์สีเหลืองไว้)

จาก code ข้างต้น เราเปลี่ยนเพียงแค่ dsn หรือ connection string ของ DB ซึ่งในที่นี้เราใช้ sqlite ที่ connection จะทำโดยการ connect ผ่านไฟล์ sqlite-database.db

Note: หากเป็นกรณีของ mysql ให้เปลี่ยนตัว dsn ให้เป็น 

ส่วน dump นั้นคือ ไฟล์ dump สำหรับสร้างฐานข้อมูลในการทดสอบ โดย Codeception นั้นจะมองหา dump file ใน folder tests/_data โดย default ดังนั้น ให้เราสร้างไฟล์ที่ชื่อ news.sql ในโฟลเดอร์ดังกล่าว ซึ่งมีเนื้อหาดังนี้

CITest/tests/_data/news.sql

ซึ่งไฟล์ดังกล่าว จะสามารถสร้างขึ้นมาได้เองโดยการ export จาก sqlite browser (ซึ่งหากผู้อ่านอยากลองก็จัดไปครับ)

จากนั้นให้ทำการ enable module Db ใน test ที่เรากำลังทำการทดสอบอยู่ด้วย (ซึ่งในที่นี้คือ Acceptance test) โดยให้เปิด CITest/tests/acceptance.suite.yml ขึ้นมา แล้วแทรก code เข้าไปหนึ่งบรรทัด ดังนี้

CITest/tests/acceptance.suite.yml

ในสองบทความก่อนหน้าเรา seed ข้อมูลผ่านการใช้ code php สองไฟล์ที่เรียกว่า fixture และ seeder ซึ่งเป็นอะไรที่ค่อนข้างซับซ้อน และไม่เหมาะสำหรับการทดสอบที่ต้องใช้ข้อมูลปริมาณมาก ดังนั้นให้เปิดไฟล์ CITest/tests/acceptance/NewsCept.php แล้วให้ comment ที่บรรทัดที่สาม ดังนี้

จากนั้นให้ทำการรันเทสต์

โดยเป็นการสั่งรันเทสต์ที่รันเฉพาะ acceptance เท่านั้น ส่วน –steps นั้นเป็นการสั่งให้มีการแสดงผลรายละเอียดของ step การเทสต์อย่างละเอียด (สังเกตได้จากสองบทความที่แล้ว เวลารันเทสต์จะแสดงผลเพียงแค่ feature หรือหัวข้อใหญ่ในการเทสต์เท่านั้น)

หากไม่มีอะไรผิดพลาด เทสต์จะรัน pass เมื่อเปิดข้อมูลใน file db จาก CITest/application/data/sqlite-database.db จะเห็นว่าข้อมูลใน table news จะมี record เพียงแค่สอง record โดยหนึ่ง record มาจาก dump file ส่วนอีก record มาจากการ insert ใน test

หากเราลองรันการทดสอบอีกครั้ง (ให้ปิด sqlite browser หรือโปรแกรมที่เปิดดูข้อมูลจาก sqlite เสียก่อน เพราะไม่งั้น test จะรันไม่ได้เพราะเข้าถึง db ไม่ได้) จะเห็นว่าจำนวน record ใน news จะเท่าเดิม ไม่ว่าจะรันกี่ครั้งก็ตาม

Create DB Test

ต่อไปจะทำการทดสอบ เพื่อเรียกใช้ฟีเจอร์ด้านการทดสอบทาง DB ของ Codeception

ขั้นแรกให้สร้างไฟล์ NewsWithDbCept.php ที่

CITest/
└── tests/
—-└── acceptance/
——–└── NewsWithDbCept.php

ตรวจสอบข้อมูลในฐานข้อมูลด้วยคำสั่ง seeInDatabase

จากนั้นก็เริ่มเขียน test

จะเห็นได้ว่า บรรทัดสุดท้าย มีการทดสอบโดยใช้คำสั่งว่า seeInDatabase ซึ่งเป็นการเข้าไป query ข้อมูลในฐานข้อมูล ซึ่งจาก code ข้างต้นจะเป็นการ query โดยใช้ sql statement ดังนี้

ให้ทำการรันเทสต์

ตรวจสอบข้อมูลที่ไม่มีในฐานข้อมูลด้วยคำสั่ง dontSeeInDatabase

ให้เราเพิ่ม code เข้าไปหนึ่งบรรทัดดังนี้

คำสั่ง donSeeInDatabase ก็เป็นไปตามที่เขียนนั่นคือ ต้องไม่เห็น record นี้ในฐานข้อมูลในตาราง news

 

นับจำนวน record ใน ฐานข้อมูล

ให้เราเพิ่ม code เข้าไปสองบรรทัดดังนี้

ทดสอบโดยการกรอกข้อมูลเข้าไปที่ฐานข้อมูลโดยตรง แบบไม่ผ่านหน้าฟอร์ม

ให้เขียน code เพิ่มเข้าไปดังนี้

ตรงนี้เป็นการทดสอบโดยการกรอกข้อมูลเข้าไปที่ฐานข้อมูลโดยตรง จากนั้นทดสอบความถูกต้องโดยกลับไปดูที่หน้า index ว่ามีข้อมูลนี้ปรากฎขึ้นมาหรือไม่ โดยใช้ฟังก์ชั่น haveInDatabase

ดึงข้อมูลจากฐานข้อมูลขึ้นมาตรวจสอบ

งานนี้เราจะทำการดึงข้อมูลจากฐานข้อมูลขึ้นมาตรวจสอบตรงๆ

grabFromDatabase เป็นฟังก์ชั่นสำหรับการดึงข้อมูลจากฟิลดิ์ที่ต้องการจากฐานข้อมูล โดยจากตัวอย่างข้างต้น เป็นการดึงฟิลด์ title จากตาราง news โดยดึงข้อมูลที่มีค่า slug เท่ากับ db_raw_data แล้วเอาค่าที่ได้มา assign เข้าไปใน $title

จากนั้นก็นำเอา $title ไปใช้ตรวจสอบต่อ

ต่อไปนี้คือรายละเอียด code โดยสมบูรณ์

จากนั้นให้ทำการรันเทสต์

<!– Crayon Syntax Highlighter v_2.7 acheter viagra france belgique.2_beta –>

ถือเป็นอันจบ tutorial นี้แล้วนะครับ ส่วนจะมีตอนที่ 4 ออกมาหรือไม่ก็ต้องดูความจำเป็นต่อไปครับ

3 COMMENTS

  1. […] บทความนี้เป็นบทความตอนที่สองว่าด้วยเรื่องการทำ acceptance test ใน CodeIgniter ด้วย Codeception โดยสามารถอ่านเนื้อหาตอนแรกได้จาก Codeception’s Acceptance Test with Codeception และตอนที่ 3 ได้จาก DB test with Codeception […]

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