CodeceptionのAcceptanceでテストメソッド前後に指定の処理を実行する

Cestを利用したAcceptanceテストでテストメソッド前後に処理を追加したい場合、_before(),_after()を使用しますが、ログインやログアウトなど特定のテストメソッドの前後だけに処理を追加したい場合、前・後処理用のメソッドを用意し、メソッド名をアノテーションで設定することで実現できます。

## 前・後処理用メソッドの記述方法
前・後処理用のメソッドは、

```php
protected function before1(AcceptanceTester $I)
{
    // 実行したい処理
}
```

このように```protected```で作成します。```public```で作成すると、テストメソッドとみなされてしまいますので注意してください。

## 特定の前・後処理の追加方法
追加したいメソッドにアノテーションを追加することで設定できます。

```php:
/**
 * @before before1
 * @after after1
 */
public function fooTest(AcceptanceTester $I)
{
    // テスト処理
}
```

特定の前処理を追加したい場合は、@beforeアノテーションに実行したい処理のメソッド名を、後処理を追加したい場合は、@afterアノテーションに実行したい処理のメソッド名を記述します。

## 実行順序
例として以下のテストを作成します。

```php:test/acceptance/HogeCest.php
<?php


class HogeTestCest
{
    public function _before(AcceptanceTester $I)
    {
        codecept_debug('_before');
    }

    public function _after(AcceptanceTester $I)
    {
        codecept_debug('_after');
    }

    /**
     * アノテーションなし
     */
    public function hogeTest(AcceptanceTester $I)
    {
        $I->wantToTest('hogeTest');
        codecept_debug('hogeTest');
    }

    /**
     * @before before1
     * @after after1
     */
    public function fooTest(AcceptanceTester $I)
    {
        $I->wantToTest('fooTest');
        codecept_debug('fooTest');
    }

    /**
     * @before before1
     * @before before2
     * @after after1
     * @after after2
     */
    public function barTest(AcceptanceTester $I)
    {
        $I->wantToTest('barTest');
        codecept_debug('barTest');
    }

    protected function before1(AcceptanceTester $I)
    {
        codecept_debug('before1');
    }

    protected function before2(AcceptanceTester $I)
    {
        codecept_debug('before2');
    }

    protected function after1(AcceptanceTester $I)
    {
        codecept_debug('after1');
    }

    protected function after2(AcceptanceTester $I)
    {
        codecept_debug('after2');
    }
}
```

この場合の実行結果ですが、

```bash:
$ vendor/bin/codecept run acceptance --debug
Codeception PHP Testing Framework v2.2.8
Powered by PHPUnit 5.7.9 by Sebastian Bergmann and contributors.

Acceptance Tests (3) -----------------------------------------------------------
Modules: PhpBrowser, \Helper\Acceptance
--------------------------------------------------------------------------------
HogeCest: Test hogeTest
Signature: HogeCest:hogeTest
Test: tests/acceptance/HogeCest.php:hogeTest
Scenario --
  _before
  hogeTest
  _after
 PASSED 

HogeCest: Test fooTest
Signature: HogeCest:fooTest
Test: tests/acceptance/HogeCest.php:fooTest
Scenario --
  _before
  before1
  fooTest
  after1
  _after
 PASSED 

HogeCest: Test barTest
Signature: HogeCest:barTest
Test: tests/acceptance/HogeCest.php:barTest
Scenario --
  _before
  before1
  before2
  barTest
  after1
  after2
  _after
 PASSED 

--------------------------------------------------------------------------------


Time: 408 ms, Memory: 12.75MB

OK (3 tests, 0 assertions)
```

となります。
前処理の場合、

1. _before()
2. 1つめの@beforeで指定したメソッド
3. 2つめの@beforeで指定したメソッド
4. 以下@beforeを指定した順

というように、
**_before()実行後、@beforeの順番通りに実行されます。**

後処理の場合は、

1. 1つめの@afterで指定したメソッド
2. 2つ目の@afterで指定したメソッド
3. 以下@afterを指定した順
4. _after()

というように、
**@afterの順番通りに実行したのち_after()が実行されます。**