Kodokon kodokon.com

गुणवत्ता: PHPUnit, PHPStan और PSR

PHPUnit परीक्षणों, स्तर 9 पर PHPStan स्थैतिक विश्लेषण और PSR मानकों के साथ अपने कोड को एक पेशेवर की तरह सुसज्जित करें।

10 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

विशेषज्ञ स्तर के कोड की पहचान उसकी चतुर तरकीबों से कम और उसके सुरक्षा जाल से अधिक होती है। तीन पूरक स्तंभ: परीक्षण (PHPUnit) जो कोड को चलाकर व्यवहार की पुष्टि करते हैं, स्थैतिक विश्लेषण (PHPStan) जो कुछ भी चलाए बिना गुणों को सिद्ध करता है, और साझा मानक (PSR) जो पारिस्थितिकी तंत्र को अंतरसंचालनीय बनाते हैं। सब कुछ Composer के साथ, विकास निर्भरताओं के रूप में स्थापित होता है।

BASH
composer require --dev phpunit/phpunit
composer require --dev phpstan/phpstan
./vendor/bin/phpunit --testdox tests
./vendor/bin/phpstan analyse src --level=9
--testdox विकल्प परीक्षणों को एक पठनीय विनिर्देशन के रूप में प्रदर्शित करता है।

PHPUnit 10 से, मेटाडेटा PHP एट्रिब्यूट के रूप में लिखा जाता है: #[DataProvider] docblock @dataProvider एनोटेशन की जगह लेता है। एक डेटा प्रोवाइडर को पब्लिक और स्टैटिक होना चाहिए, क्योंकि PHPUnit इसे टेस्ट क्लास को इंस्टैंशिएट करने से पहले ही पढ़ लेता है। हर डेटा सेट एक वर्णनात्मक कुंजी धारण करता है, जो केस के विफल होने पर ज्यों-का-त्यों प्रदर्शित होती है - एक accents विफलता तुरंत पता चल जाती है।

PHP
<?php
declare(strict_types=1);

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

final class SlugifierTest extends TestCase
{
    #[DataProvider('provideTitles')]
    public function testSlugify(
        string $input,
        string $expected
    ): void {
        $this->assertSame($expected, slugify($input));
    }

    public static function provideTitles(): array
    {
        return [
            'simple' => [
                'Hello World', 'hello-world'
            ],
            'accents' => [
                'Déjà vu', 'deja-vu'
            ],
        ];
    }
}
आपके प्रोजेक्ट में कहीं और परिभाषित एक slugify फ़ंक्शन का परीक्षण करता है।

PHPStan अपनी कठोरता को स्तरों में श्रेणीबद्ध करता है, 0 से 9 तक (हाल के संस्करणों में स्तर 10 मौजूद है): स्तर 9 पर, कोई भी mixed वैल्यू तब तक अनुपयोगी हो जाती है जब तक उसे पहले स्पष्ट जाँचों द्वारा संकुचित न किया जाए। इसकी असली शक्ति उन docblock टाइप से आती है जिन्हें PHP इंजन नज़रअंदाज़ करता है लेकिन विश्लेषक सत्यापित करता है: ऐरे आकृतियाँ array{email: string}, सूचियाँ list<int>, जेनेरिक। वे एक साथ प्रलेखित करते हैं और सिद्ध भी करते हैं।

PHP
<?php
declare(strict_types=1);

function findEmail(?array $user): string
{
    return $user['email'];
}

/**
 * @param array{email: string}|null $user
 */
function findEmailSafe(?array $user): string
{
    return $user === null
        ? 'n/a'
        : $user['email'];
}
स्तर 9: पहला फ़ंक्शन अस्वीकृत होता है (null पर संभावित पहुँच, अज्ञात कुंजी और टाइप), दूसरा पास हो जाता है।

PSR (PHP Standards Recommendations) PHP-FIG की परंपराएँ हैं। PSR-1 और PSR-12 शैली को मानकीकृत करते हैं: इंडेंटेशन, ब्रेसेस, इंपोर्ट क्रम - जिन्हें php-cs-fixer या phpcs द्वारा स्वतः लागू किया जाता है। PSR-4 ऑटोलोडिंग को परिभाषित करता है: एक नेमस्पेस उपसर्ग एक निर्देशिका से मैप होता है, जिससे Composer बिना किसी मैनुअल require के किसी भी क्लास का पता लगा सकता है। अंत में, इंटरफ़ेस PSR - लॉगर के लिए PSR-3, HTTP संदेशों के लिए PSR-7 - आपको एक लाइब्रेरी को दूसरी से बदलने देते हैं, बिना उस कोड को छुए जो इसका उपभोग करता है।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. PHPUnit 10 से, #[DataProvider] द्वारा संदर्भित एक डेटा प्रोवाइडर मेथड पर कौन सी बाध्यता लागू होती है?
    • इसे पब्लिक और स्टैटिक होना चाहिए, क्योंकि PHPUnit इसे टेस्ट क्लास को इंस्टैंशिएट करने से पहले पढ़ता है
    • इसे एक जेनरेटर लौटाना चाहिए, कभी ऐरे नहीं
    • इसका नाम परीक्षण के समान होना चाहिए, जिसके अंत में Provider लगा हो
  2. PHPStan स्तर 9 क्या थोपता है?
    • केवल नेटिव टाइप के पक्ष में docblock पर प्रतिबंध लगाना
    • mixed का कठोर प्रबंधन: आप ऐसी वैल्यू को पहले संकुचित किए बिना उपयोग नहीं कर सकते
    • विश्लेषित कोड पर 100% परीक्षण कवरेज
  3. PSR-4 मानक क्या परिभाषित करता है?
    • एप्लिकेशन लॉग संदेशों का प्रारूप
    • एक नेमस्पेस उपसर्ग और एक निर्देशिका के बीच मैपिंग, जिसे Composer का ऑटोलोडर उपयोग करता है
    • इंडेंटेशन शैली और ब्रेसेस का स्थान