shyim/testcontainer
Composer 安装命令:
composer require shyim/testcontainer
包简介
Testcontainers implementation in PHP
关键字:
README 文档
README
Testcontainers is a PHP package that makes it simple to create and clean up container-based dependencies for automated integration/smoke tests. The package is inspired by the Testcontainers project for Java.
Legacy PHP support
The official testcontainers/testcontainers-php library requires PHP 8.1 or newer. If you need to support older PHP versions, including those that are EOL, please check out the community-maintained k-kinzal/testcontainers-php project. The discussion about supporting legacy versions lives in issue #38.
Installation
Add this to your project with composer
composer req --dev testcontainers/testcontainers
Usage/Examples
Starting a general Container
<?php use Testcontainers\Container\GenericContainer; $container = new GenericContainer('nginx:alpine'); // set an environment variable $container->withEnvironment([ 'key1' => 'val1', 'key2' => 'val2' ]); // enable health check for a container $container->withHealthCheckCommand('curl --fail localhost'); // mount current dir to /var/www/html $container->withMount(__DIR__, '/var/www/html');
Normally, you have to wait until the Container is ready. For this you can define a wait rule:
use Testcontainers\Container\GenericContainer; use Testcontainers\Wait\WaitForExec; use Testcontainers\Wait\WaitForLog; use Testcontainers\Wait\WaitForHttp; use Testcontainers\Wait\WaitForHealthCheck; use Testcontainers\Wait\WaitForHostPort; $container = new GenericContainer('nginx:alpine'); // Run mysqladmin ping until the command returns exit code 0 $container->withWait(new WaitForExec(['mysqladmin', 'ping', '-h', '127.0.0.1'])); $container->withWait(new WaitForExec(['mysqladmin', 'ping', '-h', '127.0.0.1']), function($exitCode, $contents) { // throw exception if process result is bad }); // Wait until that message is in the logs $container->withWait(new WaitForLog('Ready to accept connections')); // Wait for an http request to succeed $container->withWait((new WaitForHttp($port))->withMethod('GET')->withPath('/')); // Wait for all bound ports to be open $container->withWait(new WaitForHostPort()); // Wait until the Docker heartcheck is green $container->withWait(new WaitForHealthCheck());
MySQL
<?php use Testcontainers\Modules\MySQLContainer; $container = (new MySQLContainer('8.0')) ->withMySQLDatabase('foo') ->withMySQLUser('bar', 'baz') ->start(); $pdo = new \PDO( sprintf( 'mysql:host=%s;port=%d', $container->getHost(), $container->getFirstMappedPort() ), 'bar', 'baz', ); // Do something with PDO
MariaDB
<?php use Testcontainers\Modules\MariaDBContainer; $container = $container = (new MariaDBContainer()) ->withMariaDBDatabase('foo') ->withMariaDBUser('bar', 'baz') ->start(); $pdo = new \PDO( sprintf( 'mysql:host=%s;port=%d', $container->getHost(), $container->getFirstMappedPort() ), 'bar', 'baz', ); // Do something with PDO
PostgreSQL
<?php use Testcontainers\Modules\PostgresContainer; $container = (new PostgresContainer()) ->withPostgresUser('bar') ->withPostgresDatabase('foo') ->start(); $pdo = new \PDO( sprintf( 'pgsql:host=%s;port=%d;dbname=foo', self::$container->getHost(), self::$container->getFirstMappedPort() ), 'bar', 'test', ); // Do something with PDO
Redis
use Testcontainers\Modules\RedisContainer; $container = (new RedisContainer()) ->start(); $redis = new \Redis(); $redis->connect($container->getHost(), $container->getFirstMappedPort()); // Do something with Redis
OpenSearch
use Testcontainers\Modules\OpenSearchContainer; $container = (new OpenSearchContainer()) ->withDisabledSecurityPlugin() ->start(); // Do something with opensearch
Use with symfony
# config/packages/test/services.yaml parameters: 'doctrine.dbal.connection_factory.class': App\Tests\TestConnectionFactory
namespace App\Tests; use Doctrine\Bundle\DoctrineBundle\ConnectionFactory; use Doctrine\Common\EventManager; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Tools\DsnParser; use Testcontainers\Modules\PostgresContainer; class TestConnectionFactory extends ConnectionFactory { static $testDsn; public function __construct(array $typesConfig, ?DsnParser $dsnParser = null) { if (!$this::$testDsn) { $psql = (new PostgresContainer()) ->withPostgresUser('user') ->withPostgresPassword('password') ->withPostgresDatabase('database') ->start(); $this::$testDsn = sprintf('postgresql://user:password@%s:%d/database?serverVersion=14&charset=utf8', $psql->getAddress(), $psql->getFirstMappedPort()); } parent::__construct($typesConfig, $dsnParser); } public function createConnection(array $params, ?Configuration $config = null, ?EventManager $eventManager = null, array $mappingTypes = []) { $params['url'] = $this::$testDsn; return parent::createConnection($params, $config, $eventManager, $mappingTypes); } }
License
shyim/testcontainer 适用场景与选型建议
shyim/testcontainer 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 21.64k 次下载、GitHub Stars 达 208, 最近一次更新时间为 2022 年 10 月 23 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「docker」 「testcontainers」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 shyim/testcontainer 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 shyim/testcontainer 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 shyim/testcontainer 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Testcontainers implementation in PHP
Docker based testing environment for shopware projects.
The Laragoon utility package
Docker compose for Robo Task Runner
Deployment command
Pest plugin for testing containers
统计信息
- 总下载量: 21.64k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 208
- 点击次数: 14
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2022-10-23