こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

PhpStorm でコードを理解する (テストコードを読む・実行する・書く編)

(※諸事情によりテスト実行の準備を省略している、後で加筆したい。)

テストコードを読む

もし、前述のフィボナッチ数列を出力するコードにテストコードがあれば、コードを実行しなくても理解できた可能性が高い。テストコードは、欠陥の検出につかうツールでもあり、コードの振る舞いについて表現したドキュメントにもなるからだ。

フィボナッチ数列を出力するコード(再掲)

<?php
// nazono.php
function nazono() {
    $a = 0;
    $b = 1;
    for ($i = 1; $i <= 10; $i++) {
        $l = $a;
        $a = $b;
        $b += $l;
        print "$a\n";
    }
}
nazono();

nazono() 関数がどのように使われているか調べようとして、定義箇所で、Command+B (Mac), Ctrl+B (Win)を押したときに、テストコードが引っかかったらラッキーかもしれない。移動してみよう。

f:id:tenkoma:20190324201231p:plain
nazono() 関数がテストコードから呼び出されていたら…

ちなみにテストコード例。

<?php
namespace Nazono\Tests\Unit;

require_once __DIR__ . '/../../nazono.php';

class NazonoTest extends \PHPUnit\Framework\TestCase
{
    public function testNazono()
    {
        // 実コードを呼び出す
        nazono();
        // 想定した出力
        $expectOutput = <<<OUT
1
1
2
3
5
8
13
21
34
55

OUT;
        $this->expectOutputString($expectOutput);
    }
}

期待される出力がテストコードに書かれている。 コードを実行した結果をみるのと同じ効果が得られるのがわかると思う。

テストを実行する・書く(変更する)

  • Mac: Shift+Ctrl+R, Win/Linux: Shift+Ctrl+F10

上記のテストを実行してみる、成功したら、「生きた」テストであることがわかる。

f:id:tenkoma:20190324205815p:plain
PhpStorm から NazonoTest テストを実行した

失敗したら、実コードかテストコードのどちらかが間違っている可能性がある。*1

もしプログラムの正しい振る舞いが分かっていれば、テストコードか実コードを変更することで、実コードへの理解が深まるかもしれない。 テストを書くのが楽になる機能に「Auto-test」がある。有効にすると、ファイル変更を検知して、自動で再テストしてくれる。

f:id:tenkoma:20190327001651p:plain
Auto-test ボタン

もし複雑なコードを良く理解しないといけない場合、テストがコードを理解するためのツールになると思う。

目次

*1:それ以外の、テストのセットアップができていない可能性もある