পিএইচপিউনিট দিয়ে পিএইচপি শিরোনাম পরীক্ষা করুন


99

আমি এমন কিছু ক্লাস পরীক্ষা করতে PHPunit ব্যবহার করার চেষ্টা করছি যা কিছু কাস্টম শিরোলেখকে আউটপুট করে।

সমস্যাটি হ'ল আমার মেশিনে এটি:

<?php

class HeadersTest extends PHPUnit_Framework_TestCase {

    public function testHeaders()
    {
        ob_start();

        header('Location: foo');
        $headers_list = headers_list();
        header_remove();

        ob_clean();

        $this->assertContains('Location: foo', $headers_list);
    }
}

বা এমনকি এটি:

<?php

class HeadersTest extends PHPUnit_Framework_TestCase {

    public function testHeaders()
    {
        ob_start();

        header('Location: foo');
        header_remove();

        ob_clean();
    }
}

এই ত্রুটিটি ফিরিয়ে দিন:

name@host [~/test]# phpunit --verbose HeadersTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.

E

Time: 0 seconds, Memory: 2.25Mb

There was 1 error:

1) HeadersTest::testHeaders
Cannot modify header information - headers already sent by (output started at /usr/local/lib/php/PHPUnit/Util/Printer.php:173)

/test/HeadersTest.php:9

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

এটি দেখে মনে হচ্ছে পরীক্ষার আগে টার্মিনালটিতে অন্য কোনও আউটপুট আউট রয়েছে যদিও সেখানে অন্য কোনও ফাইল অন্তর্ভুক্ত নেই এবং পিএইচপি ট্যাগ শুরুর আগে অন্য কোনও চরিত্র নেই। এটি পিএইচপুনিটের অভ্যন্তরে এমন কিছু হতে পারে যা এর কারণ করছে?

বিষয়টি কী হতে পারে?


14
এই বিষয়ে আগ্রহী অন্য কিছু লোক থাকলে কেবল এটি কভার করতে চেয়েছিলেন। পিএইচপুনিট (যা পিএইচপি সি এল আই ব্যবহার করে) চালানোর সময় শিরোনাম_লিস্ট () কাজ করে না তবে xdebug_get_headers () এর পরিবর্তে কাজ করে।
শিরোনাম

উত্তর:


124

সমস্যাটি হ'ল পিএইচপিউইনিট স্ক্রিনে একটি শিরোনাম প্রিন্ট করবে এবং সেই সময়ে আপনি আরও শিরোনাম যুক্ত করতে পারবেন না।

চারপাশের কাজটি একটি বিচ্ছিন্ন প্রক্রিয়াতে পরীক্ষা চালানো। এখানে একটি উদাহরণ

<?php

class FooTest extends PHPUnit_Framework_TestCase
{
    /**
     * @runInSeparateProcess
     */
    public function testBar()
    {
        header('Location : http://foo.com');
    }
}

এর ফলস্বরূপ:

$ phpunit FooTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 1 second, Memory: 9.00Mb

OK (1 test, 0 assertions)

কীটি হ'ল @ রুনইনসেপারাটপ্রসেস টিকা।

আপনি যদি পিএইচপিউইনাইট ~ 4.1 বা কিছু ব্যবহার করছেন এবং ত্রুটিটি পান:

PHP Fatal error:  Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in -:378
Stack trace:
#0 {main}
  thrown in - on line 378

Fatal error: Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378

Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378

Call Stack:
    0.0013     582512   1. {main}() -:0

এটি ঠিক করতে আপনার বুটস্ট্র্যাপ ফাইলটিতে এটি যুক্ত করার চেষ্টা করুন:

<?php
if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
    define('PHPUNIT_COMPOSER_INSTALL', __DIR__ . '/path/to/composer/vendors/dir/autoload.php');
}

