Biblioteca de testes de integração em PHP para bancos de dados e outros testes comuns relacionados à infraestrutura.
Ele é desenvolvido como um conjunto de extensões para PHPUnit que se conecta a diferentes eventos e executa seus fixtures.
Atualmente você pode executar fixtures customizadas nos seguintes hooks do PHPUnit:
AntesPrimeiroTeste
Antes do teste
Pós-teste
Depois do último teste
WIP: acessórios de teste específicos do AMQP com WithBeforeTestFixtureName e WithAfterTestFixtureName
Unidade PHP
Através do compositor
composer require --dev hrodic/php-integration-testing
No arquivo XML de configuração do PHPUnit você deve especificar a extensão com sua configuração.
Você pode especificar o nome do arquivo de configuração que usará. O padrão é .integration-testing.json
<extensions> <extension class="IntegrationTestingPHPUnitRunnerExtensionHandler"> <arguments> <string>.integration-testing.json</string> </arguments> </extension> </extensions>
Você também verifica o exemplo phpunit-integration.xml.dist
Se precisar de ajuda com extensões PHPUnit, consulte a Documentação Oficial
Se precisar testar a integração do MySQL ou MariaDB, use a extensão do driver PDO.
Requer parâmetros de configuração que podem ser encontrados no arquivo de configuração json.
Os parâmetros mais importantes são DSN, nome de usuário e senha do seu banco de dados + algumas definições de caminho do equipamento.
Exemplo:
"pdo": { "dsn": "mysql:host=localhost:3306;dbname=test;charset=utf8", "user": "test", "password": "test", "fixtures": { "beforeFirstTest": { "path": "tests/fixtures/before-first-test", "extension": "sql" }, "beforeTest": { "path": "tests/fixtures/before-test", "extension": "sql" }, "afterTest": { "path": "tests/fixtures/after-test" }, "afterLastTest": { "path": "tests/fixtures/after-last-test" } } },
Você também pode experimentar acessórios e operações AMQP (testado no RabbitMQ).
Configure sua conectividade e as operações de gancho usando o arquivo de configuração.
Notas:
As definições de gancho são opcionais, então basta configurar as que você precisa.
Você só pode publicar mensagens em beforeFirstTest
e em beforeTest
.
Você pode limpar filas em todos os quatro ganchos.
extensão de arquivo de corpos de mensagens para publicar padrões para json
use routing_key
se você tiver sua exchange configurada como direct
. Você pode defini-lo como uma string vazia se fanout
"amqp": { "host": "localhost", "port": 5672, "user": "test", "password": "test", "vhost": "/", "fixtures": { "beforeFirstTest": { "purgeQueues": [ "before-first-test-queue" ], "publishMessages": [ { "exchange": "test-exchange", "queue": "before-first-test-queue", "routing_key": "before-first-test", "path": "tests/fixtures/before-first-test", "extension": "json" } ] }, "beforeTest": { "purgeQueues": [ "before-test-queue" ], "publishMessages": [ { "exchange": "test-exchange", "queue": "before-test-queue", "routing_key": "before-test", "path": "tests/fixtures/before-test" } ] }, "afterTest": { "purgeQueues": [ "before-test-queue" ] }, "afterLastTest": { "purgeQueues": [] } } }
Um fixture PDO é apenas um arquivo SQL.
Todos os fixtures localizados em uma categoria específica de hook serão executados em ordem e dentro de uma transação.
A forma como você cria o SQL e a integridade do banco de dados em cada estágio depende de você. A biblioteca não obriga você a seguir nenhuma convenção, embora seja comum configurar os equipamentos no início e limpar a bagunça após cada teste.
Você pode criar, inserir, excluir ou o que quer que você configure seu usuário para fazer. Lembre-se, seu banco de dados de teste deve estar isolado de qualquer banco de dados real!
Todos os quatro tipos de ganchos de fixação podem ser colocados no diretório de sua preferência.
Para ganchos BeforeTest e AfterTest, que ocorrem em cada teste específico, você também pode fornecer fixtures específicos para serem executados logo após os fixtures genéricos Before e After implementando as interfaces WithBeforeTestFixtureName e/ou WithAfterTestFixtureName.
final class YourIntegrationTest extends TestCase implements WithBeforeTestFixtureName, WithAfterTestFixtureName { private const FIXTURE_NAME = 'pdo-integration-test'; public static function getAfterTestFixtureName(): string { return self::FIXTURE_NAME; } public static function getBeforeTestFixtureName(): string { return self::FIXTURE_NAME; } public function testYourRepositoryHere(): void { // arrange // act // assert against real database (your fixtures are already there!) } }
A Extensão irá verificar se os métodos estão definidos e utilizá-los para localizar subdiretórios dentro dos diretórios principais BEFORE_TEST_PDO_FIXTURES_PATH e AFTER_TEST_PDO_FIXTURES_PATH.
Se você der uma olhada na pasta testes/fixtures, você verá um exemplo de como organizar seus fixtures. Você pode ter vários arquivos SQL e a extensão irá lê-los e executá-los em ordem.
├── after-last-test # AFTER_LAST_TEST_PDO_FIXTURES_PATH, executed once, at the end │ └── 01.sql ├── after-test # AFTER_TEST_PDO_FIXTURES_PATH, executed after each test │ ├── 01.sql │ └── pdo-integration-test # executed after each test inside the class that defines this fixture name │ └── 01.sql ├── before-first-test # BEFORE_FIRST_TEST_PDO_FIXTURES_PATH, executed once, at the beginning │ └── 01.sql └── before-test # BEFORE_TEST_PDO_FIXTURES_PATH, executed before each test ├── 01.sql └── pdo-integration-test # executed before each test inside the class that defines this fixture name └── 01.sql
O teste de integração requer que alguma infraestrutura esteja instalada.
Esta biblioteca pressupõe (você pode verificar o arquivo docker-compose.yml para se inspirar) que você tem um banco de dados acessível ou outra infraestrutura já instalada e o banco de dados foi criado.