[Tips] Using PHPUnit and PsySH to debug on the fly

Spread the love

Dẫn nhập

Khi sử dụng PHPUnit để thực hiện Unit test đôi khi cúng ta thực hiện kiểu

@@ -40,7 +40,7 @@ class Example extends REST_Controller {
         ];

         $id = $this->get('id');
-
+var_dump($id); exit;
         // If the id parameter doesn't exist return all the users

         if ($id === NULL)

Và khi chạy PHPUnit thì ta sẽ có kết quả var_dump của $id

$ ../../vendor/bin/phpunit controllers/Uri_test.php 
PHPUnit 4.7.7 by Sebastian Bergmann and contributors.

......string(1) "1"

Tuy nhiên cách này lại không được khuyến khích lắm vì chúng ta chỉ xem được gía trị của một biến duy nhất trong ngữ cảnh.

Cài đặt PsySh để giúp debug inline dễ dàng hơn

Mở file composer.json của dự án lên, chúng ta sẽ thêm vào package psysh/psysh ở phần require-dev như bên dưới

    "require": {
        ...
        "psy/psysh": "0.5.*"
        ...
    },

Chạy câu lệnh composer update để cập nhật package mới.
Ở trên mình đang dùng bảng 0.5.* nhưng hiện tại đã có các bảng 0.7.* dành cho PHP 7 trở lên.

Thực hiện debug

Ok, giờ chúng ta sẽ bắt đầu debug, thay vì thực hiện var_dump hay exit() thì chúng ta có thể chèn câu lệnh eval(\Psy\sh()) để có thể tạo break point khi chạy phpunit. Ví dụ mình thêm 1 đoạn eval vào bên dưới

// AAAController.php
            $val->add_field("point", '', "numeric_min[0.1]|numeric_max[1000]");

            eval(\Psy\sh());
            if (! $val->run() || !empty($data['valid_errors'])) 

Khi thực hiện chạy PHPUnit, mình sẽ có breakpoint dừng ở ngay câu lệnh eval()

root@c2c0af29eddc:/home/project/xxxx/webapp# php oil test --group=test
Tests Running...This may take a few moments.
PHPUnit 3.7.38 by Sebastian Bergmann.

Configuration read from /home/project/xxxx/webapp/fuel/app/phpunit.xml

Psy Shell v0.5.2 (PHP 5.6.36 — cli) by Justin Hileman

Chúng ta có thể thấy, chương trình đã dừng lại ở chỗ breakpoint và chúng ta hoàn toàn có thể xem các biến ở xung quanh chạy như thế nào : )

Psy Shell v0.5.2 (PHP 5.6.36 — cli) by Justin Hileman
$val
=> Ns\Validation {#160}
Input::get()
=> []

Chúng ta cũng có thể lấy danh sách các biến số hiện tại thông qua lệnh ls

>>> ls
Variables: $count, $arr, $auth, $id, $post_personal, $pre_personal, $this, $val

Hoặc lấy tên class của object hiện tại

>>>get_class($this)
=> "Controller_Example"

Các public properties của object đó nữa

>>>ls -p $this
Class Properties: $config, $request, $response_status, $template

Hoặc public method

>>> Class Methods: __construct, login, logout

Hoặc chúng ta có thể xem PHPDoc luôn

doc $this
class XXXX extends Parent_Class

PHP manual not found
    To document core PHP functionality, download the PHP reference manual:
    https://github.com/bobthecow/psysh#downloading-the-manua

Cuối cùng bạn có thể gõ help để xem list tất cả các command mà PsySh hỗ trợ

help
  help       Show a list of commands. Type `help [foo]` for information about [foo].      Aliases: ?
  ls         List local, instance or class variables, methods and constants.              Aliases: list, dir
  dump       Dump an object or primitive.
  doc        Read the documentation for an object, class, constant, method or property.   Aliases: rtfm, man
  show       Show the code for an object, class, constant, method or property.
  wtf        Show the backtrace of the most recent exception.                             Aliases: last-exception, wtf?
  whereami   Show where you are in the code.
  throw-up   Throw an exception out of the Psy Shell.
  trace      Show the current call stack.
  buffer     Show (or clear) the contents of the code input buffer.                       Aliases: buf
  clear      Clear the Psy Shell screen.
  history    Show the Psy Shell history.                                                  Aliases: hist
  exit       End the current session and return to caller.                                Aliases: quit, q

Thật tuyệt vời phải không.
Có PsySH chúng ta có thể thoải mái debug code của mình mà không cần phải thông qua var_dump hay dd như trong Laravel nữa.

TL;DR

PsySH là một công cụ RPEL cực kì tiện ích trong việc debug cũng như tương tác với chương trình của bạn thông qua CLI, qua đó có thể tự động hoá được khá là nhiều step, giúp chúng ta thực hiện test hệ thống nhanh và đáng tin cậy hơn

Leave a Reply

Your email address will not be published. Required fields are marked *