+```
+
+### Fallback language/translations
+
+Extensions must work independently of the system language.
+
+If a translation is missing (e.g., Spanish), a proper fallback (usually English) must be used.
+
+If your extension is available in multiple languages, define them in your Shopware Account under “Translations into the following languages are available,” located in the "Description & images" section.
+
+We review:
+
+* Text snippets
+* `config.xml`
+* `composer.json`
+
+### Reserve your extension name with a store preview
+
+To secure an idea early, create a preview in your Shopware Account. Request this by providing placeholder images, meaningful use cases, key features, a description, and an expected release month. No binary upload is required.
+
+### Extension master data/license
+
+The license selected in your Shopware Account must match the license defined in `composer.json`. The selected license cannot be changed after the extension has been created. Changes require creating a new extension with a new technical name and uploading it again.
+
+## Screenshots and media requirements
+
+* Use English-only screenshots for the English store listing and preview images.
+* Screenshots in German for the German store description are optional.
+* Only images that represent or show the function of the extension are permissible.
+* Advertising for other extensions or services is not permitted.
+* Ensure that screenshots show the extension's functionality in action in the Storefront and administration, as well as configuration options and how-to-use details.
+* We recommend screenshots showing mobile and desktop views.
+
+:::info
+[How To - Add images and icons to extensions](https://docs.shopware.com/en/account-en/adding-pictures-and-icons/how-to)
+:::
+
+## Preview requirements
+
+* A preview image must be available in the Extension Manager.
+* Store a valid favicon named `plugin.png` (112x112px) under `src/Resources/config/`. This favicon will help you identify your extension in the `Administration > Extension Manager` module.
+* [Themes](../../plugins/themes/index.md) require a preview image in the Theme Manager.
+* [Shopping World elements](../../../concepts/commerce/content/shopping-experiences-cms.md#elements) must include an element icon.
+
+Read our [How to request a preview](https://docs.shopware.com/en/account-en/extension-partner/extensions?category=account-en/extension-partner#how-can-i-request-a-preview) guide for additional help.
+
+## Demo shop requirements
+
+* URLs must not contain `http:` or `https:`.
+* Test environments will be automatically deleted after two weeks, so do not link to them.
+
+## Manufacturer profile requirements
+
+The manufacturer profile exists in your account under Shopware Account > Extension Partner > [Extension Partner profile](https://account.shopware.com/producer/profile).
+
+* A manufacturer logo is required.
+* No iframes, tracking, or external scripts are allowed.
+* External sources must use HTTPS.
+* Must contain accurate English and German descriptions.
+
+::: info
+The source code's descriptions, profiles, and instructions do not allow iframes, external scripts, or tracking pixels. Custom styles may not overwrite the original Shopware styles. External sources must be included via https.
+:::
+
+::: info
+You can no longer advertise Shopware certificates within an extension's description, images, or your manufacturer profile.
+Manufacturer/partner certificates are dynamically loaded at the end of each extension description and published by Shopware.
+:::
+
+## Data Protection
+
+If the personal data of customers, including store operators and their customers, is processed according to Art. 28 DSGVO:
+
+* Subprocessor information must be declared.
+* Additional processors must be listed accordingly, under "further subprocessors."
+
+An extension with a name that directly reflects its functional purpose is permissible, even if it shares the same name as another extension.
+
+The store display name must be used for `composer.json` and `config.xml`.
+
+Not allowed:
+
+* Inline styles.
+* Certificates in descriptions.
+* Iframes, tracking pixels, external scripts.
+
+We allow up to two YouTube videos embedded in your extension description.
+
+:::info
+Video content—especially explainer videos, product demos, and tutorials—increases awareness and trust and has proven to convert potential customers better than other content types.
+:::
+
+## Functional requirements
+
+All extensions must:
+
+* Work without 500 errors.
+* Avoid 400 errors unless they are related to an API call.
+* Be installable and uninstallable without issues.
+* During uninstall, users must be able to choose in the Extension Manager whether to "completely delete or "keep the app data, text snippets, media folder, including own media and table adjustments." The free [Adminer](https://store.shopware.com/en/frosh79014577529f/adminer-for-admin.html) extension from Friends of Shopware enables you to do this via your provided test environment.
+* Avoid extending or overwriting the Extension Manager.
+* Properly register cookies in the [Cookie Consent Manager](../../../guides/plugins/plugins/storefront/add-cookie-to-manager).
+ * Every cookie set from the store URL should be optional and not technically required for running Shopware. We differentiate between "Technically required", "Marketing," and "Comfort features."
+ * All cookies must appear (unchecked) in the cookie configuration box in the frontend.
+* Do not introduce severe performance regressions.
+* Do not break Storefront SEO, structured data, or canonical logic.
+* If the extension publishes messages to the message queue, each message must not exceed 262,144 bytes (256 KB). This limitation is set by common message queue workers.
+* After uninstalling the extension, Shopping Experiences must continue to work in the frontend.
+
+### Plugin-specific requirements
+
+These apply only to plugins:
+
+* [Composer dependencies](../../../guides/plugins/plugins/plugin-fundamentals/using-composer-dependencies) must be declared in `composer.json` so they are traceable.
+ * If `executeComposerCommands() === true` is used, dependencies are installed dynamically and do not need to be bundled.
+* `composer.lock` must not be included in the archive.
+* Deliver uncompiled (readable) JavaScript in addition to compiled assets. Uncompiled sources must be included in a separate folder to allow code review.
+ * Build `main.js` and create the minified code according to our documentation: [Loading the JS files](../../../guides/plugins/plugins/administration/module-component-management/add-custom-field.md#loading-the-js-files) and [Injecting into the Administration](../../../guides/plugins/plugins/administration/module-component-management/add-custom-field.md#injecting-into-the-administration).
+* Only production files may be included in the archive.
+* Unified logs must be written to `/var/log/`.
+* No forbidden PHP statements like `die`, `exit`, or `var_dump` are allowed. See [List of blockers](https://s3.eu-central-1.amazonaws.com/wiki-assets.shopware.com/1657519735/blocker.txt)
+* Shopware must have access to the unminified source code of the extension at all times.
+
+### App-specific requirements
+
+These apply only to apps:
+
+* Per-sales-channel configuration required if using `config.xml``.
+* No loading external files during installation.
+* API integrations must include an API test button.
+* Must not modify Extension Manager.
+* STP agreement required for commission-based integrations.
+* Apps that appear in the Storefront and use a `config.xml` must be able to be configured separately for each sales channel.
+
+## Code and security requirements
+
+* Pass automated code reviews (PHPStan, SonarQube).
+* Do not include development files or unused resources in the binary.
+* Include only necessary dependencies.
+* Use secure cookie settings.
+
+## Composer and dependencies
+
+If the extension includes Composer dependencies:
+
+* All delivered code must be traceable via Composer.
+* The extension must not exceed store size limits.
+
+## Storefront guidelines
+
+* No inline CSS allowed in storefront templates. Use your own classes and let your CSS be compiled by the plugin. See [Add SCSS variables](../../../guides/plugins/plugins/storefront/add-scss-variables.md#add-scss-variables).
+* Avoid using the `!important` rule unless unavoidable.
+* All images must include meaningful `alt` tags, or original `alt` tags from the media manager.
+* All links must include meaningful `title` tags.
+* External links must use `target="_blank"` together with `rel="noopener"`.
+* No `` tags in the storefront templates, which are set to ` `. These are reserved exclusively for content purposes.
+ * However, you may employ ``, for instance.
+* Performance should remain stable (Lighthouse A/B check recommended).
+* Test the frontend and the checkout for new errors throughout the entire Storefront using the Browser Debug Console, paying close attention to JavaScript errors.
+
+## SEO & indexing requirements
+
+* New controller URLs or XHR requests must include the header `X-Robots-Tag: noindex, nofollow`. See [robots meta tag](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag?hl=de#xrobotstag) documentation for additional guidance.
+* Public frontend URLs created by the extension must appear in `sitemap.xml` and include a valid canonical tag, unique meta descriptions, and `title` tags (configurable via Administration or as a text snippet).
+
+## Administration guidelines
+
+* Do not add new main menu entries in the Administration, to preserve look and feel consistency.
+* Create a dedicated media folder with correct thumbnail settings or use an existing one (except for uploads defined in `config.xml`).
+* Custom media folders and their contents must be removed during uninstall.
+* All links must include meaningful `title` tags.
+* All images must include meaningful `alt` tags, or original `alt` tags from the media manager.
+* If your API corresponds via API credentials to external services, provide an API test button. ([Example implementation](https://github.com/shyim/ShyimApiTest) in the system config form)
+* It is possible to validate required credentials while saving them in extension settings. Display a status message in the Administration and log the result in Shopware.
+* If API data is incorrect, an entry must appear in the `/var/log/` file or in the database event log.
+
+### Installation and lifecycle
+
+* The Extension Manager (Debug Console) controls installation, uninstallation, reinstallation, and deletion.
+* Install, uninstall, and reinstall must work without exceptions.
+* No 400/500 errors during install/uninstall are allowed.
+* Users must be able to choose whether to delete or keep extension data.
+* Special PHP requirements must be validated during installation.
+* If validation fails, a growl message must appear in the Administration.
+* Extensions must not modify or overwrite the Extension Manager.
+* Apps must not reload or load external files during installation.
+
+### Error messages and logging
+
+* Error or informational messages can only be recorded in the event log of Shopware's log folder, `/var/log/`.
+* Do not write to Shopware’s default logs or outside the system log directory. This ensures that the log file can never be accessed via the URL.
+* Log files must follow the naming pattern: `MyExtension-Year-Month-Day.log`.
+* Payment apps must use the "plugin logger" service.
+* If storing logs in a database, avoid using custom log tables. Otherwise, you have to implement scheduled cleanup (max retention six months).
+
+### API integrations
+
+If external APIs are used:
+
+* API test button required.
+* Credentials must be validated on save.
+* Success/failure must display a status message in Administration.
+* Errors must be logged in `/var/log/` or the database.
+
+## Commercial and external integrations
+
+If your extension integrates with external services and generates revenue (e.g., interfaces with downstream fees), a Shopware Technology Partner (STP) agreement may be required.
+
+Commission-based integrations must report usage data according to the STP contract:
+
+Every external technology extension needs to track its commission. Below is an example of implementing the tracking logic:
+
+```json
+ {
+ "identifier": "8e167662-6bbb-11eb-9439-0242ac130002",
+ "reportDate": "2005-08-15T15:52:01",
+ "instanceId": "alur24esfaw3ghk",
+ "shopwareVersion": "6.3.1",
+ "reportDataKeys": [
+ {
+ "customer": 3
+ },
+ {
+ "turnover": 440
+ }
+ ]
+ }
+```
+
+`// POST /shopwarepartners/reports/technology` allows partners to send Shopware the info based on the STP contract.
+
+If you have any questions regarding the STP agreement, please contact our sales team at [alliances@shopware.com](mailto:alliances@shopware.com) or call **+44 (0) 203 095 2445 (UK) / 00 800 746 7626 0 (worldwide) / +49 (0) 25 55 / 928 85-0 (Germany)**.
+
+**Progressive Web App:** If your app is Progressive Web App-compatible and you would like the PWA flag, please contact us at [alliances@shopware.com](mailto:alliances@shopware.com).
+
+### External fonts and services
+
+If external fonts (e.g., Google Fonts, Font Awesome) or other third-party services are used, this must be clearly stated in the store description.
+
+If personal data is transferred, update your data protection information accordingly. A tooltip in the extension configuration is recommended to inform users.
+
+## Lighthouse A/B-Testing
+
+Run a [Google Lighthouse](https://developer.chrome.com/docs/lighthouse) audit before and after activating the extension.
+
+Significant regressions in performance, accessibility, best practices, or SEO are allowed. No new console errors may be introduced.
+
+### schema.org/rich snippets A/B-testing checklist
+
+A/B testing can ensure that structured data is valid and that rich results behave correctly across page types.
+
+Use Scheme.org's [Schema Markup Validator](https://validator.schema.org/) and Google's [Rich Result Tester](https://search.google.com/test/rich-results) to check the homepage, categories, and product detail pages — including available products, unavailable products, products with no review, single review, reviews with varied ratings, out-of-stock products, products for future release, and/or any other product configuration and product types (including EAN, MPN, width, length, height, and weight). Also, check for duplicate entries and any new bugs.
+
+## Tools
+
+Use the [Shopware CLI](/development/tooling/cli) to build, validate, and upload Shopware 6 plugin releases to the Community Store. It also supports efficiently managing store descriptions and plugin images.
+
+## Final notes
+
+An extension may be rejected if:
+
+* It violates coding standards.
+* It introduces security issues.
+* It bundles unauthorized files.
+* It breaks storefront behavior.
+* It misrepresents functionality in the store description.
+
+Ensure full compliance before submission to avoid publication delays.
diff --git a/guides/development/monetization/store-review-errors.md b/guides/development/monetization/store-review-errors.md
new file mode 100644
index 0000000000..7c8e6d17c8
--- /dev/null
+++ b/guides/development/monetization/store-review-errors.md
@@ -0,0 +1,167 @@
+---
+nav:
+ title: Store Review Errors
+ position: 30
+
+---
+
+# Common Store Review Errors
+
+These errors apply to all extensions submitted to the Shopware Store (plugins and apps).
+
+## Composer and bootstrap issues
+
+### Missing or invalid `composer.json`
+
+Typical causes:
+
+* `composer.json` missing.
+* Technical name mismatch between Store and `composer.json`.
+* Wrong `extra.shopware-plugin-class`.
+* The extension archive has an incorrect ZIP structure.
+
+Check:
+
+* Store technical name matches the `composer.json` name.
+* `extra.shopware-plugin-class` points to the correct bootstrap class.
+* Namespace matches exactly (case-sensitive).
+* Archive contains correct root folder structure.
+
+Example [reference](https://github.com/FriendsOfShopware/FroshPlatformPerformance/blob/master/composer.json#L20):
+
+**Correct**: `Swag\\MyPlugin\\SwagMyPlugin`
+**Incorrect**: `Swag\\MyPlugin\\SwagMyPluginSW6`
+
+[Extension Meta Information – Explanation of the properties](../../../guides/plugins/plugins/plugin-base-guide#the-composerjson-file)
+
+### Missing bootstrap class
+
+Common causes include:
+
+* Wrong ZIP structure.
+* A typo.
+* Case-sensitive filename mismatch.
+* Namespace mismatch.
+
+### `composer.lock` Problems
+
+Rules:
+
+* `composer.lock` must NOT be included in the archive.
+* Lock file must match `composer.json` before packaging.
+* Run `composer update` if lock is outdated.
+
+## Dependency and version errors
+
+### Missing Shopware packages
+
+An example error might look like `Class Shopware\Storefront\* not found`. To fix:
+
+* Declare required packages correctly and explicitly in `composer.json`: e.g., `"require": {"shopware/frontend": "*"}`.
+* Avoid "*" version constraints. Using "*" may resolve to Early Access (EA) versions, causing review failures.
+* Use proper version ranges (e.g., `~6.1.0`).
+* If needed, set `"minimum-stability": "RC"`.
+
+This example shows the correct format:
+
+```xml
+"require": {
+
+ "shopware/core": "~6.1.0",
+
+ "shopware/storefront": "~6.1.0"
+
+},
+
+"minimum-stability": "RC"
+```
+
+### Class Not Found (EA Version Issue)
+
+In the Shopware 6 Early Access (EA) version,`Class Shopware\Core\System\Snippet\Files\SnippetFileInterface` is not found and cannot be autoloaded, causing the code review to fail.
+
+**Cause**: Composer resolved an Early Access version due to wildcard constraints.
+
+**Solution**: Pin versions and define minimum stability (see above).
+
+## Code & Static Analysis Errors
+
+### Forbidden Statements
+
+Blocked:
+
+* `die`
+* `exit`
+* `var_dump`
+
+### Invalid method usage
+
+You might see `Call to static method *jsonEncode() on an unknown class*`. Shopware always uses `json_encode()` exclusively; there is no fallback.
+
+### Remove dead code
+
+Remove out-commented code from your source code. Ensure there are no unused classes or files.
+
+## Cross-Domain Messaging
+
+Ensure that cross-document messages are sent to the intended domain. Unrestricted messaging will be rejected.
+
+Link: [OWASP Web Security Testing Guide](https://github.com/OWASP/wstg/blob/master/document/4-Web_Application_Security_Testing/11-Client-side_Testing/11-Testing_Web_Messaging.md)
+
+## Cookie and security issues
+
+Cookies must be set securely. All non-essential cookies must be registered in the Cookie Consent Manager.
+
+## Packaging errors and unauthorized files and folders
+
+Extensions submitted to the Shopware Store must not contain development files, temporary artifacts, or unused resources.
+
+* ./tests
+* .DS_Store
+* .editorconfig
+* .eslintrc.js
+* .git
+* .github
+* .gitignore
+* .gitkeep
+* .gitlab-ci.yml
+* .gitpod.Dockerfile
+* .gitpod.yml
+* .phar
+* .php-cs-fixer.cache
+* .php-cs-fixer.dist.php
+* .php_cs.cache
+* .php_cs.dist
+* .prettierrc
+* .stylelintrc
+* .stylelintrc.js
+* .sw-zip-blacklist
+* .tar
+* .tar.gz
+* .travis.yml
+* .zip
+* .zipignore
+* ISSUE_TEMPLATE.md
+* Makefile
+* Thumbs.db
+* __MACOSX
+* auth.json
+* bitbucket-pipelines.yml
+* build.sh
+* composer.lock
+* eslint.config.js
+* grumphp.yml
+* package-lock.json
+* package.json
+* phpdoc.dist.xml
+* phpstan-baseline.neon
+* phpstan.neon
+* phpstan.neon.dist
+* phpunit.sh
+* phpunit.xml.dist
+* phpunitx.xml
+* psalm.xml
+* rector.php
+* shell.nix
+* stylelint.config.js
+* webpack.config.js
diff --git a/guides/development/testing/ci.md b/guides/development/testing/ci.md
new file mode 100644
index 0000000000..6c60684adf
--- /dev/null
+++ b/guides/development/testing/ci.md
@@ -0,0 +1,35 @@
+---
+nav:
+ title: CI
+ position: 10
+
+---
+
+# CI
+
+CI should, at a minimum, run static analysis and coding standards checks alongside the project or extension build to keep artifacts reproducible. Add sanity checks, such as smoke tests and lightweight integration tests, to catch regressions early.
+
+Automated tests — unit, integration, and E2E where feasible — make refactors, upgrades, and dependency changes safer.
+
+:::info
+Follow the [Deployment guide](../../hosting/installation-updates/deployments/index.md) for information about promotion and release.
+:::
+
+## Cross-cutting practices
+
+* Fail fast on coding standards and static analysis before slower E2E tests.
+* Use the ([Shopware CLI formatter](../../../products/cli/formatter.md)) to keep code style consistent and run the bundled validation tools in CI using ([Shopware CLI validation tools](../../../products/cli/validation.md)).
+* Produce artifacts once per commit (ZIP for plugins, deployment-ready image/package for apps, built assets for projects) and promote the same artifact through stages.
+
+## Custom projects
+
+* Reuse the ([Project build command](../../../products/cli/project-commands/build.md)) to compile Storefront and Administration assets and warm caches. Run it in CI so deployments do not rebuild.
+* Use environment-specific config only in deployment, not in CI. See [setup patterns](../../installation/index.md) you can mirror in pipelines.
+* Add smoke tests against the HTTP layer plus DAL-level integration tests for custom entities.
+* Cache Composer/NPM dependencies but keep lock files committed for deterministic builds.
+
+## Custom/Store plugins
+
+* Build and validate with `shopware-cli extension build` ([Extension build command](../../products/cli/extension-commands/build.md)) to ensure the ZIP is reproducible.
+* Run unit/integration tests with the Shopware test environment; keep fixtures inside the plugin to avoid coupling to project data.
+* For Store plugins, add the Shopware Store validations early (linting, metadata, PHPStan) to catch review issues before submission ([Store submission via CLI](../../../products/cli/shopware-account-commands/releasing-extension-to-shopware-store.md)).
diff --git a/guides/plugins/plugins/testing/playwright/actor-pattern.md b/guides/development/testing/e2e-playwright/actor-pattern.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/actor-pattern.md
rename to guides/development/testing/e2e-playwright/actor-pattern.md
diff --git a/guides/plugins/plugins/testing/playwright/best-practices.md b/guides/development/testing/e2e-playwright/best-practices.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/best-practices.md
rename to guides/development/testing/e2e-playwright/best-practices.md
diff --git a/guides/plugins/plugins/testing/playwright/deployment.md b/guides/development/testing/e2e-playwright/deployment.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/deployment.md
rename to guides/development/testing/e2e-playwright/deployment.md
diff --git a/guides/plugins/plugins/testing/playwright/fixtures.md b/guides/development/testing/e2e-playwright/fixtures.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/fixtures.md
rename to guides/development/testing/e2e-playwright/fixtures.md
diff --git a/guides/plugins/plugins/testing/playwright/index.md b/guides/development/testing/e2e-playwright/index.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/index.md
rename to guides/development/testing/e2e-playwright/index.md
diff --git a/guides/plugins/plugins/testing/playwright/install-configure.md b/guides/development/testing/e2e-playwright/install-configure.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/install-configure.md
rename to guides/development/testing/e2e-playwright/install-configure.md
diff --git a/guides/plugins/plugins/testing/playwright/language-agnostic-testing.md b/guides/development/testing/e2e-playwright/language-agnostic-testing.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/language-agnostic-testing.md
rename to guides/development/testing/e2e-playwright/language-agnostic-testing.md
diff --git a/guides/plugins/plugins/testing/playwright/local-development.md b/guides/development/testing/e2e-playwright/local-development.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/local-development.md
rename to guides/development/testing/e2e-playwright/local-development.md
diff --git a/guides/plugins/plugins/testing/playwright/page-object.md b/guides/development/testing/e2e-playwright/page-object.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/page-object.md
rename to guides/development/testing/e2e-playwright/page-object.md
diff --git a/guides/plugins/plugins/testing/playwright/test-data-service.md b/guides/development/testing/e2e-playwright/test-data-service.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/test-data-service.md
rename to guides/development/testing/e2e-playwright/test-data-service.md
diff --git a/guides/plugins/plugins/testing/playwright/test-suite-types.md b/guides/development/testing/e2e-playwright/test-suite-types.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/test-suite-types.md
rename to guides/development/testing/e2e-playwright/test-suite-types.md
diff --git a/guides/plugins/plugins/testing/playwright/test.md b/guides/development/testing/e2e-playwright/test.md
similarity index 100%
rename from guides/plugins/plugins/testing/playwright/test.md
rename to guides/development/testing/e2e-playwright/test.md
diff --git a/guides/development/testing/index.md b/guides/development/testing/index.md
new file mode 100644
index 0000000000..80f1b0ae4e
--- /dev/null
+++ b/guides/development/testing/index.md
@@ -0,0 +1,63 @@
+---
+nav:
+ title: Testing
+ position: 80
+
+---
+
+# Testing
+
+This section covers automated testing strategies and quality requirements for Shopware extensions.
+
+## End-to-End testing
+
+For simulating real user journeys and integration scenarios, Shopware recommends end-to-end (E2E) testing. Playwright is the officially supported tool for automating entire workflows across the application.
+
+Playwright provides:
+
+* Preconfigured fixtures
+* Storefront and Administration page objects
+* API clients
+* Test data helpers
+
+
+
+## Unit testing
+
+Shopware supports both PHP backend logic and JavaScript components (for Storefront and Administration). Unit tests validate isolated logic in your extension.
+
+### PHP (PHPUnit)
+
+Use PHPUnit to write and run backend unit tests for your PHP code.
+
+
+
+### JavaScript (Jest)
+
+Use Jest to test Storefront JS and Vue components following modern best practices.
+
+
+
+Test custom Administration panel modules and components using Jest with the Shopware admin setup.
+
+
+
+## Continuous Integration (CI)
+
+Automate quality checks, builds, and artifact creation in your CI pipeline to keep extensions reproducible and safe to deploy.
+
+Learn how to structure CI for projects and plugins, including static analysis, test execution, and artifact promotion:
+
+
+
+## Testing guidelines for extensions
+
+To publish your extension in the Shopware Store, follow the testing criteria used during the Store review process.
+
+
+
+It focuses on how your extension is functionally tested before approval.
+
+For the official publication requirements, legal conditions, and compliance rules, see:
+
+
diff --git a/guides/plugins/plugins/testing/cypress/cypress-best-practises.md b/guides/development/testing/legacy/cypress/cypress-best-practises.md
similarity index 60%
rename from guides/plugins/plugins/testing/cypress/cypress-best-practises.md
rename to guides/development/testing/legacy/cypress/cypress-best-practises.md
index 6557fc91a0..11d956c913 100644
--- a/guides/plugins/plugins/testing/cypress/cypress-best-practises.md
+++ b/guides/development/testing/legacy/cypress/cypress-best-practises.md
@@ -7,8 +7,6 @@ nav:
# Best practices for writing end-to-end tests
-## Overview
-
A typical E2E test can be complex, with many steps that take a lot of time to complete manually. Because of this complexity, E2E tests can be difficult to automate and slow to execute. The following tips can help reduce the cost and pain of E2E testing and still reap the benefits.
Cypress got you covered with their best practices as well: So please also look at their best practices to get to know their patterns:
@@ -16,14 +14,14 @@ Cypress got you covered with their best practices as well: So please also look a
::: warning
-We strongly recommend following Cypress own best practices as well.
+We strongly recommend following Cypress's own best practices as well.
:::
## Amount and prioritization of end-to-end tests
### Video
-When it comes to dividing test types, selecting and prioritizing test cases, and thus designing tests, things get a bit more complicated. We have generally aligned our test strategy with the test pyramid, although not 100%. The pyramid states that end-to-end tests should be written in a few but well chosen test cases because end-to-end tests are slow and expensive.
+When it comes to dividing test types, selecting and prioritizing test cases, and thus designing tests, things get a bit more complicated. We have generally aligned our test strategy with the test pyramid, although not 100%. The pyramid states that end-to-end tests should be written in a few but well-chosen test cases because end-to-end tests are slow and expensive.
At [Shopware Community Day](https://scd.shopware.com/en-US/) 2020, we gave a talk on how we approach automated testing in Shopware, how far we have come on this journey, and what we have gained so far:
@@ -41,7 +39,7 @@ Cover every possible workflow with E2E tests.
Use proper prioritization to choose test cases covered by E2E tests.
:::
-Due to running times, it is not advisable to cover every single workflow available. The following criteria may help you with that:
+Due to time constraints, it is not advisable to cover every available workflow. The following criteria may help you with that:
* **Cover the most general, most used workflows of a feature**, e.g., CRUD operations. The term "[happy path](https://en.wikipedia.org/wiki/Happy_path)" describes those workflows quite well.
* **Beware the critical path**: Cover those workflows with E2E tests, which are the most vulnerable and would cause the most damage if broken.
@@ -55,7 +53,7 @@ Write the E2E test as you would write unit tests.
:::
::: tip
-Writing E2E tests in a "workflow-based" manner means writing the test describing a real user's workflow just like a real user would use your application.
+Writing E2E tests in a "workflow-based" manner means writing tests that describe a real user's workflow, just as a real user would use your application.
:::
A test should be written "workflow-based" - We like to use this word very much because it is simply apt for this purpose. You should always keep your persona and goal of an E2E test in mind. The test is then written from the user's point of view, not from the developer's point of view.
@@ -72,72 +70,72 @@ Write long E2E tests covering lots of workflows and use cases.
Keep tests as simple as possible. Only test the workflow you explicitly want to test. Ideally, use **one test for one workflow**.
:::
-The second most important thing is to test the workflow you explicitly want to test. Any other steps or workflows to get your test running should be done using API operations in the `beforeEach` hook, as we don't want to test them more than once. For example, if you want to test the checkout process, you shouldn't do all the steps, like creating the sales channel, products, and categories, although you need them to process the checkout. Use the API to create these things and let the test just do the checkout.
+The second most important thing is to test the workflow you explicitly want to test. Any other steps or workflows to get your test running should be performed via API operations in the `beforeEach` hook, since we don't want to test them more than once. For example, if you want to test the checkout process, you shouldn't do all the steps, like creating the sales channel, products, and categories, although you need them to process the checkout. Use the API to create these things, and let the test just do the checkout.
-You need to focus on the workflow to be tested to ensure minimum test runtimes and to get a valid result of your test case if it fails. For this workflow, you have to think like the end-user would do - Focus on the usage of your feature, not technical implementation.
+You need to focus on the workflow to be tested to ensure minimum test runtimes and to get a valid result of your test case if it fails. For this workflow, you have to think like the end-user would do - Focus on the usage of your feature, not the technical implementation.
-Other examples of steps or workflow to cut off the actual tests are:
+Other examples of steps or workflows to cut off the actual tests are:
-* The routines which should only provide the data we need: Just use test fixtures to create this data to have everything available before the test starts.
+* The routines that should only provide the data we need: Just use test fixtures to create this data to have everything available before the test starts.
* Logging in to the Administration: You need it in almost every Administration test, but writing it in all tests is pure redundancy and way more error sensitive.
::: info
-This [scope practice](https://docs.cypress.io/guides/references/best-practices.html#Organizing-Tests-Logging-In-Controlling-State) is also mentioned in Cypress best practices as well.
+This [scope practice](https://docs.cypress.io/guides/references/best-practices.html#Organizing-Tests-Logging-In-Controlling-State) is also mentioned in the Cypress best practices.
:::
### Focus on stability first
::: danger
-Design your tests dependent on each other, doing lots of write operations without removing corresponding data.
+Design your tests so they depend on each other, performing many write operations without removing the corresponding data.
:::
::: tip
-Keep tests isolated, enable them to run independently, and restore a clean installation between tests
+Keep tests isolated, enable them to run independently, and restore a clean installation between tests.
:::
-It is important to focus on stability as the most important asset of a test suite. A flaky test like this can block the continuous deployment pipeline, making feature delivery slower than it needs to be. Moreover, imagine the following case: Tests that fail to deliver deterministic results: Those flaky test is problematic because they won't show valid results anymore, making them useless. After all, you wouldn't trust one any more than you would trust a liar. If you want to find out more on that topic, including solutions, please take a look at this article:
+It is important to focus on stability as the most important asset of a test suite. A flaky test like this can block the continuous deployment pipeline, making feature delivery slower than it needs to be. Moreover, imagine the following case: Tests that fail to deliver deterministic results. Those flaky tests are problematic because they won't show valid results, making them useless. After all, you wouldn't trust one any more than you would trust a liar. If you want to find out more on that topic, including solutions, please take a look at this article:
This was one of the reasons you need stable tests to create value. To achieve that, you have several possibilities. We will introduce you to some of them in the following paragraphs.
-Let's start with some easy strategy. Keep tests as simple as possible, and avoid a lot of logic in each one. Think about it this way, the more you do in a test, the more you can go wrong. In addition, by avoiding big tests, you avoid causing load on your application and resource leaks in your environment.
+Let's start with an easy strategy. Keep tests as simple as possible, and avoid a lot of logic in each one. Think about it this way: the more you do in a test, the more you can go wrong. In addition, by avoiding big tests, you avoid causing a load on your application and resource leaks in your environment.
-When planning your test cases and structure, always keep your tests isolated from other tests so that they are able to be run in an independent or random order. Don't ever rely on previous tests. You need to test specs in isolation to take control of your application’s state. Every test is supposed to be able to run on its own and independent from any other tests. This is crucial to ensure valid test results. You can realize these using test fixtures to create all data you need beforehand and take care of the cleanup of your application using an appropriate reset method.
+When planning your test cases and structure, always keep your tests isolated from other tests so they can be run in an independent or random order. Don't ever rely on previous tests. You need to test specs in isolation to take control of your application’s state. Every test is supposed to run independently of any other tests. This is crucial to ensure valid test results. You can realize these using test fixtures to create all the data you need beforehand and take care of the cleanup of your application using an appropriate reset method.
## Choosing selectors
::: danger
-Choose fuzzy selectors which are prone to change, e.g. xpath.
+Choose fuzzy selectors that are prone to change, e.g., XPath.
:::
::: tip
-Use selectors which won't change often.
+Use selectors that won't change often.
:::
-XPath selectors are quite fuzzy and rely a lot on the texts, which can change quickly. Please avoid using them as much as possible. If you work in Shopware platform and notice that one selector is missing or not unique enough, just add another one in the form of an additional class.
+XPath selectors rely heavily on text, which can change quickly. Please avoid using them as much as possible. If you work on the Shopware platform and notice that one selector is missing or not unique enough, just add another one in the form of an additional class.
-### Avoid framework specific selectors
+### Avoid framework-specific selectors
::: danger
-Choose framework specific syntax as a selector prone to change, e.g. `.btn-primary`.
+Choose framework-specific syntax as a selector prone to change, e.g., `.btn-primary`.
:::
::: tip
-Use individual selectors which won't often change, e.g., `.btn-buy`.
+Use individual selectors that won't often change, e.g., `.btn-buy`.
:::
-Using selectors which rely on a framework specific syntax can be unstable because the framework selectors are prone to change. Instead, you should use individual selectors, which are less likely to change.
+Using selectors that rely on a framework-specific syntax can be unstable because the framework selectors are prone to change. Instead, you should use individual selectors, which are less likely to change.
```html
Add to cart
```
```javascript
-// ✗ Avoid using framework specific syntax from Bootstrap as a selector.
+// ✗ Avoid using framework-specific syntax from Bootstrap as a selector.
cy.get('.btn.btn-primary').click();
-// ✓ Instead, you should use a shopware specific class like `.btn-buy`.
+// ✓ Instead, you should use a shopware-specific class like `.btn-buy`.
// (This also remains stable when the button variant is changed to, e.g., `.btn-secondary`.)
cy.get('.btn-buy').click();
```
@@ -147,15 +145,15 @@ cy.get('.btn-buy').click();
data-toggle="modal"
data-target="#exampleModal"
class="btn btn-primary btn-open-settings">
- Open settings modal
+ Open settings modal