Writing a custom Codeception module


I enjoy using Codeception to write my acceptance tests. In January I wrote a helper file to help people test emails sent by the server during acceptance tests. However, it turns out there is a far better way to package and distribute custom Codeception actions: as a Module.

While I appreciate Codeception’s documentation, it wasn’t really clear how to build your own module for distribution, so I thought I would give some instructions here.

It can be as simple as creating a Composer package that includes a single class file. Let’s assume we want to create a Hello World module called ‘Hello’ that adds an $I->greet($name) method.

Let’s start with an empty directory for our package.

The Module

Within your new package’s directory create a file: src/Hello.php with the following content:

<?php

namespace Codeception\Module;

use Codeception\Module;

class Hello extends Module
{

    public function greet($name)
    {
        $this->debug("Hello {$name}!");
    }

}

The composer.json

In your package directory, create the following compsoser.json file:

{
    "name": "namespace/hello",
    "description": "Hello World Module",
    "authors": [
        {
            "name": "John Doe",
            "email": "johndoe@example.com"
        }
    ],
    "require": {

    },
    "autoload": {
        "psr-4": {
            "Codeception\\Module\\": "src"
        }
    }
}

Installation

Once you have uploaded your package to GitHub and registered it with Packagist, you can simply require it from your test suite’s composer.json file, and run composer update! (Note: If you are still using Codeception 1, you will need to run php codecept.phar build)

Then, as with any module, you just need to tell Codeception to use it for your tests. For example, you could add it to your acceptance.suite.yml.

class_name: WebGuy
modules:
    enabled:
        - Hello

Now you can use your new test method from within your acceptance tests:

$I->greet('Jordan'); // Prints: "Hello Jordan!"

Getting fancy

Modules have some magic methods and attributes for things like configuration values and hooks. Here is a list I have extracted from the Modules and Helpers section of the documentation:

class Sample extends Module
{
    // HOOK: used after configuration is loaded
    public function _initialize() {
    }

    // HOOK: on every Guy class initialization
    public function _cleanup() {
    }

    // HOOK: before each suite
    public function _beforeSuite($settings = array()) {
    }

    // HOOK: after suite
    public function _afterSuite() {
    }

    // HOOK: before each step
    public function _beforeStep(\Codeception\Step $step) {
    }

    // HOOK: after each  step
    public function _afterStep(\Codeception\Step $step) {
    }

    // HOOK: before test
    public function _before(\Codeception\TestCase $test) {
    }

    // HOOK: after test
    public function _after(\Codeception\TestCase $test) {
    }

    // HOOK: on fail
    public function _failed(\Codeception\TestCase $test, $fail) {
    }
}

If you want to see another example, check out my Codeception MailCatcher Module.