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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for terahide terahide
September 30, 2023

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

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

Avatar for terahide

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) } テストコード • 再び実行 • テスト成功!