Magento 2 তে PHPUnit 4.1 সহ ইউনিট পরীক্ষার পিএইচপি 7 এর সঠিক উপায় কী?


23

আমি যখন আমার মডিউলগুলি লিখছি তখন আমি অ্যাপ্লিকেশনটির সবচেয়ে জটিল অংশগুলির জন্য তাদের ইউনিট-পরীক্ষার সরবরাহ করার চেষ্টা করছি। তবে এই মুহুর্তে (ম্যাজেন্টো ২.১.৩) ইউনিট পরীক্ষাগুলি কীভাবে লিখবেন সে সম্পর্কে বিভিন্ন উপায় রয়েছে:

পরীক্ষার বিভিন্ন উপায়

  • এর সাথে একীভূত করুন bin/magento dev:tests:run unitএবং এটি ম্যাজেন্টোর সাথে বান্ডিল হওয়া ডিফল্ট phpunit সেটিংসের শীর্ষে চালান run
  • এগুলিকে আলাদা করে লিখুন, এগুলি দিয়ে চালান vendor/bin/phpunit app/code/Vendor/Module/Test/Unitএবং ম্যাগান্টো যা কিছু আছে তা উপহাস করুন।
  • এগুলি পৃথকভাবে লিখুন, সমস্ত কিছুকে উপহাস করুন এবং PHPUnit এর সিস্টেম-গ্লোবাল সংস্করণ ব্যবহার করুন।
  • এগুলি আলাদাভাবে লিখুন, এগুলি দিয়ে চালান vendor/bin/phpunit, তবে এখনও ব্যবহার করুন \Magento\Framework\TestFramework\Unit\Helper\ObjectManager

ম্যাজেন্টো 2 এবং পিএইচপিউনিট

