ホームページ  >  記事  >  バックエンド開発  >  PHP 設計パターンの単体テストのベスト プラクティス

PHP 設計パターンの単体テストのベスト プラクティス

PHPz
PHPzオリジナル
2024-05-07 12:42:021110ブラウズ

PHP 設計パターンの単体テストのベスト プラクティス: 依存関係を分離する: 依存関係の注入またはモック オブジェクトを使用して、外部コンポーネントとの結合を回避します。境界条件をテストする: 例外、エラー処理、エッジ ユース ケースを考慮して、デザイン パターンがあらゆる状況で正しく動作することを確認します。複数のシナリオをカバーする: さまざまなバリアントと実装をテストして、考えられるすべての動作をカバーします。 SOLID 原則に従う: 単一責任や疎結合などの原則を適用して、テスト可能で保守可能なコードを作成します。

PHP 设计模式单元测试最佳实践

PHP デザイン パターン 単体テストのベスト プラクティス

単体テストを作成する場合、コードの信頼性と保守性を確保するには、優れたプラクティスが不可欠です。単体テストは、PHP の複雑な設計パターンにとって特に重要です。この記事では、PHP デザイン パターンの単体テストのベスト プラクティスを紹介し、実際のケースを通じて説明します。

依存関係を分離する

理想的には、単体テストは、他のコンポーネントに依存せずに、単一のクラスまたはメソッドに対して実行する必要があります。デザイン パターンの場合、複数のクラスとインターフェイス間の相互作用に依存することが多いため、これは困難な作業になる可能性があります。

依存関係を分離するには、依存関係注入フレームワークまたはモック オブジェクトを使用します。たとえば、[PHPUnit_MockObject](https://phpunit.readthedocs.io/en/latest/fixtures.html#creating-mocks) を使用して、外部依存関係の代わりにモック オブジェクトを作成します。

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;

class MyClassTest extends TestCase
{
    /** @var MockObject */
    private $mockDependency;

    protected function setUp(): void
    {
        $this->mockDependency = $this->createMock(IDependency::class);
    }
}

境界条件のテスト

デザイン パターンは、多くの場合、複雑な動作と状態管理を処理します。単体テストでは、例外、エラー処理、エッジケースなど、考えられるすべての境界条件を考慮する必要があります。

たとえば、Observer パターンの attach メソッドをテストする場合は、有効なサブスクライバーのみがアタッチされていることを確認する必要があります。また、サブスクライバーが無効なトピックにアタッチしようとしたときの動作もテストします。 attach 方法时,应确保仅附加有效的订阅者。还可以测试当订阅者尝试附加到无效主题时的行为:

public function testAttachInvalidSubject()
{
    $observer = new MyObserver();
    $mode = 'invalid_mode';
    $this->expectException(InvalidArgumentException::class);
    $observer->attach(new InvalidSubject(), $mode);
}

覆盖多种场景

设计模式通常具有多种变体和实现。单元测试应涵盖所有这些不同的场景。

例如,测试策略模式的 execute

public function testExecuteDifferentStrategies()
{
    $context = new Context();
    $strategy1 = new Strategy1();
    $strategy2 = new Strategy2();
    $this->assertEquals('Strategy1 result', $context->execute($strategy1));
    $this->assertEquals('Strategy2 result', $context->execute($strategy2));
}

複数のシナリオをカバーする

デザイン パターンには、複数のバリエーションと実装があることがよくあります。単体テストでは、これらのさまざまなシナリオをすべてカバーする必要があります。

たとえば、戦略パターンの execute メソッドをテストするときは、さまざまな戦略クラスの動作を考慮する必要があります。さまざまなポリシー クラスを実行メソッドに渡すとどうなるかをテストすることもできます。

class SingletonTest extends TestCase
{
    public function testSingletonIsUnique()
    {
        $instance1 = Singleton::getInstance();
        $instance2 = Singleton::getInstance();
        $this->assertSame($instance1, $instance2);
    }

    public function testSingletonLazilyInitialized()
    {
        $this->assertNull(Singleton::getInstance());
        Singleton::getInstance()->setValue('test');
        $this->assertEquals('test', Singleton::getInstance()->getValue());
    }
}

SOLID 原則に従う

SOLID 原則は、テスト可能で保守可能なコードの作成に役立つオブジェクト指向プログラミングの 5 つの原則です。これは、デザイン パターンの単体テストにおいて特に重要です。

たとえば、単一責任の原則に従って、各テストメソッドが 1 つの特定の関数のみをテストするようにします。また、疎結合の原則を遵守して、テストと運用コード間の依存関係を最小限に抑えます。

実用的なケース

🎜シングルケースモード🎜🎜
class ObserverTest extends TestCase
{
    public function testObserverIsNotified()
    {
        $subject = new Subject();
        $observer = new Observer();
        $subject->attach($observer);
        $subject->setState('new state');
        $this->assertEquals('new state', $observer->getState());
    }

    public function testObserverIsDetached()
    {
        $subject = new Subject();
        $observer = new Observer();
        $subject->attach($observer);
        $subject->detach($observer);
        $subject->setState('new state');
        $this->assertNotEquals('new state', $observer->getState());
    }
}
🎜🎜オブザーバーモード🎜🎜rrreee

以上がPHP 設計パターンの単体テストのベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。