TDDトリプロをやってみた話

この記事はJX通信社Advent Calendarの11日目です。

前回にアドベントカレンダーの4日目の記事を書いたJX通信社でNewsDigestというiOS版アプリの開発担当として参画してますmoaibleです。

弊社では月に一度開発メンバーを集めて勉強会を実施する時間が設けられています。

11月に勉強会の幹事を担当した際にTDDトリプロをやってみたところ、思ったより盛り上がったのでその紹介をしていきます。

そもそもTDDとは?

f:id:moapp:20181211182810p:plain
tdd cycle

「TDD = Test Driven Development = テスト駆動開発」のことですね。

色んな方が普及してる開発手法なのもあって名前を聞くことも少なくないと思いますが、改めて簡単にやり方を説明しますと、

  1. テストコードを書いて失敗する状態にする
  2. 1のテストコードを失敗から成功する状態にする
  3. 2のコードがテストが成功する状態を保ったまま整理する

これを上記図の内容を借りると、

レッド → グリーン → リファクタリング

これを繰り返しながら動作もするし品質が保たれたコードを組み立てていく、という開発手法になります。

この記事ではTDDのこのサイクルを利用してちょっとしたゲーム形式っぽくみんなでTDDをやってみた話をします。

TDDトリプロ

「TDDしながらトリオでプログラミングしてみた」をこの記事ではTDDトリプロと勝手に呼びます。

TDDトリプロでは、TDDのサイクルである

レッド → グリーン → リファクタリング

のレッドとグリーン・リファクタリングをフェーズで分けます。

つまり、

  1. レッドフェーズ
    • テストが失敗するテストコードを書く
  2. グリーン・リファクタリングフェーズ
    • レッドフェーズで書いたテストコードを成功させリファクタリングまで済ませる

ということですね

あと2フェーズだけだと3人いてもクルクル回るだけで終わるので単純作業感が出てしまいます

それが嫌だったので更に制約を設けて、

ロール 役割
ライター フェーズでコードを書く人
オペレーター フェーズでコードを書く人に指示を出す人
オブザーバー ただ二人を傍観するだけの人

というような3つのロールを回しながら3人で1つのPCを操作しながら進めていく、というルールにで実際にやってもらいました

f:id:moapp:20181211183222p:plain
tdd group torio

(実際にトリオでグループ毎に分かれた図)

ただ始めると問題になるのが、身についてるプログラミング言語だったりテストフレームワークだったりキーボードはJISなのか英字なのか...etcのように人によって違う部分って色々あると思います

そこで、緩和してくれるTDDに特化したwebサービスを今回は利用してみました

Cyber dojo

http://cyber-dojo.org/cyber-dojo.org

f:id:moapp:20181211183434p:plain

こちらがcyber-dojoと言われる、ブラウザ上でテストコード込みで実装を進められることができるサービスです、ひとまず開いたら「I'm on my own」から入場してみましょう

f:id:moapp:20181211183549p:plain

豊富に用意されている各種言語、テストフレームワーク、お題を選ぶことができます

今回の例ではひとまず「Python + pytest」の開発環境で 「FizzBuzz」のお題に挑戦してみます

実際にTDDでテストを回してみる

f:id:moapp:20181211183807p:plain

まずはデフォルトで用意されてる状態のままテストを実行してみたいので、「test」を押してみます

f:id:moapp:20181211183838p:plain

そうすると実際に実行されて・・・

f:id:moapp:20181211184729p:plain

無事失敗しましたね(?)これでレッドフェーズはクリアしました

次の人に交代して今度はグリーン・リファクタリングフェーズに入ります

失敗してるテストコードをみてみます

import hiker

def test_life_the_universe_and_everything():
    '''a simple example to start you off'''
    douglas = hiker.Hiker()
    assert douglas.answer() == 42

テストケースとして42であるべき、と求められていますが実装の方はというと

class Hiker:

    def answer(self):
        return 6 * 9

はい、「6 * 9 = 42」ではないので失敗することが分かりますね!

これを正しいコードに直して再度testを実行してみます

f:id:moapp:20181211183949p:plain

今度は通りましたね!🎊

この例だとリファクタリングできるほどコード量もないのでグリーン・リファクタリングフェーズはクリアになりました

じゃあ次にPCを操作する人がレッドフェーズとして失敗するテストコードを書いて...というのを繰り返す、というのがこの勉強会でやってみたTDDトリプロの全容になります

やってみて分かったこと

勉強会はいつも2時間ぐらい取ってるのですが最初のお題で出したFizzBuzzが終わったら違うお題に挑戦してみたり、言語を変えてもう一回やってみようっていうグループもあったりして誰かが退屈するってことがなく無事終わることができました

当たり前なんですが、みんな今まで過ごしてきた環境も違うし経験も違います

これって業務にも通ずる話で当たり前なのですが、持ってる物が違う中でみんなで協力して物事を解決まで進めるってことが体感できるって意味でも良い時間が生まれたのかな、って所感でした

f:id:moapp:20181211184253j:plain

おわりに

いかがでしたでしょうか

是非この記事を見て、もしやってみたいって思ったらTDDトリプロ気軽に試してみてください 😃