免責事項: 私は神聖な存在ではありません。私の言うことは絶対的な真実ではありません。世界に対してさえ疑問を抱くことを恐れないでください。あなたではなく、世界が間違っている可能性があるからです。
ソフトウェアの品質と整合性を維持するための自動テストの重要性は今日は誰にとっても秘密ではありません。通常は単体テストについてよく話しますが、今日は Symfony Framework への統合テストに重点を置きます。
忍耐力がないのでコードを見せてください。
わかったわかった!記事を読むのに忍耐力がない場合は、以下のリンクにこの記事を実装したテスト プロジェクトがあります。
https://github.com/joubertredrat/symfony-testcontainers
Symfony フレームワークと統合テスト
現在、Symfony Framework は PHP の世界で最も成熟し安定したフレームワークの 1 つであり、統合テストなどのさまざまな優れたソリューションが実装されています。しかし、個人的には、統合テスト自体は簡単でも、テスト用の外部依存関係を提供することは、たとえばデータベースのように必ずしも簡単ではないと常々思っていました。
Docker のようなソリューションを使用した場合でも、テスト用の方法で外部依存関係を提供する必要があることに気づきましたが、このステップをはるかに簡単にする非常に興味深いソリューションである Testcontainers が存在します。
テストコンテナ
Testcontainers は、Docker を使用して、データベース、メッセージ ブローカー、キャッシュ システム、またはコンテナ内の依存関係として必要な外部依存関係を簡単な方法で提供できるオープン ソース フレームワークです。
Docker compose やその他のコンテナ オーケストレーション方法に関連した Testcontainers の大きな利点は、コンテナのプロビジョニングをコーディングできることと、現在すでに Golang、Java、.NET、Node.js、Python、Rust などのさまざまな機能をサポートしていることです。他の言語、そしてもちろん PHP もです!
Testcontainers との最初の接触は Golang のプロジェクトであり、リポジトリ テストを実行するために MongoDB コンテナをプロビジョニングする機能がとても気に入ったので、その後、Symfony Framework を使用して PHP の個人プロジェクトで同じことを行うことにしました。
Symfony テストコンテナ = ❤️
Symfony の最大の利点の 1 つは、PHPUnit と統合されたテストの実行、およびテストに必要なブートストラップを実行する機能的なカーネルをサポートしていることです。
Testcontainers は PHP をサポートしていますが、その実装は最近のものであり、https://github.com/testcontainers/testcontainers-php で確認できます。
以下に、このプロジェクトの外部依存関係である MySQL 8.0 コンテナの実装と、Symfony カーネルの起動、データベースとスキーマの作成を示します。
class IntegrationTestCase extends KernelTestCase { protected static ?MySQLContainer $container = null; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); if (!static::$container) { static::$container = MySQLContainer::make('8.0', 'password'); static::$container->withPort('19306', '3306'); static::$container->run(); $kernel = self::bootKernel(); $container = $kernel->getContainer(); $application = new Application($kernel); $application->setAutoExit(false); $application->run( new ArrayInput(['command' => 'doctrine:database:create', '--if-not-exists' => true]) ); $entityManager = $container->get('doctrine')->getManager(); $metadata = $entityManager->getMetadataFactory()->getAllMetadata(); $schemaTool = new SchemaTool($entityManager); $schemaTool->dropSchema($metadata); $schemaTool->createSchema($metadata); } } public static function tearDownAfterClass(): void { parent::tearDownAfterClass(); if (static::$container instanceof MySQLContainer) { static::$container->remove(); } }
これにより、以下の例のように、テスト自体を実行するクラスの基本クラスが完成しました。
class UserRepositoryTest extends IntegrationTestCase { public function testSave(): void { $user = new User(); $user->setName('John Doe'); $user->setEmail('john@doe.local'); $repo = $this->getRepository(); $repo->save($user, true); self::assertNotNull($user->getId()); self::assertIsInt($user->getId()); self::assertTrue($user->getId() > 0); } public function testGetByEmail(): void { $user = new User(); $user->setName('John Doe'); $user->setEmail('john2@doe.local'); $repo = $this->getRepository(); $userNotFound = $repo->getByEmail($user->getEmail()); self::assertNull($userNotFound); $repo->save($user, true); $userFound = $repo->getByEmail($user->getEmail()); self::assertEquals($user->getEmail(), $userFound->getEmail()); } protected function tearDown(): void { parent::tearDown(); $connection = $this ->getContainer() ->get('doctrine') ->getManager() ->getConnection() ; $connection->executeStatement('TRUNCATE TABLE users'); } protected function getRepository(): UserRepository { return $this->getContainer()->get(UserRepository::class); } }
一連のテストを実行すると、モック動作のみを含むテストの単体テストと比較してテストの実行が遅くなることがわかりますが、このプロセス中に Testcontainers がテストで使用するために定義したコンテナをプロビジョニングしているため、これは正常です。 .
最後に、この機能を使用すると、100% のカバー率など、とんでもないことが可能になります。信じられないですか? https://joubertredrat.github.io/symfony-testcontainers でご自身の目で確認できます。
それでは、また会いましょう!
以上がTestcontainers を使用した Symfony での統合テストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。

PHPでのオートローディングは、必要に応じてクラスファイルを自動的にロードし、メモリの使用を削減し、コード組織を強化することでパフォーマンスを向上させます。ベストプラクティスには、PSR-4の使用とコードを効果的に整理することが含まれます。

PHPストリームは、一貫したAPIを介したファイル、ネットワークソケット、圧縮形式などのリソースの処理を統合し、複雑さを抽象化し、コードの柔軟性と効率を高めます。

この記事では、PHPでファイルアップロードサイズの管理を管理し、2MBのデフォルト制限とPHP.ini設定を変更してそれを増やす方法に焦点を当てています。

この記事では、PHP 7.1で導入されたPHPのヌル可能なタイプについて説明し、変数またはパラメーターが指定されたタイプまたはnullのいずれかを可能にします。読みやすさの改善、タイプの安全性、明示的な意図などの利点を強調し、宣言する方法を説明します

この記事では、プログラミングのunset()とlink()関数の違いについて説明し、目的とユースケースに焦点を当てています。 unset()はメモリから変数を削除しますが、link()はファイルシステムからファイルを削除します。どちらもEFFECにとって重要です


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









