Bonjour,
Actuellement je veux refactorisé des tests unitaires, fonctionnels et d'intégration dans un CI/CD pour une application sous symfony 6.4

Je refactorise mon code pour me passer de base de donnée. Pour réaliser mes requêtes sur les routes, auparavant j'utilisais du code classique:

        $client = static::createClient();
        $userRepository = static::getContainer()->get(UserRepository::class);

        // retrieve the test user
        $testUser = $userRepository->findOneByEmail('john.doe@example.com');
        $client->loginUser($testUser);

        // test e.g. the profile page
        $client->request('GET', '/profile');
        $this->assertResponseIsSuccessful();

Je veux donc me passer du userRepository, et ne pas passer par la BDD
Sauf que $client->loginUser() fait appel à la BDD et me renvoit une erreur systématiquement
J'ai essayé d'autres alternatives (inmemoryuser) sans succès. En sachant que je passe par un système de SSO, je ne veux pas de requête de connexion pour mes tests
J'ai essayé d'autres alternatives plus complexes impliquant plus de code sans succès.

J'en suis venu à me poser la question:
Ce type de test ne devrait-il-pas avoir lieu après le déploiement ?
AI-je une mauvaise compréhension du role et du moment de l'execution de certains tests ?

Si ces tests ont lieu après le déploiement, avec la possibiltié de créer une base de donnée test, le problème serait réglé, mais je ne suis pas certains de cette pratique

Sinon, avez-vous une idée ou une solution pour ce problème ?
Merci d'avance

1 réponse


pour ces genres de cas j'utilise une base de donnée sqlite en phase de test, github action ou gitlab ci supporte docker, tu pourrais donc définir tes services avec docker compose et avoir une bdd dispo en CI - github action aussi supporte des services (comme mysql etc...)

name: Test
on: [ push, pull_request ]
jobs:
    test:
        name: PHPUnit Symfony Testing
        runs-on: ubuntu-latest
        services:
            mysql:
                image: mysql:latest
                env:
                    MYSQL_ALLOW_EMPTY_PASSWORD: false
                    MYSQL_ROOT_PASSWORD: root
                    MYSQL_DATABASE: root
                ports:
                    - 3306/tcp
                options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
        strategy:
            fail-fast: false

exemple :

-   name: Run tests
         run: vendor/bin/phpunit
         env:
            DATABASE_URL: mysql://root:root@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/app

et tu peux préciser l'url de la bdd avec des variables d'environnements