2012-05-09 36 views
32

Tôi tự hỏi về "chế độ nghiêm ngặt trong PHPUnit" là gì?Chế độ nghiêm ngặt của PHPUnit làm gì?

ví dụ:

phpunit --strict 

hoặc trong phpunit.xml

<phpunit strict="true"> 

tôi chuyển nó vào chỉ để thử nó và thử nghiệm của tôi bắt đầu thất bại với

PHP_Invoker_TimeoutException: Execution aborted after 1 second 

Trả lời

19

Câu trả lời ngắn: cho các bài kiểm tra chạy dài sử dụng chú thích để tăng thời gian chạy cho phép:

@large // 10 seconds 
@medium // 5 seconds 
@small // 1 second max <-- Default, so no point using 

dài trả lời:

Dưới đây là một bộ cập nhật thông tin đó được bắt nguồn với sự giúp đỡ của @Crozin.

Trong trường hợp của tôi, lỗi là một thử nghiệm mất quá nhiều thời gian (> 1 giây.) (Doctrine ORM lược đồ thả + tạo có thể làm chậm mọi thứ xuống, see this ZendCast for what I was doing). Điều này đã gây ra một vấn đề (và một số đầu ra) từ PHP_Invoker. Chế độ nghiêm ngặt không cho phép bất kỳ đầu ra nào.

Bằng cách đọc/kỹ thuật đảo ngược /usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize() (và getGroups() trên cùng một lớp) .. Tôi đã tìm ra ở đó là 3 chú thích không có giấy tờ mà chúng tôi có thể sử dụng:

@large // 10 seconds 
@medium // 5 seconds 
@small // 1 second max run time 

Chúng có thể được chỉ định ở cấp lớp hoặc cấp độ phương pháp. Issue #490 on the PHPUnit github gợi ý về các vấn đề với việc cung cấp cả cấp lớp và cấp phương thức để YMMV nếu bạn trộn chúng. Như crozin cho biết, thời gian quy định là 10,5,1 giây tương ứng.

Giải pháp thay thế là tăng khoảng thời gian chức năng gọi được phép chạy (trên máy tính chậm).

sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php 

Increase line 1 "declare(ticks = 1);" to 
    "declare(ticks = 10);" // or any higher int that meets your needs 

Đây là một loạt các thông tin về chế độ nghiêm ngặt đã giúp tôi tìm ra giải pháp:

PHP_Invoker
Một lớp tiện ích cho cách gọi callables với một thời gian chờ. Gói này là bắt buộc để thực thi thời gian chờ kiểm tra ở chế độ nghiêm ngặt. [PHPUnit Install Instructions]

nghiêm ngặt chế độ thử nghiệm mà không khẳng định bất cứ điều gì được đánh dấu là không đầy đủ thử nghiệm mà chưa hoàn tất (hoặc bỏ qua) mang lại không có bảo hiểm mã Slideshare by Sebastian Bergmann (slide 10)

Note
Xin lưu ý rằng PHPUnit nuốt tất cả các đầu ra đó là phát ra trong quá trình thực hiện kiểm tra. Trong chế độ nghiêm ngặt, kiểm tra phát ra đầu ra sẽ không thành công. Testing output section of PHPUnit Manual

+5

Thay đổi thời gian cho phép đối với các bài kiểm tra bạn cũng có trong tệp phpunit.xml như được mô tả ở đây http://stackoverflow.com/a/13722524/1387163 –

31

Xin lưu ý PHPUnit nuốt tất cả các đầu ra được phát ra trong quá trình thực hiện kiểm tra . Trong chế độ nghiêm ngặt, kiểm tra phát ra đầu ra sẽ không thành công.

Đó là tất cả tôi có thể tìm thấy trong tài liệu hướng dẫn, nhưng tôi cũng muốn kiểm tra các nguồn khác nhau và tôi thấy rằng trong chế độ nghiêm ngặt:

  1. Các xét nghiệm không có khẳng định có thể được đánh dấu là không đầy đủ/thất bại.
  2. Mỗi thử nghiệm có thể chạy với giới hạn thời gian thực hiện tùy thuộc vào kích thước của nó và sự hiện diện của pcntl extensionPHP_Invoker library. Có ba giá trị timeout:

    • timeoutForSmallTests (giá trị mặc định: 1)
    • (giá trị mặc định: 10) timeoutForMediumTests
    • timeoutForLargeTests (giá trị mặc định: 60)

    Kích thước kiểm tra (nhỏ , trung bình hoặc lớn) được xác định theo phương pháp PHPUnit_Util_Test::getSize():

    • Trường hợp kiểm tra hậu duệ ng từ PHPUnit_Extensions_Database_TestCase hoặc PHPUnit_Extensions_SeleniumTestCase lớn.
    • Các trường hợp kiểm tra và thử nghiệm cá nhân cũng có thể được thực hiện lớn hoặc trung bình bằng cách thêm chúng vào lần lượt 'lớn' hoặc 'medum' groups.
    • Nếu không, thử nghiệm nhỏ.

Đó là dường như chế độ nghiêm ngặt không chỉ có ba thay đổi trên, nhưng tôi không hoàn toàn chắc chắn về điều đó. Tôi chưa bao giờ nghiên cứu các nguồn PHPUnit trước đây, cũng như không sử dụng chế độ nghiêm ngặt.

+1

+1: Cảm ơn bạn đã tìm hiểu chi tiết, được đánh giá cao. – hakre

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