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

Goで始めるTDD

 Goで始めるTDD

# 説明
\非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク
以下のイベントで登壇した内容です
https://andpad.connpass.com/event/243953/

glassmonenkey

April 28, 2022
Tweet

More Decks by glassmonenkey

Other Decks in Technology

Transcript

  1. © 2012-2022 BASE, Inc. 1 Goで始めるTDD \非公式/ Go Conference 2022

    Spring スポンサー企業4社 アフタートーク BASE株式会社/永野 峻輔(@glassmonenkey)
  2. © 2012-2022 BASE, Inc. 2 #gocon2022_4sponsor @glassmonkey 自己紹介 所属 BASE

    株式会社 BASE BANKチーム Engineering Program Manager 資金調達プロダクト「YELL BANK」の開発責任者やってます。 Go, PHP, Pythonを書きつつ時々データエンジニアも。 趣味 Flutterアプリ開発 hasura.ioやsupabaseがマイブーム SNS Twitter:@glassmonekey  Github: https://github.com/glassmonkey 永野 峻輔 (ながの しゅんすけ) #goconで発表したこと
  3. © 2012-2022 BASE, Inc. 4 #gocon2022_4sponsor @glassmonkey 今日話すこと • TDDとは

    • 題材について (姓名分割処理) • 実践してみた
  4. © 2012-2022 BASE, Inc. 5 © 2012-2022 BASE, Inc. 5

    TDD(テスト駆動開発)について
  5. © 2012-2022 BASE, Inc. 7 #gocon2022_4sponsor @glassmonkey テストを書く理由 • 不安の軽減

    • 開発者へのフィードバック • デグレの防止 • ナレッジの蓄積 … etc
  6. © 2012-2022 BASE, Inc. 8 #gocon2022_4sponsor @glassmonkey テストの種類 • 説明的なテスト

    ◦ コードの振る舞いを明らかにするようなテスト • 学習用テスト ◦ 新機能の試用やキャッチアップ用途なテスト • 回帰テスト ◦ 不具合の解消を証明するようなテスト
  7. © 2012-2022 BASE, Inc. 11 #gocon2022_4sponsor @glassmonkey 以下のステップで行われる作業の順序 • レッド:

    動作しない状態 • グリーン: 何でも良いからテストをパスする状態 • リファクタリング: ロジックが整理された状態 テスト駆動開発 (著)KentBeck (訳) 和田卓人 訳
  8. © 2012-2022 BASE, Inc. 16 #gocon2022_4sponsor @glassmonkey TDDの心構え • シンプルなケースから始める

    ◦ 正常系や結果が空のものとか • カバレッジを気にしすぎない ◦ テストで気付けるのはあくまでテストケースに対して ◦ テスト自身は品質を上げない • 不安ならテストを書く ◦ 最初は迷ったら書く
  9. © 2012-2022 BASE, Inc. 20 #gocon2022_4sponsor @glassmonkey -nameで分割したいフルネーム -parseで分割文字列 (デフォルトは半角スペース)

    Python製のrskmoi/namedivider-python を移植 詳しくはhttps://github.com/glassmonkey/seimeiを見てね
  10. © 2012-2022 BASE, Inc. 21 #gocon2022_4sponsor @glassmonkey rskmoi/namedivider-python https://github.com/rskmoi/namedivider-python name

    の場合は名前分割 → 移植した機能 file経由で複数分割も可能 api用のコンテナも用意されている
  11. © 2012-2022 BASE, Inc. 25 #gocon2022_4sponsor @glassmonkey 分割アルゴリズム • ルールベース

    ◦ 2文字の場合のみ適応 ▪ 乙一 → 「乙」「一」 • 統計量ベース ◦ 特徴量から最良のパターンを採用する ▪ 篠田麻里子 → 「篠」「田麻里子」OR 「篠田」「麻里子」etc…
  12. © 2012-2022 BASE, Inc. 26 #gocon2022_4sponsor @glassmonkey 2つの特徴量 • Order

    Point ◦ 文字の出現順序に着目 ▪ 篠田麻里子 → 「篠田」 「麻里子」 • Length Point ◦ 名字 or 名前の長さに着目 ▪ 松高子 →「松」 「高子」 ▪ 松高萌 →「松高」 「萌」 姓名分割プログラムをつくる-手法編-
  13. © 2012-2022 BASE, Inc. 28 #gocon2022_4sponsor @glassmonkey Goでの実現性について • 特徴量は数値の固定長配列

    ◦ sliceで問題無さそう • numpy使ってた箇所 ◦ ほぼ四則演算だったので問題無さそうだった ◦ 一部簡易的な実装にした • 特徴量マスターデータがcsv管理されている ◦ go:embed使えばIO無視出来そう
  14. © 2012-2022 BASE, Inc. 30 #gocon2022_4sponsor @glassmonkey 実装方針 • TDDで小さく作りはじめる

    • テストデータは元ツールから生成 • マスターデータは元ツールに依存するように
  15. © 2012-2022 BASE, Inc. 31 #gocon2022_4sponsor @glassmonkey TDDで小さく作る 小さく段階を踏んで学習サイクルを回しながら作った 田中太郎

    -> 田中 太郎 乙一 -> 田中 太郎 竈門炭治郎 -> 田中 太郎 v0.0.1:ダミーパーサーによる実装 目的: CLIの実装 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 田中 太郎 v0.0.2: ルールベースによる実装 目的: パーサーの仕組みの追加 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 竈門 炭治郎 v0.0.3: 特徴量ベースによる実装 目的: アルゴリズムの再現
  16. © 2012-2022 BASE, Inc. 33 #gocon2022_4sponsor @glassmonkey Table Driven Test

    • テストのバリエーションを増やしやすい ◦ テストを書く心理的ハードルが下がる • t.Parallel() を使うときは注意 ◦ tt = tt を忘れないように https://github.com/golang/go/wiki/TableDrivenTests
  17. © 2012-2022 BASE, Inc. 39 #gocon2022_4sponsor @glassmonkey 感想 • TDDで学びながら作れた

    ◦ 動かしながら検証というプロセスが良い ◦ 業務の合間に作ったので思い出しながら作ることができた ◦ デバックした内容が知見として貯まるのでデグレ防止になった • Goへの移植について ◦ シングルバイナリなので考えることが減って良い ◦ go:embedの使い所が理解できた。 ◦ 大体のことが標準ライブラリで可能なので学習コスト低くて良い