PHPackages                             mekras/symfony-bundle-testing - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. mekras/symfony-bundle-testing

ActiveSymfony-bundle[Testing &amp; Quality](/categories/testing)

mekras/symfony-bundle-testing
=============================

Инструменты для тестирования пакетов Symfony

0.3.0(1y ago)0226MITPHPPHP ^7.4|^8.0

Since Jul 1Pushed 1y ago1 watchersCompare

[ Source](https://github.com/mekras/symfony-bundle-testing)[ Packagist](https://packagist.org/packages/mekras/symfony-bundle-testing)[ RSS](/packages/mekras-symfony-bundle-testing/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (2)Dependencies (10)Versions (4)Used By (0)

Инструменты для тестирования пакетов Symfony
============================================

[](#инструменты-для-тестирования-пакетов-symfony)

Эта библиотека предоставляет инструменты для автоматизированного тестирования пакетов (bundles) Symfony.

Оглавление
----------

[](#оглавление)

- [Установка](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
    - [Требования](#%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
    - [Установка через Composer](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-composer)
- [Интеграционные тесты](#%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D1%8B)
    - [Основной класс интеграционных тестов](#%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9-%D0%BA%D0%BB%D0%B0%D1%81%D1%81-%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2)
    - [Определение имени главного класса вашего пакета](#%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8-%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%B2%D0%B0%D1%88%D0%B5%D0%B3%D0%BE-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0)
    - [Написание тестов](#%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2)
    - [Как проверить, что в контейнере есть нужна служба?](#%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C-%D1%87%D1%82%D0%BE-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B5-%D0%B5%D1%81%D1%82%D1%8C-%D0%BD%D1%83%D0%B6%D0%BD%D0%B0-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0)
    - [Как получить службу из контейнера?](#%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D1%83-%D0%B8%D0%B7-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0)
    - [Как добавить другие пакеты в контейнер?](#%D0%BA%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80)
    - [Как устранить ошибку «service or alias has been removed or inlined»?](#%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83-service-or-alias-has-been-removed-or-inlined)

Установка
---------

[](#установка)

### Требования

[](#требования)

- PHP 7.4+
- Symfony 5.4+

### Установка через Composer

[](#установка-через-composer)

В консоли в корне проекта выполните команду:

```
composer require --dev mekras/symfony-bundle-testing

```

Интеграционные тесты
--------------------

[](#интеграционные-тесты)

Интеграционные тесты позволяют проверить как в действительности будет вести себя ваш код во взаимодействии с Symfony.

### Основной класс интеграционных тестов

[](#основной-класс-интеграционных-тестов)

Рекомендуется в каждом проекте создавать отдельный основной класс для всех классов ваших интеграционных тестов, как единую точку определения конфигурации тестов и добавления общих методов.

Этот класс должен быть унаследован от [BaseSymfonyIntegrationTestCase](src/BaseSymfonyIntegrationTestCase.php).

Пример — `tests/Integration/IntegrationTestCase.php`:

```
namespace Acme\MyBundle\Tests\Integration;

use Mekras\Symfony\BundleTesting\BaseSymfonyIntegrationTestCase;

abstract class IntegrationTestCase extends BaseSymfonyIntegrationTestCase
{
}
```

Все классы интеграционных тестов должны наследоваться либо от этого класса, либо от `BaseSymfonyIntegrationTestCase`.

### Определение имени главного класса вашего пакета

[](#определение-имени-главного-класса-вашего-пакета)

Важным элементом интеграционного тестирования пакета Symfony является знание его главного класса (`*Bundle`). За это отвечает метод `BaseSymfonyIntegrationTestCase::getBundleClass()`. Если вы следуете [соглашениям по именованию пакетов](https://symfony.com/doc/current/bundles/best_practices.html#bundles-naming-conventions), то `getBundleClass()` должен правильно определять и возвращать имя класса. Если же он этого не делает, можете переопределить его в своём `IntegrationTestCase`:

```
namespace Acme\MyBundle\Tests\Integration;

use Acme\MyBundle\AcmeMyBundle;
use Mekras\Symfony\BundleTesting\BaseSymfonyIntegrationTestCase;

abstract class IntegrationTestCase extends BaseSymfonyIntegrationTestCase
{
    protected function getBundleClass(): string
    {
        return MyBundle::class;
    }
}
```

### Написание тестов

[](#написание-тестов)

Костяк теста выглядит так:

```
namespace Acme\MyBundle\Tests\Integration;

final class SomeTest extends SymfonyIntegrationTestCase
{
    public function testSomething(): void
    {
        // Создаём тестовый контейнер зависимостей:
        $container = $this->createContainer();

        // Здесь можно настраивать контейнер зависимостей и задавать ожидания.

        // Компилируем контейнер, чтобы подготовить его к тестам:
        $container->compile();

        // Здесь можно писать утверждения.
    }
}
```

Как правило, вначале надо создать контейнер зависимостей, т. к. почти вся интеграция с Symfony ведётся через него. Метод `$this->createContainer()` создаёт тестовый контейнер (он подробно описан ниже), который будет являться основной ваших тестов.

Контейнер создаётся с минимально необходимой предварительной конфигурацией:

- устанавливаются важные параметры `kernel.*`;
- регистрируются пакеты, возвращаемые методом `getRequiredBundles()` (см. далее);
- регистрируется тестируемый пакет, определяемый описанным выше методом `getBundleClass()`;
- выполняется ряд других действий.

После создания контейнера, но **до его компиляции** вы можете произвести с ним дополнительные действия по настройке или задать ожидания, как будет описано ниже.

Далее контейнер необходимо скомпилировать, чтобы привести его в состояние, соответствующее времени выполнения приложения. Это делается методом `$container->compile()`.

После компиляции можно выполнить нужные действия по проверке получившегося контейнера.

Ниже эти вопросы будут рассмотрены подробнее.

### Тестовый контейнер зависимостей

[](#тестовый-контейнер-зависимостей)

Сердцем интеграционных тестов является контейнер зависимостей, позволяющий проверить правильность регистрации в нём расширений вашего пакета, взаимодействие с ядром Symfony и/или другими пакетами.

Для создания тестового контейнера используйте метод `BaseSymfonyIntegrationTestCase::createContainer`:

```
final class SomeTest extends SymfonyIntegrationTestCase
{
    public function testSomething(): void
    {
        $container = $this->createContainer();

        // …
    }
}
```

Метод создаст и вернёт новый экземпляр класса [TestContainerBuilder](src/DependencyInjection/TestContainerBuilder.php), расширяющего стандартный `ContainerBuilder` Symfony описанными ниже возможностями.

В одном тесте можно создать несколько независимых контейнеров.

#### Загрузка расширений контейнера зависимостей

[](#загрузка-расширений-контейнера-зависимостей)

Метод предназначен для тестирования расширений контейнера зависимостей Symfony и позволяет проверить, правильно ли эти расширения загружаются, правильно ли настраивают контейнер.

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $container->loadExtension(new MyExtension());
    $container->compile();

    self::assertTrue($container->hasExtension('my_extension_alias'));
}
```

#### Загрузка в контейнер зависимостей других пакетов

[](#загрузка-в-контейнер-зависимостей-других-пакетов)

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $container->registerBundle(MonologBundle::class);
    $container->compile();

    self::assertTrue($container->hasExtension('monolog'));
}
```

### Как проверить, что в контейнере есть нужна служба?

[](#как-проверить-что-в-контейнере-есть-нужна-служба)

Предположим, ваш пакет должен зарегистрировать в контейнере службы с идентификаторами `some.service.id` и `щерук.service.id`. Проверить, что это действительно делается, можно так:

```
public function testFooServiceExists(): void
{
    $container = $this->createContainer();
    $container->expectDefinitionsExists(
      'some.service.id',
      'other.service.id',
      // …
    );
    $container->compile();
    // Если не добавить эту строку, то PHPUnit может ругаться на отсутствие утверждений.
    $this->expectNotToPerformAssertions();
}
```

### Как получить службу из контейнера?

[](#как-получить-службу-из-контейнера)

Публичные службы можно получить обычным способом — через метод `Container::get()`:

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $container->compile();

    $someService = $container->get('some.service.id');
    // Ваши проверки…
}
```

Приватные службы можно получать через локатор или сделать публичными.

Получение через локатор:

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $this->addToLocator(['some.private.service.id'], $container);
    $container->compile();

    $someService = $this->getFromLocator('some.private.service.id', $container);
    // Ваши проверки…
}
```

Сделать публичной:

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $container->makePublic('some.private.service.id');
    $container->compile();

    $someService = $container->get('some.private.service.id');
    // Ваши проверки…
}
```

### Как добавить другие пакеты в контейнер?

[](#как-добавить-другие-пакеты-в-контейнер)

Если вы хотите протестировать интеграцию с другими пакетами, их можно добавить в тестовый контейнер с помощью метода `BaseSymfonyIntegrationTestCase::getBundleClass()`.

Для одного теста это можно сделать непосредственно в нём между созданием и компиляцией контейнера:

```
public function testSomething(): void
{
    $container = $this->createContainer();
    // Добавляет в контейнер MonologBundle:
    $container->registerBundle(MonologBundle::class);
    $container->compile();

    // Ваши проверки…
}
```

Если это нужно для всех ваших тестов, то рекомендуется переопределить метод `createContainer` в основном классе:

```
namespace Acme\MyBundle\Tests\Integration;

use Mekras\Symfony\BundleTesting\BaseSymfonyIntegrationTestCase;
use Symfony\Bundle\MonologBundle\MonologBundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;

abstract class IntegrationTestCase extends BaseSymfonyIntegrationTestCase
{
    protected function createContainer(array $public = []): ContainerBuilder
    {
        $container = parent::createContainer($public);

        $container->registerBundle(MonologBundle::class);

        return $container;
    }
}
```

Так же есть возможность сразу задать список пакетов, которые надо загружать, переопределив метод `getRequiredBundles()`:

```
namespace Acme\MyBundle\Tests\Integration;

use Mekras\Symfony\BundleTesting\BaseSymfonyIntegrationTestCase;
use Symfony\Bundle\MonologBundle\MonologBundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;

abstract class IntegrationTestCase extends BaseSymfonyIntegrationTestCase
{
    protected function getRequiredBundles(): array
    {
        return \array_merge(
            parent::getRequiredBundles(),
            [
                MonologBundle::class,
            ]
        );
    }
}
```

### Как устранить ошибку «service or alias has been removed or inlined»?

[](#как-устранить-ошибку-service-or-alias-has-been-removed-or-inlined)

Если при извлечении из тестового контейнера вы столкнулись с такой ошибкой:

> The "foo" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.

то решить её можно сделав эту службу публичной, указав её в аргументе `$public` метода `createContainer()`:

```
public function testSomething(): void
{
    $container = $this->createContainer();
    $container->makePublic('some.private.service.id');
    $container->compile();

    $someService = $container->get('some.private.service.id');
    // Ваши проверки…
}
```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance32

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity37

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

3

Last Release

682d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f59cdbde66f36f1f86dad783d2f79e64c17ffdcd0771f73b96b7d9d7ee37b364?d=identicon)[Mekras](/maintainers/Mekras)

---

Top Contributors

[![mekras](https://avatars.githubusercontent.com/u/192067?v=4)](https://github.com/mekras "mekras (3 commits)")

---

Tags

phpunitsymfonyтестирование

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/mekras-symfony-bundle-testing/health.svg)

```
[![Health](https://phpackages.com/badges/mekras-symfony-bundle-testing/health.svg)](https://phpackages.com/packages/mekras-symfony-bundle-testing)
```

###  Alternatives

[behat/behat

Scenario-oriented BDD framework for PHP

4.0k96.8M2.0k](/packages/behat-behat)[lchrusciel/api-test-case

Perfect PHPUnit TestCase for JSON/XML API TDD with Symfony.

4115.5M63](/packages/lchrusciel-api-test-case)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)[liip/test-fixtures-bundle

This bundles enables efficient loading of Doctrine fixtures in functional test-cases for Symfony applications

1798.3M42](/packages/liip-test-fixtures-bundle)[matthiasnoback/symfony-config-test

Library for testing user classes related to the Symfony Config Component

1679.8M395](/packages/matthiasnoback-symfony-config-test)[shopsys/http-smoke-testing

HTTP smoke test case for testing all configured routes in your Symfony project

68258.7k1](/packages/shopsys-http-smoke-testing)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
