PHP Unit מדריך לבדיקות PHP

הסבר מהיר ויעיל על שימוש ב-phpUnit לבדיקות.

לחובבי הת'כלס: כל הקוד שאני מדבר עליו פה נמצא ב-GitHub.

אחד מהדברים החשובים ביותר שלמדתי בשנים האחרונות, כאשר אני עוסק בסביבת enterprise הוא להקפיד על בדיקות אוטומטיות לרוב הדברים שאני כותב. נכון, לא לכל איזה תוסף מטופש שאני כותב צריך להצמיד בדיקה אוטומטית. אבל אם אני כותב קוד ש:

  1. מישהו אחר חוץ ממני ישתמש בו
  2. אני אשתמש בו בעתיד באיזשהו זמן לא ידוע
  3. מהווה רכיב מרכזי בלא מעט מרכיבים אחרים

אני אטרח לכתוב כמה בדיקות אוטומטיות. למה? כי הן פשוטות. כי הן מאפשרות לכל מי שמשנה את הסקריפט שלי לוודא שהוא לא שובר פונקציונליות אחרת בטעות. כי הן מאפשרות לכל מפתח להבין בדיוק מה הסקריםט עושה ומה ה-output\input. מהניסיון שלי – התממשקות מול קוד שיש לו בדיקות פשוטה הרבה יותר מהתממשקות ושינוי של קוד שאין לו בדיקות.

למרות שאפשר ליצור בדיקות ב-PHP כמעט בכל כלי, אחד הכלים הפופולריים ביותר הוא phpunit – כלי שמאוד פשוט להשתמש בו ונפוץ בכמעט כל פרויקט קוד פתוח שקיים היום.

ההתקנה שלו היא פשוטה ביותר אם אתם משתמשים בלינוקס. אם אתם מפתחים על סביבה אחרת כמו LAMP או חלונות רחמנא ליצלן – אולי כדאי שתשקלו להתקין שרת פיתוח על VM אצלכם בחלונות. אני עובד ככה גם בבית וזה מאוד נוח. בכל מקרה, אני מסביר על לינוקס.

איך מתקינים?



sudo apt-get install phpunit


איך בודקים שההתקנה עברה בשלום? פשוט מקלידים phpunit. רץ? מעולה.

אם אתם רוצים לצלול ישר למערכת קיימת שמשתמשת ב-php unit, אפשר לעשות Checkout לגרסת הפיתוח של וורדפרס שמשתמשת בספרית הבדיקות הזו ולהריץ את הבדיקות מייד. מאוד פשוט, נעים ונחמד.

אם אתם רוצים לכתוב בדיקה מאפס כדי להבין 'בקטן' איך עובדים עם phpunit, תשארו איתי 🙂

בואו ונכתוב סקריפט פשוט שבפשוטים. אובייקט שמקבל טקסט ומחזיר אותו הפוך. משהו בסגנון הזה



<?php

namespace FlipText;
/**
 * Class FlipText
 * @package FlipText
 */
class FlipText {
    /**
     * @var null
     */
    private $text = null;

    /**
     * @param $text
     */
    function __construct($text) {
        if(!empty($text)) {
            $this->text = $this->text_convert($text);
            return $this->text;
        } else {
            return null;
        }
    }

    /**
     * @return null|string
     */
    public function getText() {
        return $this->text;
    }

    /**
     * @param $text
     * @return string
     */
    private function text_convert($text) {
        return strrev ($text);
    }
} 


ה-class החביב והמאוד מאוד פשוט הזה מופעל על ידי הקוד הבא:


<?php
require_once('flipText.php');

$obj = new FlipText\FlipText('Hello World!');
print $obj->getText();

בואו ונכתוב בדיקה לקוד המאוד פשוט הזה ונריץ אותו עם phpunit. ראשית ניצור תיקיה ושמה הוא test ובתוכה נכניס את הבדיקה הראשונה שלנו. אפשר לקרוא לקובץ איך שרוצים רק עם סיומת Test בסוף ואנו נקרא לו flipTextTest.php. בתוך הקובץ הזה יש class שיורש מתוך class של phpUnit ובתוכו יש מתודות פומביות, כל מתודה זו בדיקה. הבדיקה הראשונה שלנו היא פשוטה למדי – אנו מוודאים שהאובייקט עובד כמו שאנחנו רוצים שהוא יעבוד:


require_once('../flipText.php');

class FlipTextTest extends PHPUnit_Framework_TestCase {
    public function testFlipTextCreation() {
        $obj = new FlipText('test');
        $this->assertEquals('tset', $obj->getText());
    }
}

אין כאן איזה גליק גדול. שימו לב למתודה assertEquals. לא צריך להיות מדען טילים כדי להבין שמדובר בבדיקה אם הביטוי tset שווה למה שאני מקווה לקבל מהאובייקט שלי אם אני מכניס לתוכו test.

ועכשיו, להרצה הגדולה. איך מריצים? נכנסים לתוך התיקיה שלנו וכותבים:


phpunit flipTextTest.php

מיד נקבל את הפלט הזה:

בדיקה אחת הצליחה
בדיקה אחת הצליחה

זה מראה לנו שהבדיקה הצליחה. בואו ונכתוב עוד בדיקה!


    public function testFlipTextEmpty() {
        $obj = new FlipText('');
        $this->assertEquals(null, $obj->getText());
    }

הבדיקה הזו למשל בודקת אם כשאני מכניס מחרוזת ריקה, אני מקבל null, כשאריץ את phpunit, אני אראה שגם הבדיקה הזו הצליחה.

בגדול… זהו! יש עוד המון דברים שאפשר לעשות עם phpUnit כמובן, ואני אדבר על כך במדריכים אחרים – אבל זה הבסיס והבסיס הוא טוב. יכול להיות שבדיקות יראו לכם כמו צורך מטופש ו-overkill, יכול להיות שבחלק מהמקרים אתם צודקים. אבל בפרויקטים שהם טיפה ארוכי טווח כל השקעה של דקה בבדיקות יכולה לגרום לכם להזיע הרבה פחות כשתצטרכו לעשות שינויים בקוד ולא תצטרכו לחשוש לשבור משהו בטעות למישהו אחר.

פוסטים נוספים שכדאי לקרוא

רספברי פיי

מה זה AIoT? ואיך אפשר להתחיל?

פוסט עם המון קישורים, מידע, סרטונים ופרק בפודקאסט שיפתח לכם שער לעולם ה-AIoT המרתק.

גלילה לראש העמוד