আমি কীভাবে পিএইচপি-তে ইউনিট পরীক্ষা লিখব? [বন্ধ]


99

এগুলি যে কত দুর্দান্ত সে সম্পর্কে আমি সর্বত্রই পড়েছি, তবে কিছু কারণে আমি ঠিক কীভাবে কিছু পরীক্ষা করার কথা বলেছি তা বুঝতে পারি না। কেউ হয়ত উদাহরণ কোডের একটি টুকরো পোস্ট করতে পারে এবং কীভাবে তারা এটি পরীক্ষা করে? খুব বেশি সমস্যা না হলে :)


4
ভারসাম্যের জন্য, পিএইচপি-র জন্য 2, বা 3 ইউনিট পরীক্ষার কাঠামো নেই - এখানে একটি তালিকা রয়েছে: en.wikedia.org/wiki/List_of_unit_testing_frameworks#PHP
ফেন্টন

উত্তর:


37

এখানে একটি তৃতীয় "কাঠামো" রয়েছে, যা শিখতে অনেক সহজ - সাধারণ টেস্টের চেয়েও সহজ , একে পিএইচপিটি বলে।

একটি প্রাইমার এখানে পাওয়া যাবে: http://qa.php.net/writ-test.php

সম্পাদনা: স্যাম্পল কোডের জন্য আপনার অনুরোধটি সবেমাত্র দেখেছি।

আসুন ধরে নেওয়া যাক lib.php নামে একটি ফাইলটিতে আপনার নিম্নলিখিত ফাংশন রয়েছে :

<?php
function foo($bar)
{
  return $bar;
}
?>

সত্যিই সরল এবং সোজা এগিয়ে, আপনি যে প্যারামিটারটি দিয়েছিলেন তা ফিরে আসে। সুতরাং আসুন এই ফাংশনটির জন্য একটি পরীক্ষা দেখুন, আমরা foo.phpt পরীক্ষা ফাইল কল করব :

--TEST--
foo() function - A basic test to see if it works. :)
--FILE--
<?php
include 'lib.php'; // might need to adjust path if not in the same dir
$bar = 'Hello World';
var_dump(foo($bar));
?>
--EXPECT--
string(11) "Hello World"

সংক্ষেপে, আমরা $barমান সহ পরামিতি সরবরাহ "Hello World"করি এবং আমরা var_dump()এতে ফাংশন কলটির প্রতিক্রিয়া জানাই foo()

এই পরীক্ষা চালাতে, ব্যবহার করুন: pear run-test path/to/foo.phpt

এটির জন্য আপনার সিস্টেমে পিয়ারের একটি ওয়ার্কিং ইনস্টল দরকার যা বেশিরভাগ পরিস্থিতিতে বেশ সাধারণ। আপনার যদি এটি ইনস্টল করতে হয় তবে আমি সর্বশেষ উপলব্ধ সংস্করণটি ইনস্টল করার পরামর্শ দিচ্ছি। এটি সেট আপ করতে আপনার যদি সহায়তার প্রয়োজন হয় তবে নির্দ্বিধায় জিজ্ঞাসা করুন (তবে ওএস সরবরাহ করুন)।


এটা করা উচিত নয় run-tests?
ধর্মমান ২

32

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


22

আপনি নিজের কোডিং শৈলীর সমন্বয় করে ইউনিট পরীক্ষাকে আরও কার্যকর করতে পারেন।

আমি গুগল টেস্টিং ব্লগ ব্রাউজ করার পরামর্শ দিচ্ছি , বিশেষত টেস্টেবল কোড লেখার পোস্ট ।


7
আমি মনে করি আপনি একটি দুর্দান্ত পোস্ট উল্লেখ করেছেন। 'ইউনিট পরীক্ষার সাথে আপনার উত্তর শুরু করা খুব কার্যকরী নয়' আমাকে প্রায় নিচু করে তুলেছিল, যদিও, এটি একটি পরীক্ষায় পারদর্শী ... সম্ভবত, ইতিবাচক পদ্ধতিতে পুনর্নির্মাণটি নিবন্ধটি পড়তে উত্সাহিত করবে।
xtofl

