Testen, Bauen und Veröffentlichen eines Shopware 6 Plugins mit GitLab CI - Teil 3 - Testen

Insider Blog

Wenn es um das Testen eines Shopware 6 Plugins geht, gibt es zwei Arten von Tests, die durchgeführt werden können:

  1. Testen des Codes selbst (mehr in der offiziellen Dokumentation)
    1. PHP-Unit-Tests
    2. Jest-Unit-Tests in Shopwares Storefront
    3. Jest-Unit-Tests in Shopwares Administration
    4. End-to-End (E2E) Testing
  2. Sicherstellen einer hohen Code-Qualität (mehr in der offiziellen Dokumentation)

Code-Qualität

Fangen wir mit der Code-Qualität an, da es einfacher ist, diese außerhalb einer CI/CD-Umgebung auszuführen.

Wir werden wieder das shopware-cli verwenden.

shopware-cli extension validate --full --reporter summary .

Dies wird alle Tests ausführen, die hier beschrieben sind, und hoffentlich eine Ausgabe wie diese erzeugen:

✖ 0 problems (0 errors, 0 warnings)

Falls Fehler auftreten, schaue in der Shopware-Dokumentation nach, wie diese zu beheben sind, und führe nur die fehlgeschlagenen Tests erneut aus, wie hier beschrieben.

Code-Qualität Pipeline

Nun werden wir das Ganze in GitLab ausführen.

<plugin-root>/.gitlab-ci.yml
stages:
  - test

code-quality:
   image:
      name: ghcr.io/shopware/shopware-cli:latest-php-8.2
      entrypoint: [""]
   stage: test
   script:
      - shopware-cli extension validate --full . | tee report.json
   artifacts:
      reports:
         codequality: report.json
   rules:
      - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
        when: never
      - if: $CI_COMMIT_BRANCH

Diese Pipeline wird auf dem Standard-Branch und bei Merge-Request-Pipelines ausgeführt.

Das Ausführen auf dem Standard-Branch vor dem Bauen und Veröffentlichen verhindert, dass versehentlich ein Release mit geringer Qualität erstellt wird.

Ein nettes Extra für die MR-Pipeline ist die Integration des Code-Quality-Reports!

PHP-Unit-Tests

Zuerst müssen wir PHPUnit konfigurieren, indem wir der offiziellen Shopware-Dokumentation folgen.

Wir werden uns hier nicht auf diesen Prozess konzentrieren. Wenn alles eingerichtet ist, sollten wir in der Lage sein, unseren Test wie folgt im Root-Verzeichnis unseres Shopware-Projekts auszuführen:

./vendor/bin/phpunit --configuration="custom/static-plugins/SwagBasicExample"

PHPUnit Pipeline

Das Ausführen von PHPUnit für ein Plugin erfordert eine vollständige Shopware-Instanz. Glücklicherweise kann uns das shopware-cli dabei helfen.

<plugin-root>/.gitlab-ci.yml
stages:
   - test

phpunit:
  stage: test
  image:
    name: ghcr.io/shopware/shopware-cli:latest-php-8.2
    entrypoint: [""]
  services:
    - name: mysql:8.3.0
      alias: test_database
      variables:
        MYSQL_SKIP_TEST_DB: 'yes'
        MYSQL_ALLOW_EMPTY_PASSWORD: yes
  variables:
    GIT_STRATEGY: none
    SHOPWARE_ROOT: ${CI_PROJECT_DIR}/shopware
    SHOPWARE_VERSION: 6.6.10.13
    
    APP_SECRET: def00000bb5acb32b54ff8ee130270586eec0e878f7337dc7a837acc31d3ff00f93a56b595448b4b29664847dd51991b3314ff65aeeeb761a133b0ec0e070433bff08e48
    MESSENGER_TRANSPORT_DSN: sync://
    DATABASE_URL: mysql://root@test_database/shopware
    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer

    XDEBUG_MODE: coverage
  before_script:
    - apk add --no-cache php-8.2-xdebug
    - shopware-cli project create shopware ${SHOPWARE_VERSION}
    - cd $SHOPWARE_ROOT
    - composer req --dev shopware/dev-tools phpunit/phpunit
    - git clone "https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" "custom/plugins/${CI_PROJECT_NAME}"
    - cd custom/plugins/${CI_PROJECT_NAME}
    - git checkout ${CI_COMMIT_SHA}
    - cd ${SHOPWARE_ROOT}
    - composer require $(composer -d custom/plugins/${CI_PROJECT_NAME} config name)
    - cd custom/plugins/${CI_PROJECT_NAME}
  script:
    - ${SHOPWARE_ROOT}/vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml

  cache:
    - key: $CI_JOB_NAME
      paths:
        - $COMPOSER_CACHE_DIR
  coverage: /^\s*Lines:\s*\d+.\d+\%/
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.cobertura.xml
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
      when: never
    - if: $CI_COMMIT_BRANCH

