よりよいPHPUnitの
実行方法を求めて
2015-9-18 @iakio
UnitTestの価値
今書いたコードを今すぐ実行できること
$ vendor/bin/phpunit tests/CalcTest.php
を毎回手で実行するのはやめよう
アクション1つで
テストが動くようにする
何もしなくても
テストが動くようにする
tests/CalcTest.phpを変更したときに
tests/CalcTest.phpを実行したい
- エディタやIDEから1アクションで(QuickRun等)
- 保存時にフックする
- grunt, gulp(node)
- guard, watchr(ruby)
- Stagehand_Testrunner
quickrun.vimの例
CalcTest.phpを開いているとき
アクション1つでphpunitを実行できる
src/Calc.phpが変更したときにも
tests/CalcTest.phpを実行したい
- ファイル名で判断する?
src/BankAccount.phpが
src/Calc.phpを使っているので、
src/Calc.phpを変更した時は
tests/BankAccountTest.phpと
tests/CalcTest.phpを実行したい
CalcTest.php
BankAccountTest.php
Calc.php
BankAccount.php
1.このテストを動かすと 2.このコードが実行される
CalcTest.php
BankAccountTest.php
Calc.php
BankAccount.php
2.このテストを動かしたい 1.このコードを変更したら
あるテストの実行中に
どのファイルが実行されたかを
知ることができれば、
あるファイルが更新されたときに
どのテストを
実行する必要があるかがわかる
Coverage
xdebug_start_code_coverage();
...
$data = xdebug_get_code_coverage();
どのファイルのどの行が実行されたかを取得
http://xdebug.org/docs/code_coverage
interface PHPUnit_Framework_TestListener {
public function startTest(PHPUnit_Framework_Test $test);
public function endTest(PHPUnit_Framework_Test $test, $time);
...
}
https://phpunit.de/manual/current/ja/extending-
phpunit.html#extending-phpunit.PHPUnit_Framework_TestListener
UnitTestの開始、終了にフック
<?xml version="1.0"?>
<phpunit>
<listeners>
<listener class="My¥Listener">
</listener>
</listeners>
</phpunit>
composer require --dev
iakio/phpunit-smartrunner:dev-master
https://packagist.org/packages/iakio/phpunit-smartrunner
$ vendor/bin/smartrunner init
$ vendor/bin/smartrunner run tests/CalcTest.php
 CalcTest.phpが実行される
(同時に依存するファイル情報を保存する)
$ vendor/bin/smartrunner run src/Calc.php
 CalcTest.phpが実行される
$ vendor/bin/smartrunner run tests/BankAccountTest.php
 BankAccountTest.phpが実行される
(同時に依存するファイル情報を保存する)
$ vendor/bin/smartrunner run src/Calc.php
 CalcTest.php,BankAccountTest.php が実行される
$ cat .smartrunner/cache.json
{
"src¥/Calc.php": [
"tests¥/CalcTest.php",
"tests¥/BankAccountTest.php"
],
"tests¥/CalcTest.php": [
"tests¥/CalcTest.php"
],
"src¥/BankAccount.php": [
"tests¥/BankAccountTest.php"
],
"tests¥/BankAccountTest.php": [
"tests¥/BankAccountTest.php"
]
}
更新されたファイル名を引数に渡すだけなので、
エディタやIDE, filesystem watcher と簡単に組み合
わせることができる
vendor/bin/smartrunner run [ファイル名]
let g:quickrun_config['php'] = {
¥ 'command' : './vendor/bin/smartrunner',
¥ 'cmdopt' : 'run'
¥}
Calc.phpを開いているときでも
1アクションでテストを実行できる
ファイルの更新を監視し、Calc.php
保存時にテストを実行する
$ watchy -w . -- bash -c 'vendor/bin/smartrunner run $FILE'
(https://www.npmjs.com/package/watchy を使った例)
課題
• 自分でもあまり使えていないので、どの程度便
利かよくわかっていない
• Smarty, Twig, Bladeのような、一度コンパイルし
てPHPになるものは上手くいかない
• require-devするよりpharにした方がよいかも
• READMEが適当
おまけ
• iakio/phpunit-growlprinter
• PHPUnitの結果をGrowl通知
• こちらはpharで導入できるようになりました
http://qiita.com/iakio/items/159fe963308467c102f2

よりよいPHPUnitの実行方法を求めて