php - ডইগন - পিএইচপি ফাংশন




কিভাবে পিএইচপি ইউনিট পরীক্ষা নির্বাহের সময় CLI আউটপুট আউটপুট? (10)

Laravel 5 আপনি ডাম্প () ব্যবহার করতে পারেন, শেষ প্রতিক্রিয়া থেকে কন্টেন্ট ডাম্প।

class ExampleTest extends TestCase{
    public function test1()
    {
        $this->post('/user', ['name' => 'Gema']);
        $this->dump();
    }
}

gives

একটি পিএইচপি ইউনট পরীক্ষা চালানোর সময়, আমি আউটপুট ডাম্প করতে সক্ষম হব তাই আমি এক বা দুটি জিনিস ডিবাগ করতে পারি।

আমি নিম্নলিখিত চেষ্টা করেছি ( পিএইচপি ইউনাইটেড ম্যানুয়াল উদাহরণের মত );

class theTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering disabled
     */
    public function testOutput() {
        print_r("Hello World");
        print "Ping";
        echo "Pong";
        $out = "Foo";
        var_dump($out);
    }   
}

নিম্নলিখিত ফলাফলের সাথে:

PHPUnit @[email protected] by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.00Mb

OK (1 test, 0 assertions)

প্রত্যাশিত আউটপুট কেউ নেই বিজ্ঞপ্তি।

আমি 19 সেপ্টেম্বর, ২011 এর মতো গিট রেপোসের হেড সংস্করণগুলি ব্যবহার করছি।

php -version আউটপুট আউটপুট:

$ php -version
PHP 5.2.9 (cli) (built: Dec  8 2010 11:36:37) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

আমি ভুল করছি কিছু আছে, অথবা এই সম্ভবত একটি পিএইচপি ইউনাইটেড বাগ?


PHPUnit 4.x এ ডিবাগ বার্তা মুদ্রণ করার জন্য এখানে কয়েকটি কার্যকর পদ্ধতি রয়েছে:

  • syslog(LOG_DEBUG, "Debug: Message 1!");

    আরো বাস্তব উদাহরণ:

    syslog(LOG_DEBUG, sprintf("%s: Value: %s", __METHOD__, var_export($_GET, TRUE)));

    কলিং syslog() একটি সিস্টেম লগ বার্তা তৈরি করবে (দেখুন: man syslog.conf )।

    দ্রষ্টব্য: সম্ভাব্য মাত্রা: LOG_DEBUG , LOG_INFO , LOG_NOTICE , LOG_WARNING , LOG_ERR , ইত্যাদি

    ম্যাকোসের উপর, রিয়েলটাইমগুলিতে syslog বার্তাগুলি স্ট্রিম করতে, চালান:

    log stream --level debug --predicate 'processImagePath contains "php"'
  • fwrite(STDERR, "LOG: Message 2!\n");

    দ্রষ্টব্য: STDERR থেকে পিএইচপি স্ক্রিপ্ট পড়ার সময় STDERR ধ্রুবক পাওয়া যায় না। এখানে workaround ।

    দ্রষ্টব্য: পরিবর্তে STDERR , আপনি একটি ফাইলের নাম উল্লেখ করতে পারেন।

  • file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);

    দ্রষ্টব্য: যদি আপনার STDERR ধ্রুবক সংজ্ঞায়িত না থাকে তবে এই পদ্ধতিটি ব্যবহার করুন।

  • register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);

    দ্রষ্টব্য: এই পদ্ধতিটি ব্যবহার করুন, যদি আপনি পরীক্ষাগুলি প্রভাবিত না করেই খুব শেষে কিছু মুদ্রণ করতে চান।

পরিবর্তনশীল ডাম্প করতে, var_export() , যেমন "Value: " . var_export($some_var, TRUE) . "\n" "Value: " . var_export($some_var, TRUE) . "\n" "Value: " . var_export($some_var, TRUE) . "\n"

Verbose বা ডিবাগ মোডে শুধুমাত্র উপরের বার্তাগুলি মুদ্রণ করতে, দেখুন: --debug বা --verbose একটি পরীক্ষায় PHPUnit এ পাস করা হয়েছে কিনা তা জানানোর উপায় আছে?

আউটপুট পরীক্ষার এটি পরীক্ষা স্ব-অংশ অংশ হলেও, চেক আউট আউটপুট ডক্স পৃষ্ঠা।


আমি VisualPHPUnit সাথে কিছু ভাগাভাগি করছি, এবং এটি অন্য জিনিসগুলির মধ্যে আউটপুট প্রদর্শন করে।

class TestHello extends PHPUnit_Framework_TestCase 
{
    public function test_Hello() 
    {
        print "hello world";
    }
}


আমি আমার Testresults এইচটিএমএল ভিত্তিক আউটপুট, এই ক্ষেত্রে এটি কন্টেন্ট flush সহায়ক ছিল:

var_dump($array);
ob_flush();

একটি দ্বিতীয় পিএইচপি পদ্ধতি আছে

flush() 

যা আমি চেষ্টা করে নি।


এটি ফিক্সচার সম্পর্কে পিএইচপি ইউনোট ডক্স থেকে নেওয়া হয়েছে।

এটি phpunit পরীক্ষা জীবন চক্র durring যে কোনো সময়ে তথ্য ডাম্প করার অনুমতি দেওয়া উচিত।