4
@xtofl এটিকে '
পজিটিভিটি

13

আমি আমার নিজের ঘূর্ণায়মান কারণ কারও কাছে এলিসের উপায়গুলি শিখতে আমার কাছে সময় ছিল না, এটি লিখতে প্রায় 20 মিনিট সময় লেগেছে, 10 এখানে পোস্ট করার জন্য এটি মানিয়ে নিতে।

ইউনিটটেস্টিং আমার পক্ষে খুব উপকারী।

এটি দীর্ঘ দীর্ঘ তবে এটি নিজের ব্যাখ্যা করে এবং নীচে একটি উদাহরণ রয়েছে।

/**
 * Provides Assertions
 **/
class Assert
{
    public static function AreEqual( $a, $b )
    {
        if ( $a != $b )
        {
            throw new Exception( 'Subjects are not equal.' );
        }
    }
}

/**
 * Provides a loggable entity with information on a test and how it executed
 **/
class TestResult
{
    protected $_testableInstance = null;

    protected $_isSuccess = false;
    public function getSuccess()
    {
        return $this->_isSuccess;
    }

    protected $_output = '';
    public function getOutput()
    {
        return $_output;
    }
    public function setOutput( $value )
    {
        $_output = $value;
    }

    protected $_test = null;
    public function getTest()
    {
        return $this->_test;
    }

    public function getName()
    {
        return $this->_test->getName();
    }
    public function getComment()
    {
        return $this->ParseComment( $this->_test->getDocComment() );
    }

    private function ParseComment( $comment )
    {
        $lines = explode( "\n", $comment );
        for( $i = 0; $i < count( $lines ); $i ++ )
        {
            $lines[$i] = trim( $lines[ $i ] );
        }
        return implode( "\n", $lines );
    }

    protected $_exception = null;
    public function getException()
    {
        return $this->_exception;
    }

    static public function CreateFailure( Testable $object, ReflectionMethod $test, Exception $exception )
    {
        $result = new self();
        $result->_isSuccess = false;
        $result->testableInstance = $object;
        $result->_test = $test;
        $result->_exception = $exception;

        return $result;
    }
    static public function CreateSuccess( Testable $object, ReflectionMethod $test )
    {
        $result = new self();
        $result->_isSuccess = true;
        $result->testableInstance = $object;
        $result->_test = $test;

        return $result;
    }
}

/**
 * Provides a base class to derive tests from
 **/
abstract class Testable
{
    protected $test_log = array();

    /**
     * Logs the result of a test. keeps track of results for later inspection, Overridable to log elsewhere.
     **/
    protected function Log( TestResult $result )
    {
        $this->test_log[] = $result;

        printf( "Test: %s was a %s %s\n"
            ,$result->getName()
            ,$result->getSuccess() ? 'success' : 'failure'
            ,$result->getSuccess() ? '' : sprintf( "\n%s (lines:%d-%d; file:%s)"
                ,$result->getComment()
                ,$result->getTest()->getStartLine()
                ,$result->getTest()->getEndLine()
                ,$result->getTest()->getFileName()
                )
            );

    }
    final public function RunTests()
    {
        $class = new ReflectionClass( $this );
        foreach( $class->GetMethods() as $method )
        {
            $methodname = $method->getName();
            if ( strlen( $methodname ) > 4 && substr( $methodname, 0, 4 ) == 'Test' )
            {
                ob_start();
                try
                {
                    $this->$methodname();
                    $result = TestResult::CreateSuccess( $this, $method );
                }
                catch( Exception $ex )
                {
                    $result = TestResult::CreateFailure( $this, $method, $ex );
                }
                $output = ob_get_clean();
                $result->setOutput( $output );
                $this->Log( $result );
            }
        }
    }
}

/**
 * a simple Test suite with two tests
 **/
class MyTest extends Testable
{
    /**
     * This test is designed to fail
     **/
    public function TestOne()
    {
        Assert::AreEqual( 1, 2 );
    }

    /**
     * This test is designed to succeed
     **/
    public function TestTwo()
    {
        Assert::AreEqual( 1, 1 );
    }
}

