PHPUnitでdefine値に依存するテストを書く

PHPUnitでdefine値に依存するテストを書かなければいけなかったのですが
単体で実行すると成功するが、まとめて実行すると先に実行されたテストのdefineに依存してしまい
テストが失敗するという問題に悩まされましたが解決出来ました

実行したいテスト

~~~
define(‘FOO’, 0);
class ATest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function 定数が正しく設定されているかのテスト()
{
$this->assertEquals(0, constant(‘FOO’));
}

}
~~~

~~~
define(‘FOO’, 1);
class BTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function 定数が正しく設定されているかのテスト()
{
$this->assertEquals(1, constant(‘FOO’));
}

}
~~~

個別に実行した場合

テストはうまくいきます
~~~
phpunit -v tests/ATest.php

PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 1 second, Memory: 8.75Mb

OK (1 tests, 1 assertions)
~~~

まとめて実行した場合

defineATestに依存してしまいBTestが失敗します
~~~
phpunit -v tests/

PHPUnit 3.6.10 by Sebastian Bergmann.

.F

Time: 1 second, Memory: 8.75Mb

There were 1 failures:

1) BTest::定数が正しく設定されているかのテスト
Failed asserting that 1 matches expected 0.

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
~~~

こんな時は
@runInSeparateProcess
@preserveGlobalState disabled

BTestを修正

ドキュメンテーションブロックに
@runInSeparateProcessと
@preserveGlobalState disabledを追記する

~~~
define(‘FOO’, 1);
class BTest extends PHPUnit_Framework_TestCase
{
/**
* @test
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function 定数が正しく設定されているかのテスト()
{
$this->assertEquals(1, constant(‘FOO’));
}

}
~~~

これでテストがうまくいくようになりました

参考:define() + runInSeparateProcess = Constant already defined · Issue #856 · sebastianbergmann/phpunit