Lass uns das ein wenig erklären:

  1. Wir deaktivieren das automatische Klonen des Repositories (16)
  2. Wir binden einen Datenbank-Service ein (9-14)
  3. Wir setzen einige erforderliche Shopware-Umgebungsvariablen (20-23)
  4. Erstellen ein leeres Shopware-Projekt mit PHPUnit und Xdebug (27-36)
  5. Führen PHPUnit mit Code-Coverage-Generierung als Text und im Cobertura-Format aus (38)

Wie die Code-Quality-Pipeline nutzt auch diese die Vorteile des GitLab-Coverage-Reportings voll aus.

Alles zusammenfügen

Für diesen Teil lassen wir den Build- und Release-Teil weg.

<plugin-root>/.gitlab-ci.yml
stages:
   - test

phpunit:
  stage: test
  image:
    name: ghcr.io/shopware/shopware-cli:latest-php-8.2
    entrypoint: [""]
  services:
    - name: mysql:8.3.0
      alias: test_database
      variables:
        MYSQL_SKIP_TEST_DB: 'yes'
        MYSQL_ALLOW_EMPTY_PASSWORD: yes
  variables:
    GIT_STRATEGY: none
    SHOPWARE_ROOT: ${CI_PROJECT_DIR}/shopware
    SHOPWARE_VERSION: 6.6.10.13
    
    APP_SECRET: def00000bb5acb32b54ff8ee130270586eec0e878f7337dc7a837acc31d3ff00f93a56b595448b4b29664847dd51991b3314ff65aeeeb761a133b0ec0e070433bff08e48
    MESSENGER_TRANSPORT_DSN: sync://
    DATABASE_URL: mysql://root@test_database/shopware
    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer

    XDEBUG_MODE: coverage
  before_script:
    - apk add --no-cache php-8.2-xdebug
    - shopware-cli project create shopware ${SHOPWARE_VERSION}
    - cd $SHOPWARE_ROOT
    - composer req --dev shopware/dev-tools phpunit/phpunit
    - git clone "https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" "custom/plugins/${CI_PROJECT_NAME}"
    - cd custom/plugins/${CI_PROJECT_NAME}
    - git checkout ${CI_COMMIT_SHA}
    - cd ${SHOPWARE_ROOT}
    - composer require $(composer -d custom/plugins/${CI_PROJECT_NAME} config name)
    - cd custom/plugins/${CI_PROJECT_NAME}
  script:
    - ${SHOPWARE_ROOT}/vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml

  cache:
    - key: $CI_JOB_NAME
      paths:
        - $COMPOSER_CACHE_DIR
  coverage: /^\s*Lines:\s*\d+.\d+\%/
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.cobertura.xml
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
      when: never
    - if: $CI_COMMIT_BRANCH

code-quality:
   image:
      name: ghcr.io/shopware/shopware-cli:latest-php-8.2
      entrypoint: [""]
   stage: test
   script:
      - shopware-cli extension validate --full . | tee report.json
   artifacts:
      reports:
         codequality: report.json
   rules:
      - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
        when: never
      - if: $CI_COMMIT_BRANCH

Autor

Steckbrief

Veröffentlicht:

March 26, 2026

Kategorien:

Was uns bewegt, DevOps

Tags:

DevOps, Open Source, Shopware
Vorheriger Artikel