Testing Tips

# Maintain Your Database

The Craft module provides a cleanup and transaction option for the codeception.yml file. It is recommended that you set these options to true.

# transactions

The transaction option ensures that changes made to the database during your test are rolled back using a Yii2 transaction (opens new window). This means that if you, for example, save a craft\db\ActiveRecord instance before the next test that database row is removed. This prevents collisions and prevents you from spending hours debugging your tests.

If you are running MySQL the [[%searchindex]] table may be running the MyISAM Database driver. If this is the case transactions are not-supported (opens new window).

If you are creating new elements in your tests using Craft::$app->getElements()->saveElement() and the element you are saving has content in the [[%searchindex]] table, this [[%searchindex]] content will not be removed. It is recommended to manually clear the search index or use an element fixture.

# cleanup

The cleanup option ensures that fixtures are removed after a test. This cleans any fixture data inserted during your test from the database. Before the next test the new fixtures will be added again.

# Use .gitignore

In the setup section you set up a _craft folder which contains various directories for testing. One of these directories is the storage directory. While tests are running, Craft will create a lot of temporary files and logs in this folder. Use a .gitignore (opens new window) file to keep these files out of your version control system (i.e. Git). The same policy should apply to the tests/_output/ directory Codeception creates for tests.

If you are using Craft 3.5 or later, or are using the projectConfig config option in Codeception, you’ll likely want to ignore the tests/_craft/config/project/* as well.

# Namespacing

Craft namespaces it's tests under one separate root namespace and then expands per test subject. I.E. Unit tests are namespaced under crafttests\unit while functional tests are namespaced under crafttests\functional. It is advised to apply this same convention to your tests. If you are testing a module or plugin you may want to provide support resources for testing, it is advised to namespace these using my\plugin\namespace\test. This is exactly how Craft does it as well. See the element fixtures as an example.

# Quick Setup via Console Command

If you have a general understanding of the typical Craft testing setup, you can use the tests/setup console command which will do all of the important setup work for you. It will copy from Craft's src/test/internal/example-test-suite folder to either your project's root directory or a directory path of your choosing. All you then have to do is:

  • Install Codeception with composer require codeception/codeception.
  • Run codecept build.
  • Add a .env file.