shyim/testcontainer 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

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

MIT

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 我们能提供哪些服务?
定制开发 / 二次开发

基于 shyim/testcontainer 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 21.64k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 208
  • 点击次数: 14
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 208
  • Watchers: 5
  • Forks: 32
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-10-23