Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テスト駆動開発でダイエットに挑戦して失敗した話

terahide
September 30, 2023

 テスト駆動開発でダイエットに挑戦して失敗した話

XP祭り2023 で発表した内容です

terahide

September 30, 2023
Tweet

More Decks by terahide

Other Decks in Technology

Transcript

  1. テスト駆動開発とは? • Red → Green → Refactor を繰り替えすサイクルで開発する 1. まずはテストを書く

    (失敗させる) 2. テストが通るように プロダクションコードを直す 3.重複を排除する 上記のサイクルをくり返す
  2. テスト駆動開発を行う利点 • プログラムの内部品質が高くなる • 凝集度があがって結合度がさがる • 開発を行う対象の理解が進む • 設計判断に迷うことが少なくなる •

    安全にリファクタリングが可能 SQuaRE (ISO25000シリーズ) における品質特性 つながる世界のソフトウェア品質ガイド
  3. テスト駆動開発のイロハ • TODOリストを作成する • テストを書く • Red テストを失敗させる • Green

    最速でテストを通す • Refactor 重複を排除する • Red→Green→Refactor のサイクルを繰り返す 1. まずはテストを書く (失敗させる) 2. テストが通るように プロダクションコードを直す 3.重複を排除する
  4. Red コンパイルを通す • プロダクションコードを追加してコンパイルをとおす def testAdd1to1 { sut = Calculator.new()

    actual = sut.add(1, 1) assert 2 == actual } テストコード class Calculator { def add(i, j){ } } プロダクションコード • 再び実行 • テスト失敗 • 2 を期待しているが null
  5. Green 最速でテストを通す • 仮実装でテストを通す def testAdd1to1 { sut = Calculator.new()

    actual = sut.add(1, 1) assert 2 == actual } テストコード class Calculator { def add(i, j){ return 2 } } プロダクションコード • 再び実行 • テスト成功!
  6. Refactor 重複を排除する • ここでは変更の余地なし def testAdd1to1 { sut = Calculator.new()

    actual = sut.add(1, 1) assert 2 == actual } テストコード class Calculator { def add(i, j){ return 2 } } プロダクションコード
  7. Red テストを追加する • 三角測量のテストを追加 def testAdd1to1 { sut = Calculator.new()

    actual = sut.add(1, 1) assert2 == actual } def testAdd2to1 { sut = Calculator.new() actual = sut.add(2, 1) assert 3 == actual } テストコード class Calculator { def add(i, j){ return 2 } } プロダクションコード • 再び実行 • 1件成功, 1件失敗 • testAdd2to1: 3 を期待しているが 2
  8. Green 最速でテストを通す • 明白な実装でテストを通す class Calculator { def add(i, j){

    return i+j } } プロダクションコード • 再び実行 • テスト成功! def testAdd1to1 { sut = Calculator.new() actual = sut.add(1, 1) assert 2 == actual } def testAdd2to1 { sut = Calculator.new() actual = sut.add(2, 1) assert 3 == actual } テストコード
  9. Refactor 重複を排除する • テストコードのフィクスチャを共通化 class Calculator { def add(i, j){

    return i+j } } プロダクションコード def sut def setup{ sut = Calculator.new() } def testAdd1to1 { assert 2 == sut.add(1, 1) } def testAdd2to1 { assert 3 == sut.add(2, 1) } テストコード • 再び実行 • テスト成功!