失敗から学ぶ、テストを書く上で持っておくべき心構え
みなさんは普段テストを書きますか?
会社内のルールで決まっているからなんとなく書いているという方も少なくないのではないでしょうか?また、特にユニットテストなどを書くときはこんな当たり前のこと書く必要あるのだろうかと感じてしまうこともあるかと思います。
私自身も以前まではテストなんて書かずに機能実装をもっとさせてくれよ!と内心思っていました。
しかし、テストを軽んじて失敗した経験もありました。
そこで、本記事では、私が考えるテストを書くメリットについてと、どのようなマインドでテストを書くとその目的は達成できるのかをまとめたいと思います。
テスト甘く見ると怖い話
開発をしているとテストのメリットが見えづらい
まず、前提として、普段開発を行っているエンジニアの視点からはテストのメリットは分かりづらいように思います。むしろ、テストは機能リリースにあたり、面倒なステップだとデメリットに感じている方も少なくないかもしれません。
実は、私も初めて開発組織に所属したときには、なぜこんな煩わしいことをやらなくてはいけないのか、もっと機能実装をさせてくれと思っていました。
もちろん、締め切りの近い開発に間に合わせるが必要がある時には、テストをスキップした方ビジネス判断上、よいケースもあると思います。
でも、テストはやらないと後が怖い
しかし、テストを疎かにするとどこかで多かれ少なかれ痛い目に遭うと思います。
以下は私の経験談として、テストはなんとなくでいいよねというマインドで業務をしていたある日、痛い目に遭った話をしたいと思います。
自分が実装した機能がバグに
(ありたきりな展開なのですが) 結論から言うと、簡易ケースしかテストを作らずに実装を進めてしまったことで、私はアプリにバグを作ってしまいました。
当時、私は数万件の情報を保持する企業検索用データベースサービスの開発に従事していました。
その当時は、本サービスにはまだテキスト検索機能が実装されておらず、本機能の実装に私は担当させてもらいました。
重要な機能であり、ビジネスサイドからも要望が高く、それに応えるべくテストもなんとなくで、急ピッチで実装を進めました。
結果は、どうなったのか?
私が作った機能は以下のような動作となってしまいました。
- 「ソフトバンク」と入力すると、「ソフトバンク株式会社」「ソフトバンクグループ株式会社」がヒットする → ⭕️
- 「花王」と入力すると、5分くらい結果が返ってこない → 😅
- 「ホンダ」と入力すると、「株式会社ホンダソーラー富士」がヒットする → 😱
既にお察しかもしれませんが、私は開発段階では「ソフトバンク」という文字列のみで検索のテストをし、そのケースが動いたら「できた!」と思い込んでしまっていました。
実際には、欠陥だらけの機能をリリースしてしまうことになりました。
ちなみに、余談ですが、最近話題になっているTwitter社なのですが、Elon MaskがTwitterの検索機能について以下のように述べているようです。
どこか他人事に感じられないです。。。
ここからが辛い
バグを作ってしまってからなにが辛いか、それはここからでした。
私は意気揚々とビジネスサイドに機能リリースしましたと伝え、営業の方々は顧客へ製品の説明に行きました。
しかし、製品紹介でことごとくバグが露見し、営業の方々は恥をかいて帰ってくることになりました。ここで何が辛いかというと、自分が犯してしまったミス・バグで仲間である営業の方々が文句を言われるということです。この時はかなりメンタル的に辛いものです。
営業の方も私に怒ることはなく、優しくしてくれしてくれましたが、それが逆に辛かったです。
結果として、本機能は即日でロールバックされ、先輩エンジニア数名にヘルプいただきそこから数週間かけて再リリースすることになりました。
先輩方からはこんなのはしょっちゅうだから、と声をかけてもらいましたが、私のミスで少なからず会社の製品評判にも影響を与えてしまったと、強く反省しました。
人一倍テストをがんばることに
ここまで私の失敗談を書かせていただきましたが、その後私はどうしたか?
このような経験から、あのときどうすれば失敗を最小限にできたのかと反省するようになり、たどり着いたの、テストを書きまくるということでした。
テストというと、日本では@t_wadaさんがあまりに有名かと思います。
もし、テストについてもっと詳しく知りたいという方はぜひ@t_wadaの各種情報を参照することを強く推奨します。
私自身@t_wadaさんの記事などを拝見し、多く学ばせていただいております。
なお、以降では、なぜ私が上の失敗からテストを人一倍書こうと思うようになったのかについてまとめます。そのため、あくまでも私のマインドチェンジの理由や現在の心構えが中心になりますので、テストの技術的なことはほとんど書きませんので、ご了承ください。
テストの目的を考え直す
先にも書きましたが、普段開発を行なっていると、なぜテストを書く必要があるのか、その目的を理解するのは難しいと思います。
では、上のような失敗を経た私は現在どのような目的・意義を持ってテストを書いているのか。
それは以下です。
自分の書いたコードに自信を持つため
なんて内面・心理的な理由って思われるでしょうか?
簡単にバグを見つけられるとか、もっと実用的な理由ではないのかと思われたかもしれません。
でも、私はむしろこの心理的な側面の方が大事だと思っています。
それは、先の失敗談でいうと、私は自分のコードに自信を持てていなかったからです。
コードのデプロイ時にはちゃんと動くコードだ!と自信を思っていました。ですが、先輩エンジニアがジョインしてから、その自信はどんどん失っていくことになりました。
このケースは考慮した?こういうときはどういう動きになるの?という私の頭から抜けていた角度の質問をもらう度、私はどんどん自信を失っていきました。
自分の書いたコードに自信を持てないというのは辛いものです。
では、どうすれば自分のコードに自信を持つことができるようになることをできたのか?
そこで必要だったと思うのがテストだと気付かされました。
テストを書くことで自分のコードに自信を持てる
上の失敗談で具体的に先輩から指摘された内容の一例を紹介したいと思います。(関連したバグをその後に括弧で追記しています)
- 検索に入れる会社名が他の会社でも被りそうな文字列だった場合、検索結果の表示ソートは何を基準にしている?
- 検索結果の件数が多くなっちゃう検索文字は考慮してる?
- 空白(スペース)の取り扱いはどうしている?
上のような指摘をもらった時にそれぞれどのような結果が表示されるか私は即答できませんでした。結果手動で試したところ、以下のような結果が得られました。
- 検索に入れる会社名が他の会社でも被りそうな文字列だった場合、検索結果の表示ソートは何を基準にしている?
- "ホンダ"と入力したら、"ホンダソーラー"がトップに表示されてしまう
- 検索結果の件数が多くなっちゃう検索文字は考慮してる?
- "株式会社"と入力したら一生終わらないくらい検索に時間がかかる
- 空白(スペース)の取り扱いはどうしている?
- "トヨタ"と"トヨタ "で結果が変わってしまう
このケースの時にはこの結果が返ってくる、というフィードバックを小さく得ながらコードを書かないと結果が想定していなかった方向に行ってしまう、ということを強く感じた瞬間でした。
このフィードバックを得る方法がまさにテストであり、もし上の指摘されたケースもテストが書けていれば、私は自信を失うことはなかったのだろうと思います。
また、先輩エンジニアから質問をされても、このテスト結果がこうなっているのでこのような動きになります、と即答できたと思います。
逆に言うと、自分のコードが想定通り動いていると自信を持つためにはテストを書くことは必須なのだと痛感しました。
テストをうまく書く方法
テストを書くことで、自分のコードに自信が持てる、だからテストはしっかり書くべきだ、というのはご理解いただけたのではないでしょうか?
しかし、具体的にどうやったらテストをうまく書けるようになるのか?と気になっているのではないでしょうか。
これは私も正直まだわかりません。ただ、一つ感じていることがあります。
テストをうまく書けるエンジニアは、そのプロダクトのことが好きである、ということです。
どういうこと?と思われますが、これは至極当たり前のことだと思っています。
例えば、先の企業検索データベースサービスを例に考えます。
もし、このプロダクトのことをあまり考えていないエンジニアであれば、先に上げたバグである「検索時間がものすごくかかってしまう」や「ホンダと検索してホンダソーラーがトップに表示される」はバグだときづけるでしょうか?
自分のプロダクトの目的をしっかり把握し、ユーザ目線で考えられるエンジニアが上のようなバグを見つけられるのだと思います。
これらのことを総称して、テストをうまく書くのに必要なスキルは、とことん自分のプロダクトを好きになることだと私は思っています。
終わりに
最後まで読んでいただきありがとうございます。
本記事では私の経験談をもとに、なぜエンジニアはテストを書くべきなのか、テストを書く上では自分のプロダクトを好きになることが大事なのではないか、という内容で書かせていただきました。
私自身まだそこまでエンジニア歴も長くなく、今回の記事に書いた内容が普遍的な正解だとは思っておりません。ですが、現時点での自分の意見ということで言語化させていただきました。
世の中には天才エンジニアと呼ばれる方も数多くいらっしゃいます。
そのような方が書くコードはバグがない完璧なコードであり、テストなんて必要ないと言う可能性もあります。
しかし、私のような凡人エンジニアは常に謙虚に自分にはミスがあるはずであり、少しでも自信を持ってサービスリリースするためにもテストを書くことが必要なのではないかと思います。
もし、また機会があれば、次回はどうすればテストをうまく書けるか、Tipsのような内容も書いていけたらと思います。
株式会社InnoScouterのTech Blogです。 組織から「できない」をなくすをミッションに、大企業とスタートアップ企業の連携をサポートするSaaS「InnoScouter」を提供しています。 採用情報はこちら herp.careers/v1/innoscouter/inPUbSL4Bofu
Discussion