আপনি যে আউটপুট করতে চান তার সাথে নিচের __METHOD__ প্রতিস্থাপন করুন

উদাহরণ 4.2: উদাহরণ উপলব্ধ সমস্ত টেমপ্লেট পদ্ধতি দেখাচ্ছে

<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function setUp()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function assertPreConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public function testOne()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(TRUE);
    }

    public function testTwo()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(FALSE);
    }

    protected function assertPostConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function tearDown()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public static function tearDownAfterClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function onNotSuccessfulTest(Exception $e)
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        throw $e;
    }
}
?>

এটি একটি বাগ না, কিন্তু খুব ইচ্ছাকৃত। আপনার সেরা বাজিটি কোনও ধরনের লগ ফাইলে লিখতে হয় এবং আউটপুটের জন্য লগ দেখার জন্য লেজটি লেখে।

আপনি যদি টেস্ট আউটপুট চেষ্টা করছেন, this চেক আউট।

এছাড়াও:

দ্রষ্টব্য : দয়া করে মনে রাখবেন যে পিএইচপি ইউনাইটেড সমস্ত আউটপুট গলে যা পরীক্ষার কার্যকর সময় নির্গত হয়। কঠোর মোডে, আউটপুট নির্গত একটি পরীক্ষা ব্যর্থ হবে।


--debug ব্যবহার করে দেখুন

যদি আপনি একটি অন্তর্ভুক্ত বা উৎস তথ্য ফাইল সঠিক পথ পেতে চেষ্টা করছেন দরকারী।


Phpunit কার্যকর যখন শুধু --verbose পতাকা ব্যবহার করুন।

$ phpunit --verbose -c phpunit.xml 

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

আশা করি এটা কাজে লাগবে.


হালনাগাদ করুন: fwrite(STDERR, print_r($myDebugVar, TRUE)); ব্যবহার সম্পর্কিত নিম্নরূপ rdrdowrey এর আপডেট দেখুন fwrite(STDERR, print_r($myDebugVar, TRUE)); প্রায় একটি খুব সহজ কাজ হিসাবে

এই আচরণ ইচ্ছাকৃত (হিসাবে jasonbar নির্দেশ করেছে )। ম্যানুয়াল দ্বন্দ্বপূর্ণ অবস্থা পিএইচপি ইউনাইটেড reported করা হয়েছে।

একটি কাজ-আশেপাশে পিএইচপি ইউনাইট প্রত্যাশিত আউটপুট খালি (যখন প্রকৃতপক্ষে আউটপুট আছে) বলার অপেক্ষা রাখে না, যা অপ্রত্যাশিত আউটপুট দেখানো হবে তা ট্রিগার করবে।

class theTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering disabled
     */
    public function testOutput() {
        $this->expectOutputString(''); // tell PHPUnit to expect '' as output
        print_r("Hello World");
        print "Ping";
        echo "Pong";
        $out = "Foo";
        var_dump($out);
    }   
}

দেয়:

PHPUnit @[email protected] by Sebastian Bergmann.

F

Time: 1 second, Memory: 3.50Mb

There was 1 failure:

1) theTest::testOutput
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-''
+'Hello WorldPingPongstring(4) "Foo"
+'

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

আউটপুট দাবি পরীক্ষা করার আগে তারা ব্যর্থ হতে পারে এমন পরীক্ষার জন্য আপনার যে কোনও অন্যান্য দাবিগুলি অক্ষম করতে নির্দিষ্ট করুন (এবং তাই আপনি আউটপুটটি দেখতে পাবেন না)।


হালনাগাদ

--verbose কমান্ড লাইন বিকল্পের তুলনায় এটি আরও ভালভাবে কাজ করার আরেকটি উপায় উপলব্ধি করেছে:

class TestSomething extends PHPUnit_Framework_TestCase {
    function testSomething() {
        $myDebugVar = array(1, 2, 3);
        fwrite(STDERR, print_r($myDebugVar, TRUE));
    }
}

এটি --verbose CLI বিকল্প বরাবর আসে এমন সমস্ত অবাঞ্ছিত আউটপুট ছাড়া আপনার কনসোলে যে কোনও সময় ডাম্প করতে দেয়।

অন্যান্য উত্তর যেমন উল্লেখ করেছে, বিল্ট-ইন পদ্ধতিগুলি ব্যবহার করে আউটপুটটি পরীক্ষা করা সেরা:

$this->expectOutputString('foo');

যাইহোক, কখনও কখনও এটি দুষ্টু হতে সহায়ক এবং আপনার পরীক্ষার ক্ষেত্রে থেকে এক-অফ / অস্থায়ী ডিবাগিং আউটপুট দেখুন। যদিও var_dump হ্যাক / workaround জন্য কোন প্রয়োজন নেই। আপনার পরীক্ষার স্যুটটি চালানোর সময় --verbose কমান্ড লাইন বিকল্পটি সেট করে এটি সহজেই সম্পন্ন করা যেতে পারে। উদাহরণ স্বরূপ:

$ phpunit --verbose -c phpunit.xml

CLI পরিবেশে চলাকালীন এটি আপনার পরীক্ষার পদ্ধতিগুলির ভিতর থেকে আউটপুট প্রদর্শন করবে।

দেখুন: পিএইচপি ইউনুইটের জন্য টেস্টিং পরীক্ষা - টেস্টিং আউটপুট





phpunit