kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Learn Go with Tests: テスト駆動開発を体験しながら Go を学ぼう

TDD(テスト駆動開発)を体験しながら Go を学べる学習コンテンツ「Learn Go with Tests」を紹介する❗️全てのコンテンツを実施してみて,非常に良かったのでまとめることにした💡

  • Go に入門できる
  • TDD のサイクル (Red / Green / Refactor) を体験できる
  • コンテンツは "35種類" もある
  • 無料で学べる
  • GitBook (GitHub) に公開されている
  • 日本語対応

英語版 📚

quii.gitbook.io

日本語版 📚

andmorefine.gitbook.io

コンテンツ一覧

なんと「35種類」もコンテンツがある❗️

Go fundamentals 🚢 21種類

  • Install Go(Go をインストールする)
  • Hello, world(Hello, World)
  • Integers(整数)
  • Iteration(反復、繰り返し)
  • Arrays and slices(配列とスライス)
  • Structs, methods & interfaces(構造体、メソッド、インターフェース)
  • Pointers & errors(ポインタとエラー)
  • Maps(マップ)
  • Dependency Injection(依存性注入)
  • Mocking(スタブ・モック)
  • Concurrency(並行性)
  • Select(選択)
  • Reflection(リフレクション)
  • Sync(同期)
  • Context(コンテキスト)
  • Intro to property based tests(プロパティベースのテスト概要)
  • Maths(数学)
  • Reading files(ファイルの読み取り)
  • Templating(テンプレート)
  • Generics(ジェネリクス)
  • Revisiting arrays and slices with generics(ジェネリクスを使用した配列とスライスの再検討)

Build an application 🚢 6種類

  • HTTP server(HTTP サーバー)
  • JSON, routing and embedding(JSON、ルーティング、埋め込み)
  • IO and sorting(IO、並び替え)
  • Command line & project structure(コマンドライン、パッケージ構造)
  • Time(時間)
  • WebSockets(ウェブソケット)

Testing fundamentals 🚢 2種類

  • Introduction to acceptance tests(受け入れテストの紹介)
  • Scaling acceptance tests(受け入れテストを拡張する)

Questions and answers 🚢 4種類

  • OS exec(OS 実行)
  • Error types(エラーの種類)
  • Context-aware Reader(コンテキスト認識リーダー)
  • Revisiting HTTP Handlers (HTTP ハンドラーの再検討)

Meta / Discussion 🚢 2種類

  • Why unit tests and how to make them work for you(ユニットテスト機能を作成する方法)
  • Anti-patterns (アンチパターン)

quii/learn-go-with-tests より引用

おすすめ理由 1

\( 'ω')/ Red! Green! Refactor!

何よりも TDD(テスト駆動開発)のサイクルを体験し,良さを実感できることが Learn Go with Tests の1番の素晴らしさだと思う.最初に期待するテストコードを書くけど,関数名がなく undefined エラーになって,コンパイルを通しつつ,期待する実装に近付けていく.そして,リファクタリングをしながら一歩一歩改善する.

実際に体験してみると「こんなに歩幅を小さく進められるんだ〜」「過剰なリファクタリングや共通化は不要なんだ〜」ということに気付ける❗️

  • テストコードを書く(落ちる : Red)
  • コンパイルを通しつつ最低限の実装をする(落ちる : Red)
  • 実装をする(通る : Green)
  • リファクタリングをする(通る : Green)

おすすめ理由 2

\( 'ω')/ Go に詳しくなれる!

TDD(テスト駆動開発)だけではなく,Go をちゃんと学べるのも良かった.特に Go fundamentals(21種類)は目次を見るとわかる通り,Hello World・スライス・マップのような基本的なトピックから始まって,依存性注入・goroutine・リフレクション・ジェネリクスのような実践的なトピックまで学べる.

他にも Build an application(6種類)では,net/http を使った API 構築や CLI 構築も体験できる.Go で API を実装するときのテスト戦略に悩むこともあると思うし,そういった参考にもなる❗️

とは言え,完全に Go 入門者だと途中から難しくなってしまうと思うので(個人差はありそうだけど),A Tour of Go ぐらいはやっておくと良さそう👍

go-tour-jp.appspot.com

おすすめ理由 3

\( 'ω')/ テスト手法に詳しくなれる!

Learn Go with Tests はテスト手法に対する理解が深まるのも良かった.Testify などは使わずにアサートを実装するし,テーブル駆動テスト (Table Driven Test) ・プロパティ駆動テスト (Property Based Test)・承認テスト (Approval Test)・モックなど,実践的に使えるテスト手法が出てくる.

今まで「テストが書きにくいからここは諦めよう...」と悩んだことがあったらきっと参考になると思う❗️

kakakakakku.hatenablog.com

日本語に関して 🇯🇵

Learn Go with Tests には日本語版 テスト駆動開発でGO言語を学びましょう がある.とても読みやすく翻訳されているし,Google 検索で候補に出てくることもあって,検索流入で本コンテンツを知る人も多いと思う.翻訳に感謝👏

しかし現時点だと,あまりメンテナンス(プルリクエストの取り込み)はされてなく,英語版 (quii/learn-go-with-tests) に対する更新の反映も止まっている.

ちなみに以下のコンテンツには日本語版がなく,今回は英語版で実施したため,ついでに翻訳も行った.Go fundamentals の4種類は既に完了してプルリクエストは出してある✅ 引き続き残りも進めていく予定だけど,もしリポジトリ運用が回ってなかったらメンテナとしてお手伝いしたく,コラボレーター権限をもらえると嬉しいなーと❗️❗️❗️

日本語版未対応のコンテンツ一覧

英語版 GitHub リポジトリ 👾

github.com

日本語版 GitHub リポジトリ 👾

github.com

まとめ

Learn Go with Tests でテスト駆動開発を体験しながら Go を学ぼう❗️

素晴らしいコンテンツでした❗️

参考 : 所要時間

GitHub のコミット履歴を確認したら「35種類」全てを実施するまでの所要時間は1ヶ月ほど(2/3 ~ 3/7まで)だった.毎日コツコツと1時間~1時間半ほど取り組んでいたため,所要時間の参考としては「30時間ぐらい」だと思う.追加で調査をしたり,誤りを直してプルリクエストを送っていた時間も含めている.コミット数は 237 だった👌

関連記事

kakakakakku.hatenablog.com