## Magento 2 Testing To enable testing components, set the following configuration in your project's `.env` file: ``` REWARD_TEST_DB=true ``` This will launch an additional MySQL 5.7 database instance running on `tempfs` (blazing-fast memory) storage. Temporary file locations have also been mounted into `tempfs` memory storage: - `/var/www/html/dev/tests/integration/tmp/` ### Running Unit Tests Create your `phpunit.xml` using contents of `phpunit.xml.dist`. We recommend customizing values of: - Memory usage `TESTS_MEM_USAGE_LIMIT` with value of `8G` should be enough ```xml ``` That's it! Now you are ready to run Unit Tests. #### Execution - To run all tests declared in `phpunit.xml` execute:
`vendor/bin/phpunit -c dev/tests/unit/phpunit.xml` - If you need to run only specific directory, execute:
`vendor/bin/phpunit -c dev/tests/unit/phpunit.xml {PATH TO TESTS}` #### Debugging If you have [configured Xdebug](../xdebug.md), run Unit tests inside **Debug** console (`reward debug` instead of `reward shell`). The code execution will stop at the breakpoints. ### Running Javascript Unit Tests 1. Configure your `.env` and set `NODE_VERSION=16` 2. Launch a shell session within the project environment's `php-fpm` container with `reward shell` 3. Install javascript unit test dependencies with `npm install` 4. Deploy static content with bin/magento setup:static-content:deploy -f #### Execution ```bash $ grunt spec: ``` For more specific jasmine unit test instructions, see the Magento DevDocs ([Magento 2.4](https://devdocs.magento.com/guides/v2.4/test/js/jasmine.html)) #### Troubleshooting - You must be within your project environment's `php-fpm` container before running `npm install`. If you are having issues installing node packages, remove your `node_modules` directory with `rm -rf node_modules/ package-lock.json` and then retry `npm install`. - If you have an issue with `jasmine` tests being unable to execute it might be due to installing the wrong versions of node `grunt-contrib-jasmine`. You can fix this by using: ```bash cp package.json.sample package.json && rm -rf node_modules/ package-lock.json && npm install ``` ### Running Integration Tests All the necessary files are located in `dev/tests/integration/`: 1. Create your `phpunit.xml` using contents of `phpunit.xml.dist`. We recommend customizing values of: - Maximum memory usage `TESTS_MEM_USAGE_LIMIT` with value of `8G` should be enough - Magento deployment mode `TESTS_MAGENTO_MODE` should be covered both for `developer` and `production` - Significantly increase the speed with `TESTS_PARALLEL_RUN` set to `1` 2. You need to create `etc/install-config-mysql.php` based on `etc/install-config-mysql.php.dist` as a template. The arguments are exactly the same to those you use for `bin/magento setup:install`: ```php return [ 'db-host' => 'tmp-mysql', 'db-user' => 'root', 'db-password' => 'magento', 'db-name' => 'magento_integration_tests', 'backend-frontname' => 'backend', 'search-engine' => 'elasticsearch7', 'elasticsearch-host' => 'elasticsearch', 'elasticsearch-port' => 9200, 'admin-user' => \Magento\TestFramework\Bootstrap::ADMIN_NAME, 'admin-password' => \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD, 'admin-email' => \Magento\TestFramework\Bootstrap::ADMIN_EMAIL, 'admin-firstname' => \Magento\TestFramework\Bootstrap::ADMIN_FIRSTNAME, 'admin-lastname' => \Magento\TestFramework\Bootstrap::ADMIN_LASTNAME, 'amqp-host' => 'rabbitmq', 'amqp-port' => '5672', 'amqp-user' => 'guest', 'amqp-password' => 'guest', 'session-save' => 'redis', 'session-save-redis-host' => 'valkey', 'session-save-redis-port' => 6379, 'session-save-redis-db' => 2, 'session-save-redis-max-concurrency' => 20, 'cache-backend' => 'redis', 'cache-backend-redis-server' => 'valkey', 'cache-backend-redis-db' => 0, 'cache-backend-redis-port' => 6379, 'page-cache' => 'redis', 'page-cache-redis-server' => 'valkey', 'page-cache-redis-db' => 1, 'page-cache-redis-port' => 6379, ]; ``` 3. You need to create `etc/config-global.php` based on `config-global.php.dist`. This is your container for Config data - for example: Configuration of Elasticsearch connection! ```php return [ 'customer/password/limit_password_reset_requests_method' => 0, 'admin/security/admin_account_sharing' => 1, 'admin/security/limit_password_reset_requests_method' => 0 ]; ``` That's it! Now you are ready to run your first Integration Tests. #### Execution There's one thing you should be aware of: **always provide full path to `phpunit.xml`**. - To run all tests declared in `phpunit.xml` execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/integration/phpunit.xml` - If you need to run only specific directory, execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/integration/phpunit.xml {ABSOLUTE PATH TO TESTS}` #### Debugging If you have [configured Xdebug](../xdebug.md), run Integration tests inside **Debug** console (`reward debug` instead of `reward shell`). The code execution will stop at the breakpoints. #### Troubleshooting - In case you're getting a message like `Fatal error: Allowed memory size of ...` try to add prefix `php -dmemory_limit=-1` to your command, like ```bash php -d memory_limit=-1 vendor/bin/phpunit -c $(pwd)/dev/tests/integration/phpunit.xml ``` - If you're getting a message like `The store that was requested wasn't found. Verify the store and try again.` - run the following command ```bash rm -Rf app/etc/env.php app/etc/config.php dev/tests/integration/tmp/* ``` ### Running Setup Integration Tests All the necessary files are located in `dev/tests/setup-integration/`: 1. Create your `phpunit.xml` using contents of `phpunit.xml.dist`. We recommend customizing values of: - Install config file `TESTS_INSTALL_CONFIG_FILE` should be `etc/install-config-mysql.php` - Tests cleanup `TESTS_CLEANUP` should be set to `enabled` - Magento deployment mode `TESTS_MAGENTO_MODE` should be covered both for `developer` and `production` (set to `developer` for start) 2. You need to create `etc/install-config-mysql.php` based on `etc/install-config-mysql.php.dist` as a template. Example: ```php return [ 'default' => [ 'db-host' => 'tmp-mysql', 'db-user' => 'root', 'db-password' => 'magento', 'db-name' => 'magento_integration_tests', 'db-prefix' => '', 'backend-frontname' => 'admin', 'admin-user' => 'admin', 'admin-password' => '123123q', 'admin-email' => \Magento\TestFramework\Bootstrap::ADMIN_EMAIL, 'admin-firstname' => \Magento\TestFramework\Bootstrap::ADMIN_FIRSTNAME, 'admin-lastname' => \Magento\TestFramework\Bootstrap::ADMIN_LASTNAME, 'enable-modules' => 'Magento_TestSetupModule2,Magento_TestSetupModule1,Magento_Backend', 'disable-modules' => 'all' ], 'checkout' => [ 'host' => 'tmp-mysql', 'username' => 'root', 'password' => 'magento', 'dbname' => 'magento_integration_tests' ], 'sales' => [ 'host' => 'tmp-mysql', 'username' => 'root', 'password' => 'magento', 'dbname' => 'magento_integration_tests' ] ]; ``` That's it! Now you are ready to run your first Setup Integration Tests. #### Execution There's one thing you should be aware of: **always provide full path to `phpunit.xml`**. - To run all tests declared in `phpunit.xml` execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/setup-integration/phpunit.xml` - If you need to run only specific directory, execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/setup-integration/phpunit.xml {ABSOLUTE PATH TO TESTS}` #### Debugging If you have [configured Xdebug](../xdebug.md), run Integration tests inside **Debug** console (`reward debug` instead of `reward shell`). The code execution will stop at the breakpoints. ### Running API Functional Tests All the necessary files are located in `dev/tests/api-functional/`. 1. Create your own `phpunit_{type}.xml` file using contents of `phpunit_{type}.xml.dist`. You **need** to configure: - Magento installation URL (with protocol) `TESTS_BASE_URL` - for example `https://app.magento2.test/` - Admin credentials `TESTS_WEBSERVICE_USER` and `TESTS_WEBSERVICE_APIKEY` (it's formally **password**)
_The Admin account should exist, it will be created only if `TESTS_MAGENTO_INSTALLATION` is enabled_ 1. Configure your Magento Installation using `etc/install-config-mysql.php.dist` as a template. The arguments are exactly the same to those you use for `bin/magento setup:install`: ```php return [ 'db-host' => 'tmp-mysql', 'db-user' => 'root', 'db-password' => 'magento', 'db-name' => 'magento_integration_tests', 'cleanup-database' => true, 'amqp-host' => 'rabbitmq', 'amqp-port' => '5672', 'amqp-user' => 'guest', 'amqp-password' => 'guest', 'session-save' => 'redis', 'session-save-redis-host' => 'valkey', 'session-save-redis-port' => 6379, 'session-save-redis-db' => 2, 'session-save-redis-max-concurrency' => 20, 'cache-backend' => 'redis', 'cache-backend-redis-server' => 'valkey', 'cache-backend-redis-db' => 0, 'cache-backend-redis-port' => 6379, 'page-cache' => 'redis', 'page-cache-redis-server' => 'valkey', 'page-cache-redis-db' => 1, 'page-cache-redis-port' => 6379, 'language' => 'en_US', 'timezone' => 'America/Los_Angeles', 'currency' => 'USD', 'backend-frontname' => 'backend', 'base-url' => 'https://app.magento2.test/', 'use-secure' => '1', 'use-rewrites' => '1', 'admin-lastname' => 'Admin', 'admin-firstname' => 'Admin', 'admin-email' => 'admin@example.com', 'admin-user' => 'admin', 'admin-password' => '123123q', 'admin-use-security-key' => '0', 'sales-order-increment-prefix' => time(), ]; ``` 1. You need to create `etc/config-global.php` based on `config-global.php.dist`. This is your container for Config data - for example: Configuration of Elasticsearch connection! ```php return [ 'catalog/search/engine' => 'elasticsearch6', 'catalog/search/elasticsearch6_server_hostname' => 'elasticsearch', ]; ``` #### Execution There's one thing you should be aware of: **always provide full path to `phpunit.xml`**. - To run all tests declared in `phpunit_{type}.xml` execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/api-functional/phpunit_{type}.xml` - If you need to run only specific directory, execute:
`vendor/bin/phpunit -c $(pwd)/dev/tests/api-functional/phpunit_{type}.xml {ABSOLUTE PATH TO TESTS}` #### Debugging When debugging APIs you may need to use Xdebug - configure your `phpunit_{type}.xml`: - `TESTS_XDEBUG_ENABLED` to `true` - `TESTS_XDEBUG_SESSION` to `phpstorm` ### Running MFTF Tests All the MFTF-related operations are operated by `vendor/bin/mftf`, necessary files are located in `dev/tests/acceptance/`. To run Acceptance tests you need to [configure the MFTF environment](mftf.md). Once you've done that, follow these steps to run the tests. 1. Make sure that you enabled following in your `.env` file: - `REWARD_SELENIUM` - Responsible for running virtual browser for your tests - `REWARD_ALLURE` - Responsible for test results reporting - `REWARD_SELENIUM_DEBUG` - Enables you to preview the tests with VNC 1. Run `vendor/bin/mftf build:project`, the configuration files will be generated in `dev/tests/acceptance`. 1. Adjust `dev/tests/acceptance/.env` file by setting: - `MAGENTO_BASE_URL` - `MAGENTO_BACKEND_NAME` to your Backend path (Check with `bin/magento info:adminuri`) - `MAGENTO_ADMIN_USERNAME` - `MAGENTO_ADMIN_PASSWORD` - `SELENIUM_HOST` (by default it is `selenium`) Sample configuration ``` MAGENTO_BASE_URL=https://app.magento2.test/ MAGENTO_BACKEND_NAME=backend MAGENTO_ADMIN_USERNAME=admin MAGENTO_ADMIN_PASSWORD=123123q BROWSER=chrome MODULE_WHITELIST=Magento_Framework,ConfigurableProductWishlist,ConfigurableProductCatalogSearch ELASTICSEARCH_VERSION=7 SELENIUM_HOST=selenium ``` More details can be found [in Magento DevDocs](https://devdocs.magento.com/mftf/docs/configuration.html). #### Execution * Execute single test
`vendor/bin/mftf run:test -r AdminLoginTest` * Execute group/suite of tests
`vendor/bin/mftf run:group -r customer` #### Debugging For more information about Debugging MFTF - please follow the [Magento Functional Testing Framework](mftf.html#debugging-mftf-tests) section. The process of debugging is based on VNC connection to the Chrome instance.