個人開発
自動テスト導入のススメ
しずおかオンライン 山下雄大
Introduction
サーバーサイドエンジニア
社会人3年目
言語: PHP、Ruby
Today's Topic
Laravelで、業務外の時間で作っている
シャッフルランチに自動テストを追加した
Development
平均開発工数
20h/月
開発者数
2人(フロント1、バックエンド1)
開発リソースが限りなく少ない
what's problem
新しい機能の
動作確認がめんどい
すでに動いている
コードをいじりたくない
開発時間が取れなくて
正しい仕様を忘れる
Trigger
Rspecによる自動テスト導入
what's merit
修正コードデプロイの安心感
コア機能の動作確認が不要に
シャッフルランチにもテストを導入したら、
開発が楽になりそう!
what did i do ?
①テストフレームワークの導入
※Ruby → Rspec
what did i do ?
②テストデータの作成メソッド
Factory
テストデータ作成用
<?php
$factory->define(shuffle_lunch\Lunch::class, function (Faker $faker) {
$aggregate_time = date('Y-m-d H:i:s');
$result_time = date('Y-m-d H:i:s', strtotime('+1 hour'));
return [
'name' => $faker->jobTitle.' Lunch',
'description' => $faker->sentence,
'slack_url' => $faker->url,
'aggregate_time' => $aggregate_time,
'result_time' => $result_time,
'is_recurrence' => $faker->boolean,
'interval_type' => $faker->numberBetween(0, 4),
'interval_value' => $faker->numberBetween(1, 4),
'is_deleted' => $faker->boolean,
];
});
example
開催されているランチの取得メソッドのテスト
public function testGetPublicEvent()
{
// 開催中のイベントデータを作成
$public_event = Factory(Event::class)->create([
'is_deleted' => false
]);
$get_public_event = Event::getPublicEvent($public_event->id);
$this->assertEquals($public_event->id, $get_public_event->id); // 指定したIDのイベント取得される
// 削除済みのイベント作成
$deleted_event = Factory(Event::class)->create([
'is_deleted' => true
]);
$get_deleted_event = Event::getPublicEvent($deleted_event->id);
$this->assertEmpty($get_deleted_event); // 取得結果は0になる。
}
what did i do ?
③テスト実行
composer exec -v phpunit
実は、まだCIで動かせていない・・・
impression①
テスト導入をしてみて
コアな部分がエラーになっていないか
確認できるだけで、精神的にだいぶ楽
テストコードがあると、
リファクタリングしやすい
impression②
テスト導入をしてみて
テストによって100%バグがないという
状態にはならない
どこまでテストをするのかという
さじ加減が難しい
tdd to bdd
Beavior driven development
テストではなく「振る舞い」
テストコードでできることは、テストではなくチェック
what's bdd
テストをなんと呼ぶべきかという
質問の答えは簡単です。
これは関心対象となっている、
次に実装するふるまいを記述した文章です。
finally
メソッドは何をするのか?
動作するのか?
もっと良い書き方はないか?
テストコード = プログラムとの相談
孤独な開発こそ、テストコードをお供にすると
コードを書くのが楽しくなるかも?