テストコード好きがテストを布教し続けた結果プロダクトや個人がどう変わったか

サーバーサイドエンジニアの小久保(@yhei_hei)です。

本日からクロスマートに関連した技術的なお話を書いていきます。

皆さん、テストコード書いてますか?

突然ですが、小久保はテストコードを書くのが大好きです。

本業はもちろん、個人開発でもテストコードを書いています。

時折、ロジックを書きたくてプログラミングしているのか、テストコードを書きたくてプログラミングしているのか、よくわからない感じになりますw

日々Twitterでテストコード書け書けと啓蒙中です。

↑最近流行のブロックチェーン関連の開発でさえテスト環境を整え始める小久保

そんなテスト狂の僕なので、クロスマートの面接も

「テスト書けます!」

「テスト書かせてください!」

の一点張りで入社しました。(超意訳)

入社当初はAPIのテストコードがなかった

で、2022年の1月におっかなビックリ人生初のスタートアップにフルリモートエンジニアとして乗り込んだわけです。

そこでクロスマートのプロダクトコードを見ることになるのですが、

「む? APIのテストがないぞ??」

と言うのが第一印象でした。

当時のカバレッジは41%と低め。

重要なバッチにはテストコードが書かれていましたが、APIにはテストコードがありません。

慣らしタスクのついでにテストを書きまくった

入社して1ヶ月くらいは慣らしタスクとして、簡単なAPIの改修を任されてました。

なんとかテストコードを増やしたかった僕は、慣らしタスクのついでに、APIのテストを勝手に書いていったのです。

例えば商品一覧取得のAPIの改修があれば、改修と同時に正常系のテストを書く、みたいな。

どんどん正常系のテストが追加されていき、改修がやりやすくなっていきました。

勉強会でAPIのテストの書き方講座をやった

ただ、1人でテストを書いていても限界があります。

これから改修の入る機能、新規で作られる機能、全てにおいてテストが書かれる必要があります。

チームメンバーの協力が不可欠です。

そこで毎週木曜の10分勉強会で、APIのテストの書き方講座を実施しました。

モックを使う派と実DB使う派の論争から始める小久保

うちはDjango+Django Rest Framework(以下DRF)を使ってAPIを作ってます。

基本的にJWT認証ありきのAPIのため、テストの書き方にちょっとした癖があります。

あんまりJWT認証つきのテストコードの解説ってないんですよね。。。

その辺りの書き方の基本を解説し、これを真似していけば他のAPIのテストも書けちゃうよみたいな状態に持っていきました。

ちなみにDRF+JWT認証の具体的なテストコードの書き方は小久保のブログにまとめてあります。興味のある方は是非↓

django.yhei-web-design.com

皆がテストコードを自主的に書くようになった

すると、気づけばほぼ全エンジニアがテストコードを自主的に書いてくれるようになりました。

なかには

テスト駆動開発...だと...?

こんなことを言ってくれる方もおり、 ですよね〜〜〜〜!!! 僕が言いたかったやつこれなの〜〜〜〜〜〜!!!!!!! って感じ。

テストコードが加速度的に増えていきました。

バグを拾ってくれるのはもちろん、レビューしやすくなった

Joinした初期の頃はレビューが来ても既存仕様を読み解くのに時間がかかっていました。

が、最近ではテストコードで仕様がある程度読み解けます。

assertを見て仕様を読み解く

結果、圧倒的にレビューしやすくなりました。

まさに「動くドキュメント」としてテストコードが機能しており、僕の心の中の@t_wadaさんも思わずニッコリ。

もちろん、CI上で動いてバグ検出もしてくれるのでコード修正の負担がかなり減りました。

理想は全仕様がテストコードで表現されている状態

勉強会を終えて数ヶ月。複数人でテストコードを書いて行った結果、

カバレッジは41% → 58%まで上昇しました。

Googleの指標によると60%から許容可能になるとのことで、まだギリダメですw

Google we offer the general guidelines of 60% as “acceptable”, 75% as “commendable” and 90% as “exemplary.” However we like to stay away from broad top-down mandates and encourage every team to select the value that makes sense for their business needs.
Google Testing Blog: Code Coverage Best Practices

とは言え鬼門の50%を超え、体感的にはようやく少し安心して開発ができるようになりました。

また、メンバーからも「仕方なくテストを書いている」というよりは「有用だから書いている」というのがひしひしと伝わってきます。

これがマジで嬉しいです。

そうなんです。テストって便利なんですって。それが伝わればもう本望です。

とは言いつつ、さらなる改善はやっていきます。

次なるゴールは

  • 全ての重要な仕様がテストコードに書かれている
  • そしてそれが読みやすく、ドキュメントとして機能する

と言ったところでしょうか。

単にカバレッジをあげることを目的とはしません。

例えば3年後。

現メンバーが別プロジェクトに配属されバラバラになり、当初の仕様を誰も知らない状態になったとしても。

残った人がテストコードをもとに仕様を読み解き、99%のデグレはテストコードで検出できる、という状態。

これが理想です。

そのためにはさらにメンテナブルなテストコードの書き方、読みやすいテストコードの書き方をチーム全体で習熟していく必要があります。

やること満載です。

これからも快適なテストライフを送るために、ガンガン啓蒙活動を続けていきます。

時々、具体的なテストコードの書き方も載せていく予定なのでお楽しみに。

クロスマートが気になってきた方はこちら

クロスマートでは絶賛エンジニア募集中です。

このお話を読んでちょっとでも気になった方がいたら

「話を聞きに行きたい」を押してみてください!

xorder.notion.site