7
এটি এখানে কিছু সংজ্ঞায়িত () বিবৃতিতে ত্রুটি সৃষ্টি করে PHPUnit_Framework_Exception: বিজ্ঞপ্তি: কনস্ট্যান্ট জাইজ ইতিমধ্যে সংজ্ঞায়িত হয়েছে
মিনহাজ

4
@ মাইবজাস এটি সম্পর্কিত নয়।
স্যামহেনেসি

4
প্রয়োগ করার সময় আমি এটি পেয়েছি:PHP Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SplFileInfo' is not allowed' in phar:///usr/local/bin/phpunit/phpunit/Util/GlobalState.php:211
t1gor

4
সমস্যাটি সমাধানের জন্য এটি অবশ্যই সেরা বিকল্প। এটি একটি মোহন মত কাজ!
xarlymg89

4
সেট হেডারের অ্যারে পেতে আমাকে xdebug_get_headers () ব্যবহার করতে হয়েছিল। headers_list () গ্লোবাল ফাংশন আমার ক্ষেত্রে কাজ করে না।
শালম স্যাম

108

যদিও পৃথক প্রক্রিয়াতে পরীক্ষা চালানো সমস্যার সমাধান করে তবে বড় আকারের পরীক্ষাগুলি চালানোর সময় একটি লক্ষ্যণীয় ওভারহেড থাকে।

আমার ফিক্সটি হ'ল পিপুনিটের আউটপুটকে স্ট্যাডারের দিকে পরিচালিত করা, যেমন:

phpunit --stderr <options>

এটির সমস্যার সমাধান করা উচিত এবং এর অর্থ হ'ল আপনাকে একটি মোড়ক ফাংশন তৈরি করতে হবে এবং আপনার কোডের সমস্ত উপস্থিতি প্রতিস্থাপন করতে হবে না।


4
উজ্জ্বল! আমার কোডে কোনও পরিবর্তন নেই, কোনও পৃথক প্রক্রিয়া নেই এবং এটি কার্যকর হয়।
আলেক্সফারনান্দেজ

তবে কী আমি এখনও ত্রুটিগুলি দেখতে পাব এবং ত্রুটি_বন্দরের (E_ALL) আউটপুট পাব ??
spankmaster79

4
@ spankmaster79 হ্যাঁ, এটি কেবল আপনার টার্মিনালের স্ট্যান্ডার্ড ত্রুটিতে যাবে। ডিফল্টরূপে, বেশিরভাগ টার্মিনালগুলি স্ট্যান্ডার্ড আউট এবং স্ট্যান্ডার্ড ত্রুটি একসাথে মুদ্রণ করবে তবে এগুলি আসলে পৃথক স্ট্রিম।
জন কেয়ার্নস

আমি তৈরি হয়ে যাচ্ছিলাম !!! এই কৌশলটির জন্য tnx, এটি অর্থবোধ করে না, ত্রুটিগুলি স্ট্যাডারকে জানাতে হবে !!! Tnx
th3n3rd

42
stderr="true"কয়েকটি কী-স্ট্রোক সংরক্ষণ করতে আপনি আপনার phpunit.xML এ যুক্ত করতে পারেন ।
tszming

10

একদিকে যেমন: আমার জন্য headers_list()0 টি উপাদান ফিরতে থাকে। আমি প্রশ্নটিতে @ টিটেলের মন্তব্য লক্ষ্য করেছিলাম এবং অনুভব করেছি যে এটি এখানে বিশেষ উল্লেখের যোগ্য:

এই বিষয়ে আগ্রহী আরও কিছু লোক থাকলে কেবল এটি কভার করতে চেয়েছিলেন। headers_list()পিএইচপুনিট (যা পিএইচপি সি এল আই ব্যবহার করে) চালানোর সময় কাজ করে না তবে xdebug_get_headers()পরিবর্তে কাজ করে।

এইচটিএইচ


4

