Help us understand the problem. What is going on with this article?

初めてのTDD(PHPUnit)

More than 3 years have passed since last update.

チーム内でTDDの布教をした際に使用した資料

単体テストのすゝめ

https://www.slideshare.net/SatoshiLi/tdd-78910554

TDDとは?

テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。(wikipedia)
まず、テストコードを書く。当然失敗するので、それが通るようにするのをひたすら繰り返す。

サンプルコード

BDDのテストフレームワークが潮流してきていますが、今回はオーソドックスにPHPUnitを使います。
ライブラリ及びコードを同じフォルダに突っ込んでおく。

PHPUnit
https://phpunit.de/
上記から実行するphpのバージョンに対応するphpUnitをダウンロードする。
下記サンプルコードはphp7で実行してるのでPHPUnit 6.3をダウンロード。
(とはいえ、下記コードならある程度古いバージョンでも動くと思いますが)

SampleTest.php
<?php
use PHPUnit\Framework\TestCase;
require_once("SampleProgram.php");

class SampleTest extends TestCase
{
    // まずはうまく返せてるか
    public function testReturn()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step1(12345), 12345);
    }

    // 文字数を確認する
    public function testCharNumber()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step2(12345), 5);
    }

    // 計算してみる
    public function testCalculation()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step3(12345), 15);
    }

    // 予期しない入力値を制御できるか
    /**
     * @expectedException        Exception
     * @expectedExceptionMessage 二桁の自然数ではないです
     */
    public function testErrorHandle()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step4(12345), 15);
        $sample->step4('aiueo');
    }
}
?>
SampleProgram.php
<?php
use PHPUnit\Framework\TestCase;

class SampleProgram
{
    public function step1($arg)
    {
        return $arg;
    }

    public function step2($arg)
    {
        return strlen($arg);
    }

    public function step3($arg)
    {
        $total = 0;
        for($i = 0; $i < strlen($arg); $i++){
            $total += substr($arg, $i, 1);
        }
        return $total;
    }

    public function step4($arg)
    {
        if(preg_match('/[0-9]{2,}/', $arg))
        {
            throw new Exception("二桁の自然数ではないです");
        }
        $total = 0;
        for($i = 0; $i < strlen($arg); $i++){
            $total += substr($arg, $i, 1);
        }
        return $total;
    }
}
?>

実行コード(例)
php phpunit-6.2.phar SampleTest.php

ri-zhi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away