2012-03-21 13 views
5

Đối unittestCó thể gỡ lỗi các thử nghiệm PhpUnit bằng tùy chọn --process-isolation không?

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     $a = 18; 
    } 
} 

với breakpoint trên dòng 5 "$ a = 18;",

  • Xdebug v2.1.0,
  • PHPUnit 3.6.10,
  • PHP 5.3.6 ,
  • ubuntu 10.11

Đơn vị hoạt động thử nghiệm với tùy chọn NO --process-isolation dừng thực thi tập lệnh trên dòng 5, như mong đợi. Chạy cấu hình tương tự với tùy chọn --process-cô lập không ngừng thực hiện trên dòng 5.

Tùy chọn --process-ly chạy mỗi bài kiểm tra trong quá trình sử dụng mới 'proc_open' trong hàm runJob trong https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php

Thử nghiệm với PhpStorm 3 và vim 7 với plugin trình gỡ lỗi. Nó cho phép gỡ lỗi PHPUnit chính nó, nhưng không phải testcases.

Có cách nào để gỡ lỗi quy trình con được tạo bởi PhpUnit bằng Xdebug không? có thể là Zend Debugger?

+0

Tôi không được thiết lập để gỡ lỗi trong PHP Storm hoặc VIM, vì vậy bạn sẽ phải dùng thử. Nếu bạn bằng cách nào đó có thể có các biến môi trường thoát, bạn có thể kích hoạt Xdebug hoặc ZendDebugger với những biến đó. Ví dụ Zend QUERY_STRING = "start_debug = 1 & debug_host = 10.1.1.17 & no_remote = 1 & debug_port = 10000 & debug_stop = 1"/usr/local/bin/php /var/www/test.php (http://kb.zend.com/index.php ? Xem = mục nhập & EntryID = 130). Ví dụ Xdebug xuất XDEBUG_CONFIG = "idekey = session_name" (http://xdebug.org/docs/remote). Cho tôi biết nếu nó hiệu quả. – SamHennessy

+0

@SamHennessy có, đó chính xác là cách gỡ lỗi các script CLI. Các biến môi trường đã tồn tại sau lệnh 'export' ma thuật. Nó không phải là một vấn đề để gỡ lỗi các script CLI. Như tôi đã đề cập, tôi có thể gỡ lỗi unittests khi PHPUnit chạy testcases trong cùng một luồng: 'phpunit SampleTest' hoạt động giống như một sự quyến rũ. 'Phpunit --process-isolation SampleTest' không hoạt động. Lệnh cuối cùng tạo ra 2 tiến trình: PHPUnit chính và một child cho mọi test. Tôi có thể gỡ lỗi quy trình chính chỉ, nhưng không phải là đứa trẻ, và đó là một vấn đề. –

+1

Giả định của tôi là người dùng mà PHPUnit được chạy theo sẽ là cùng một người dùng như người dùng được sử dụng trong hoạt động proc_open. Nếu đó là sự thật thì nó sẽ kích hoạt một phiên gỡ lỗi bổ sung. Tôi không biết liệu VIM hay PHP Storm có thể hỗ trợ nhiều phiên gỡ lỗi hay không. Bạn có thể cần phải đặt các vv env trong hồ sơ của bạn để làm cho nó hoạt động. – SamHennessy

Trả lời

2

Đi vào Cài đặt Project PHPStorm - PHP - Debug và thiết Xdebug để "lực lượng phá vỡ tại dòng đầu tiên khi kịch bản nằm ngoài dự án" ..

Nó nên phá vỡ trên một số phương pháp main() .. và nếu bạn bước qua một vài lần (hoặc bấm tiếp tục), nó sẽ đạt đến kiểm tra của bạn

+0

** Có: ** nó dừng trên dòng đầu tiên của PHPUnit. Như tôi đã nói, không có vấn đề gì để gỡ lỗi PHPUnit chính nó hoặc bằng cách sử dụng trình nghe gỡ lỗi từ xa, hoặc trình gỡ lỗi cục bộ (Shift-F9). ** Không: ** nó sẽ không đạt được kiểm tra của tôi. Nếu bạn 'bước qua' hoặc thậm chí 'bước vào' bạn không đạt đến điểm ngắt trong bài kiểm tra của mình. Debugger không 'bước vào' quy trình con được tạo bởi [proc_open] (http://php.net/manual/en/function.proc-open.php) –

1

Đây không phải là câu trả lời hoàn hảo, nhưng bạn có thể bao quanh bất kỳ khối mã nào với lệnh xdebug_start_trace() và xdebug_stop_trace() để tạo ngăn xếp theo dõi cho một khối mã được nhắm mục tiêu. Tôi đã sử dụng điều này để xem chính xác những gì nó xảy ra tại các điểm cụ thể trong các bài kiểm tra đơn vị của tôi khi kiểm tra mã của người khác.

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
    } 
} 

Chỉ cần nhớ rằng mọi lỗi sẽ khiến trình xử lý ngoại lệ của PHPUnit bước vào và khiến cho dấu vết ngăn xếp trông hơi lạ. Nếu bạn gặp lỗi, bạn có thể nhận được dấu vết rõ ràng bằng cách thêm lối ra; gọi ngay sau xdebug_stop_trace:

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
     exit; 
    } 
} 
+0

Vâng, đó là một tùy chọn, cũng như var_dump(). Có 2 vấn đề: nó đòi hỏi phải thay đổi mã cho các mục đích gỡ lỗi, và nó không tương tác như [trình gỡ lỗi trực quan] (http://www.jetbrains.com/phpstorm/features/index.html#Visual_PHP_Debugger). Cách giải quyết mà tôi sử dụng tại thời điểm này là một nhóm duy nhất được gán cho thử nghiệm để chạy phpunit cho nhóm này thực hiện kiểm tra này được thực hiện một cách riêng biệt. –

Các vấn đề liên quan