ইতিমধ্যে একটি মন্তব্যে উল্লিখিত হিসাবে, আমি মনে করি এটি এক্সএমএল কনফিগারেশন ফাইলটিতে প্রক্রিয়া বিচ্ছিন্নতার সংজ্ঞা দেওয়ার জন্য আরও ভাল সমাধান

     <?xml version="1.0" encoding="UTF-8"?>
     <phpunit
        processIsolation            = "true"
        // ... 
     >
     </phpunit>

এটির মতো, আপনাকে - স্টাডার বিকল্পটি পাস করতে হবে না, যা আপনার সহকর্মীদের বিরক্ত করতে পারে।


4
এটির প্রয়োজন কেবল পরীক্ষার জন্য এটি সংজ্ঞায়িত করা আরও ভাল। সমস্ত পরীক্ষার জন্য এটি সেট করা পরীক্ষাগুলি চালানোকে ধীর করে দেবে।
শি

3

$_SESSIONআমার পরীক্ষিত / অন্তর্ভুক্ত ফাইলগুলির অভ্যন্তরে ব্যবহার করার জন্য আমার আরও মূলগত সমাধান ছিল । আমি এক সম্পাদিত PHPUnit ফাইল ../PHPUnit/Utils/Printer.php আছে একটি "session_start();"সামনে কমান্ড "$ বাফার ছাপি"

এটি আমার জন্য কবজির মতো কাজ করেছিল। তবে আমি মনে করি "জন্টি" ব্যবহারকারীর সমাধান এখন পর্যন্ত সর্বোত্তম।


আপনি কি সংগ্রহস্থলটিতে পুল-অনুরোধ জমা দিয়েছেন? আমার ধারণা এটি একটি সাধারণ সমস্যা হতে পারে।
t1gor

ইঙ্গিতটির জন্য ধন্যবাদ, আমি আমার phpunit বুটস্ট্র্যাপ.এফপিতে সেশন_স্টার্ট () কল করেছি এবং এটি আমার পক্ষে কাজ করে
বাম্পারবক্স

0

@RunInSeparateProcess এর বিকল্প সমাধান হ'ল পিএইচপিউনিট চলাকালীন - - প্রসেস-আইসোলেশন বিকল্পটি নির্দিষ্ট করা:

name@host [~/test]# phpunit --process-isolation HeadersTest.php

এটি phpunit.xml এ প্রক্রিয়াআইসোলেশন = "সত্য" বিকল্পটি সেট করার জন্য সাদৃশ্য।

--Stderr বিকল্পটি নির্দিষ্ট করার জন্য এই সমাধানটির একই সুবিধা / অসুবিধা রয়েছে, যা আমার ক্ষেত্রে কার্যকর হয়নি। মূলত কোনও কোড পরিবর্তন প্রয়োজন হয় না, যদিও পৃথক পিএইচপি প্রক্রিয়াতে প্রতিটি পরীক্ষা চালানোর কারণে একটি পারফরম্যান্স হিট হতে পারে।


এটি কারণ অনুসন্ধান এবং কিছু পরীক্ষা করার জন্য প্রথম পদক্ষেপ হতে পারে, তবে রক্ষণাবেক্ষণযোগ্য পরীক্ষা তৈরির জন্য, টেক্সটটিকে সরাসরি পরীক্ষার ফাইলে এম্বেড করুন। কমান্ড লাইন থেকে কম 'বিশেষ' বিকল্পের প্রয়োজন, সিআই সিস্টেম কনফিগারেশনের রক্ষণাবেক্ষণ তত সহজ।
শি

যিনি কখনও # ব্যর্থকে ডাউনগ্রেড করেছেন। এই উত্তরটি অন্য বিকল্প হিসাবে সঠিক।
এফবি

0

আপনার পরীক্ষার পরে পিএইচপিউনিট থেকে শিরোনাম পাওয়ার জন্য --stderr পরামিতি ব্যবহার করুন।

phpunit --stderr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.