// this is how to use it.
$test = new MyTest();
$test->RunTests();

এই ফলাফলগুলি:

পরীক্ষা: টেস্টওনে ব্যর্থতা ছিল 
/ **
* এই পরীক্ষাটি ব্যর্থ হওয়ার জন্য ডিজাইন করা হয়েছে
** / (লাইনগুলি: 149-152; ফাইল: / ব্যবহারকারী / ক্রিস / ডেস্কটপ / টেস্টেবল.এফপি)
টেস্ট: টেস্টটিও ছিল একটি সাফল্য 

7

পিএইচপিউনিট পান। এটা ব্যবহার করা খুব সহজ।

তারপরে খুব সাধারণ জোর দিয়ে শুরু করুন। অন্য কোনও কিছুতে যাওয়ার আগে আপনি AssertEquals এর সাথে অনেক কিছু করতে পারেন। আপনার পা ভিজানোর জন্য এটি একটি ভাল উপায়।

আপনি প্রথমে আপনার পরীক্ষাটি লেখার চেষ্টা করতেও পারেন (যেহেতু আপনি আপনার প্রশ্নটি টিডিডি ট্যাগ দিয়েছিলেন) এবং তারপরে আপনার কোডটি লিখতে পারেন। আপনি যদি এটি না করে থাকেন তবে এটি চোখ ধাঁধানো।

require_once 'ClassYouWantToTest';
require_once 'PHPUnit...blah,blah,whatever';

class ClassYouWantToTest extends PHPUnit...blah,blah,whatever
{
    private $ClassYouWantToTest;

   protected function setUp ()
    {
        parent::setUp();
        $this->ClassYouWantToTest = new ClassYouWantToTest(/* parameters */);
    }

    protected function tearDown ()
    {
        $this->ClassYouWantToTest = null;
        parent::tearDown();
    }

    public function __construct ()
    {   
        // not really needed
    }