তদ্ব্যতীত, ম্যাজেন্টো 2 পিএইচপিউইনিট 4.1.0 এর সাথে বান্ডেল আসে, যা পিএইচপি 7- সামঞ্জস্যপূর্ণ নয়। টাইপ-হিন্টিং নেটিভ (যেমন stringএবং `ইন্ট) এবং আপনার স্বাক্ষরগুলিতে রিটার্নের প্রকারগুলি ঘোষণার ফলে ত্রুটি ছুঁড়ে যাবে। উদাহরণস্বরূপ, একটি ইন্টারফেস / শ্রেণি যেমন একটি পদ্ধতির স্বাক্ষর সহ:

public function foo(string $bar) : bool;

... পিএইচপিউইনিট ৪.১.০ দ্বারা উপহাস করা যাবে না। :-(

আমার বর্তমান অবস্থা

এর কারণেই আমি এখন বেশিরভাগ তৃতীয় উপায়ে আমার ইউনিট পরীক্ষাগুলি লিখছি (সিস্টেম-গ্লোবাল পিএইচপিউনিট সংস্করণে ফোন করে)।

আমার সেটআপে, আমার পিএইচপিউইনিট 5.6 বিশ্বব্যাপী ইনস্টল করা আছে, তাই আমি যথাযথ পিএইচপি 7-কোডটি সমাধান করতে পারি তবে আমাকে কিছু টুইট করতে হবে। উদাহরণ স্বরূপ:

phpunit.xml এটি দেখতে দেখতে যাতে আমি সুরকার অটোলোডার ব্যবহার করতে পারি:

<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="Testsuite">
            <directory>.</directory>
        </testsuite>
    </testsuites>
</phpunit>

... এবং আমার সমস্ত setUp()thodতিহ্যগুলিতে আমার কাছে নিম্নলিখিত চেক রয়েছে যাতে আমি আমার পরীক্ষাগুলি সামঞ্জস্যের সাথে সামঞ্জস্য করে লিখতে পারি:

// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
    $this->markTestSkipped();
}

এইভাবে, যখন আমার পরীক্ষাগুলি Magentos এর অন্তর্নির্মিত PHPUnit দ্বারা পরিচালিত হয়, এটি ত্রুটি ছুঁড়ে না।

আমার প্রশ্ন

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

ম্যাজেন্টো 2-তে ইউনিট টেস্ট লেখার কোনও উপায় আছে যাতে আমার কোডটি 'ডাউনগ্রেড' করতে না হয় এবং এখনও অবজেক্ট ম্যানেজারের ছোঁয়া সমস্ত বিষয়টিকে ঠাট্টা করার জন্য ম্যাজেন্টোসের অন্তর্নির্মিত সহায়কগুলি ব্যবহার করতে পারি? অথবা এমনকি আপনার ইউনিট পরীক্ষায় অবজেক্ট ম্যানেজারটি ব্যবহার করা কি খারাপ অভ্যাস?

আপনার নিজস্ব কাস্টম মডিউলগুলি কীভাবে পরীক্ষা করতে হবে তার সঠিক উপায়টি সম্পর্কে আমি অনেক গাইডেন্স / উদাহরণ অনুপস্থিত।


1
কি দুর্দান্ত প্রশ্ন।
ক্যামডিকসন

উত্তর:


17

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

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

এটি বলেছিল, আমি আপনার সাথে একমত যে পিএইচপি 5.6 সমর্থন করার পক্ষে এটি উপযুক্ত নয়। আমি পিএইচপি 7 স্কেলার টাইপ হিন্টিং এবং রিটার্ন টাইপ হিন্টিং যতটা সম্ভব ব্যবহার করি (প্লাস, আমি বাজারের জায়গাগুলির যত্ন করি না)।

পিএইচপিউইনিট ৪.১ টি উপহাসের লাইব্রেরির সীমাবদ্ধতার আশেপাশে কাজ করার জন্য কমপক্ষে দু'টি সোজা ফরোয়ার্ড ওয়ার্কআউন্ড রয়েছে যা আমি অতীতে ব্যবহার করেছি:

  1. উদাহরণস্বরূপ, আপনার পরীক্ষা দ্বিগুণ করার জন্য বেনামে বা নিয়মিত ক্লাস ব্যবহার করুন

    $fooIsFalseStub = new class extends Foo implements BarInterface() {
        public function __construct(){};
        public function isSomethingTrue(string $something): bool
        {
            return false;
        }
    };
  2. বান্ডেলযুক্ত পিএইচপিউনিত তবে তৃতীয় পক্ষের উপহাসের পাঠাগারটি ব্যবহার করুন যা সুরকারের মাধ্যমে অন্তর্ভুক্ত করা যেতে পারে require-dev, উদাহরণস্বরূপ https://github.com/padraic/mockery । আমি চেষ্টা করেছি এমন সমস্ত বিদ্রূপের গ্রন্থাগারগুলি খুব সহজেই কোনও পরীক্ষার কাঠামোর সাথে ব্যবহার করা যেতে পারে, এমনকি পিএইচপিউইনিতের খুব পুরানো সংস্করণ 4.1 এর মতো।

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

ব্যক্তিগতভাবে আমি বেনাম ক্লাসগুলি ব্যবহার করতে পছন্দ করি কারণ এটি বাহ্যিক নির্ভরতার সংখ্যাকে যুক্ত করে না এবং তাদের সেভাবে লিখতে আরও মজাদার।

সম্পাদনা :
আপনার প্রশ্নের উত্তর দিতে:

উপহাস কি পিএইচপিউইনটি ৪.১.০ এর সমস্যাটিকে 'সমাধান' করে পিএইচপি 7 টাইপ ইঙ্গিতটি সঠিকভাবে পরিচালনা করতে সক্ষম হচ্ছে না?

হ্যাঁ, নীচের উদাহরণটি দেখুন।

এবং উপহাসের পরে বেনাম ক্লাসগুলির সুবিধা কী?

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

এবং কীভাবে মূল রচয়িতা.জসন ফাইলের পিএইচপিউইনিত সংস্করণটি 5.3.5 এ আপডেট করবেন (পিএইচপি 7 সমর্থনকারী সর্বশেষ সংস্করণ - এবং সর্বজনীন উপহাস-পদ্ধতিগুলি রয়েছে (ম্যাজেন্টো 2 এর নিজস্ব পরীক্ষা দ্বারা প্রয়োজনীয়))?

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


মকারি লাইব্রেরিটি ব্যবহার করে, PHPUnit 4.1 দিয়ে চলমান PHP7 প্রয়োজন এমন একটি শ্রেণীর পরীক্ষার দ্বিগুণ পরীক্ষার উদাহরণ:

<?php

declare(strict_types = 1);

namespace Example\Php7\Test\Unit;

// Foo is a class that will not work with the mocking library bundled with PHPUnit 4.1 
// The test below creates a mock of this class using mockery and uses it in a test run by PHPUnit 4.1
class Foo
{
    public function isSomethingTrue(string $baz): bool
    {
        return 'something' === $baz; 
    }
}

// This is another class that uses PHP7 scalar argument types and a return type.
// It is the system under test in the example test below.
class Bar
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function useFooWith(string $s): bool
    {
        return $this->foo->isSomethingTrue($s);
    }
}

// This is an example test that runs with PHPUnit 4.1 and uses mockery to create a test double
// of a class that is only compatible with PHP7 and younger.
class MockWithReturnTypeTest extends \PHPUnit_Framework_TestCase
{
    protected function tearDown()
    {
        \Mockery::close();
    }

    public function testPHPUnitVersion()
    {
        // FYI to show this test runs with PHPUnit 4.1
        $this->assertSame('4.1.0', \PHPUnit_Runner_Version::id());
    }

    public function testPhpVersion()
    {
        // FYI this test runs with PHP7
        $this->assertSame('7.0.15', \PHP_VERSION);
    }

    // Some nonsensical example test using a mock that has methods with
    // scalar argument types and PHP7 return types.
    public function testBarUsesFoo()
    {
        $stubFoo = \Mockery::mock(Foo::class);
        $stubFoo->shouldReceive('isSomethingTrue')->with('faz')->andReturn(false);
        $this->assertFalse((new Bar($stubFoo))->useFooWith('faz'));
    }
}

উপহাস কি পিএইচপিউইনিত ৪.১.০ সমস্যাটি 'সমাধান' করে পিএইচপি 7 টাইপ ইঙ্গিতটি সঠিকভাবে পরিচালনা করতে সক্ষম হচ্ছে না? এবং উপহাসের পরে বেনাম ক্লাসগুলির সুবিধা কী? এবং কীভাবে মূল composer.jsonফাইলটিতে পিএইচপিউইনিত সংস্করণ 5.3.5 এ আপডেট করবেন (পিএইচপি 7 সমর্থনকারী সর্বশেষ সংস্করণ - এবং সর্বজনীন উপহাস-পদ্ধতিগুলি রয়েছে (ম্যাজেন্টো 2 এর নিজস্ব পরীক্ষা দ্বারা প্রয়োজনীয়))? এখন আরও অনেক প্রশ্ন ...
জিল বার্কার্স

আপনার প্রশ্নের উত্তর হিসাবে আমার উত্তর আপডেট করেছেন @ জিলবার্কার্স
বিনাই

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

গ্রেট! মকারি, একটি দুর্দান্ত লাইব্রেরি অন্বেষণ উপভোগ করুন। আপনি যখন এটির দিকে রয়েছেন, সম্ভবত হ্যাকক্রাস্টটিও দেখুন, একটি দৃ as় গ্রন্থাগার - এটি স্বয়ংক্রিয়ভাবে উপহাসের সাথে ইনস্টল করা হবে।
বিনাই

3

এখনই ম্যাজেন্টো 2 পরবর্তী পিএইচপি সংস্করণ সমর্থন করে:

"php": "~5.6.5|7.0.2|7.0.4|~7.0.6"

এর অর্থ হ'ল ম্যাজেন্টো টিম দ্বারা লিখিত সমস্ত কোড প্রতিটি সমর্থিত সংস্করণে কাজ করে।

তাই ম্যাজেন্টো টিম পিএইচপি 7 কেবলমাত্র বৈশিষ্ট্য ব্যবহার করে না। পিএইচপি 5.6 বৈশিষ্ট্যগুলি পিএইচপিউনিট 4.1.0 দিয়ে আচ্ছাদিত হতে পারে।

আপনার নিজের কোডটি লিখে আপনি নিজের পছন্দ মতো যা কিছু করতে পারেন এবং টেস্টগুলি আপনার পছন্দ মতো লিখতে পারেন। তবে আমি বিশ্বাস করি যে প্রয়োজনীয়তা লঙ্ঘনের কারণে আপনি ম্যাজেন্টো মার্কেটপ্লেসে আপনার এক্সটেনশানটি প্রকাশ করতে পারবেন না।


প্রকৃতপক্ষে, পিএইচপিউনিট 5.7 পিএইচপি 5.6, পিএইচপি 7.0 এবং পিএইচপি 7.1 এ সমর্থিত। PHPUnit 4.8 পিএইচপি 5.3 - 5.6 এ সমর্থিত ছিল। সুতরাং যদিও ম্যাজেন্টো 2 পিএইচপি 5.6 সমর্থন করে তবে এটি পিএইচপিউনিট 5.7 এ আপগ্রেড করতে পারে।
বিনাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.