
Wenn es um das Testen eines Shopware 6 Plugins geht, gibt es zwei Arten von Tests, die durchgeführt werden können:
- Testen des Codes selbst (mehr in der offiziellen Dokumentation)
- PHP-Unit-Tests
- Jest-Unit-Tests in Shopwares Storefront
- Jest-Unit-Tests in Shopwares Administration
- End-to-End (E2E) Testing
- 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.ymlstages:
- 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.ymlstages:
- 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:
- Wir deaktivieren das automatische Klonen des Repositories (16)
- Wir binden einen Datenbank-Service ein (9-14)
- Wir setzen einige erforderliche Shopware-Umgebungsvariablen (20-23)
- Erstellen ein leeres Shopware-Projekt mit PHPUnit und Xdebug (27-36)
- 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.ymlstages:
- 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