    /**
     * Tests ClassYouWantToTest->methodFoo()
     */
    public function testMethodFoo ()
    {
        $this->assertEquals(
            $this->ClassYouWantToTest->methodFoo('putValueOfParamHere), 'expectedOutputHere);

    /**
     * Tests ClassYouWantToTest->methodBar()
     */
    public function testMethodFoo ()
    {
        $this->assertEquals(
            $this->ClassYouWantToTest->methodBar('putValueOfParamHere), 'expectedOutputHere);
}

5

সাধারণ পরীক্ষা এবং ডকুমেন্টেশনের জন্য, পিএইচপি-ডক্টেস্ট বেশ দুর্দান্ত এবং এটি শুরু করার সত্যিই সহজ উপায় যেহেতু আপনাকে আলাদা ফাইল খুলতে হবে না। নীচের কার্যকারিতাটি কল্পনা করুন:

/**
* Sums 2 numbers
* <code>
* //doctest: add
* echo add(5,2);
* //expects:
* 7
* </code>
*/
function add($a,$b){
    return $a + $b;   
}

আপনি এখন এই ফাইলটি পিএইচপিডিটির মাধ্যমে চালালে (পিএইচপি-ডক্টেস্টের কমান্ড-লাইন রানার) ১ টি পরীক্ষা চালানো হবে। ডক্টেস্ট <কোড> ব্লকের ভিতরে রয়েছে। ডক্টেট অজগর থেকে উদ্ভূত এবং কোডটি কীভাবে কাজ করবে বলে ধারণা করা যায় তার জন্য দরকারী এবং চলমান উদাহরণ দেওয়ার জন্য এটি জরিমানা। আপনি এটি একচেটিয়াভাবে ব্যবহার করতে পারবেন না কারণ কোডটি নিজেই পরীক্ষার কেসগুলি নিয়ে জঞ্জাল দেবে তবে আমি খুঁজে পেয়েছি এটি আরও একটি আনুষ্ঠানিক টিডিডি লাইব্রেরির পাশাপাশি দরকারী - আমি phpunit ব্যবহার করি।

এই 1 ম উত্তর এখানে এটা তুলে ধরছে চমত্কারভাবে (এটা বনাম doctest ইউনিট নয়)।


4
এটি কি উত্সকে একটু বিশৃঙ্খলা তৈরি করে না?
আলী ঘানাভাটিয়ান

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

2

phpunit পিএইচপি জন্য ডিফাক্টো ইউনিট টেস্টিং কাঠামো অনেক বেশি। এছাড়াও ডকস্টেস্ট (পিয়ার প্যাকেজ হিসাবে উপলব্ধ) এবং আরও কয়েকটি রয়েছে। পিএইচপি নিজেই রিগ্রেশন এবং পিএইচপি পরীক্ষার মাধ্যমে পরীক্ষিত হয় যা পিয়ারের মাধ্যমেও চালানো যেতে পারে।


2

কোডসেপশন টেস্টগুলি অনেকগুলি সাধারণ ইউনিট পরীক্ষার মতো তবে এমন জিনিসগুলির ক্ষেত্রে আপনার শক্তিশালী যেখানে আপনার উপহাস এবং স্টাবিংয়ের প্রয়োজন st

এখানে নমুনা নিয়ন্ত্রক পরীক্ষা দেওয়া হচ্ছে। লক্ষ্য করুন কিভাবে স্টাবগুলি সহজেই তৈরি হয়। আপনি পদ্ধতিটি কত সহজে পরীক্ষা করে নিলেন।

<?php
use Codeception\Util\Stub as Stub;

const VALID_USER_ID = 1;
const INVALID_USER_ID = 0;

class UserControllerCest {
public $class = 'UserController';


public function show(CodeGuy $I) {
    // prepare environment
    $I->haveFakeClass($controller = Stub::makeEmptyExcept($this->class, 'show'));
    $I->haveFakeClass($db = Stub::make('DbConnector', array('find' => function($id) { return $id == VALID_USER_ID ? new User() : null ))); };
    $I->setProperty($controller, 'db', $db);

    $I->executeTestedMethodOn($controller, VALID_USER_ID)
        ->seeResultEquals(true)
        ->seeMethodInvoked($controller, 'render');

    $I->expect('it will render 404 page for non existent user')
        ->executeTestedMethodOn($controller, INVALID_USER_ID)
        ->seeResultNotEquals(true)
        ->seeMethodInvoked($controller, 'render404','User not found')
        ->seeMethodNotInvoked($controller, 'render');
}
}

এছাড়াও অন্যান্য দুর্দান্ত জিনিস আছে। আপনি ডাটাবেস স্থিতি, ফাইল সিস্টেম ইত্যাদি পরীক্ষা করতে পারেন


1

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


1

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

আলোচনার মূল বিষয়গুলি

  1. কীভাবে প্রান্তিকভাবে পিএইচপি কাজের দিকগুলি নথিভুক্ত দিকগুলি আবিষ্কার করুন (বা এই বিষয়টির জন্য বেশ কিছু অংশ)
  2. আপনার নিজের পিএইচপি কোডের জন্য সাধারণ ইউনিট পরীক্ষা লিখুন
  3. কোনও এক্সটেনশনের অংশ হিসাবে বা ইন্টার্নাল বা কিউএ গ্রুপগুলিতে একটি সম্ভাব্য ত্রুটি জানাতে পরীক্ষা লিখুন

1

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

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

গিথব পৃষ্ঠা থেকে একটি স্ক্রিনশট:

চিনুক ইউনিট পরীক্ষার কাঠামো

আমি এটির বিষয়ে যা পছন্দ করি তা হ'ল আপনি পরীক্ষাগুলি যেভাবে বলছেন। এটি তথাকথিত "সাবলীল দৃser়তা" দিয়ে সম্পন্ন হয়। উদাহরণ:

$this->Assert($datetime)->Should()->BeAfter($someDatetime);

এবং মক অবজেক্ট তৈরি করা খুব বাতাস (সিনট্যাক্সের মতো সাবলীল):

$mock = new CFMock::Create(new DummyClass());
$mock->ACallTo('SomeMethod')->Returns('some value');

যাইহোক, আরও একটি তথ্য উদাহরণ সহ গিথুব পৃষ্ঠায় পাওয়া যাবে:

https://github.com/w00/Chinook- টেস্টসুইট

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