単体テストの考え方/使い方
単体(unit)テストの原則・実践とそのパターン ― プロジェクトの持続可能な成長を実現するための戦略について解説。 ...
https://www.amazon.co.jp/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E4%BD%BF%E3%81%84%E6%96%B9-Vladimir-Khorikov/dp/4839981728
こんにちは、ナイトレイインターン生の保科です。
Wantedlyをご覧の方に、ナイトレイのエンジニアがどのようなことをしているか知っていただきたく、Qiitaに公開している記事をストーリーに載せています。
今回はエンジニアの船津さんの記事です。
少しでも私たちに興味を持ってくれた方は下に表示される募集記事もご覧ください↓↓
今回は、新人エンジニアが「単体テストの考え方/使い方」の第一章を読んだので、備忘録としてまとめてみました。今後、読書録シリーズの続編も出す予定です(予定です)。
では、早速本題へ→
単体テストを書くうえで、テストにかける労力をできる限り抑え、テストから得られる効果を最大限に引き出すことが重要。
単体テストの実施は当たり前。捨て去られること前提のプロジェクトでない限り、必ず書かれる。
現在の課題は、「単体テストを書くべきか」ではなく「良い単体テストを書くとはどういう意味か?」
単体テストは、ソフトウェア開発を、持続可能なものにするために行う。
*退行: 特定の変更をした後、意図したように動かなくなること。バグ。
単体テストはただ書けば良いのではなく、「質の良い」テストを書かなければいけない。たとえば、テストに時間がかかりすぎたり、退行を検出できなかったり、保守コストがかかりすぎた理、間違った理由でテストが失敗することが増えすたりれば、テストの存在によって、プロダクト開発の進行が脅かされる。
また、テストコードの保守コストは、以下のような作業の積み重ねで増加する。
網羅率:テストケースが実行するプロダクションコードの割合
一般に、網羅率は高いほど良いとされるが、「高ければ良い」わけではない。
コード網羅率 : プロダクションコードの総行数に対する、テスト時の実行行数。実行されたコードの行数÷総行数
分岐網羅率 :プロダクションコードの分岐路に対する、テスト実行時に経由される分岐の数。経由された経路の数÷分岐経路の数
import pytest
def example(num):
if num < 5:
return "short"
else:
return "long"
def test_example(num):
actual == example(num) # プロダクトコードを実行
2. 網羅率を算出する際、使用するライブラリなどのコードは計測の対象から外れる
網羅率は、「テストが十分に行われていないこと」を検証するための数値であり、「良いテストであること」を保証するものではない。加えて、高い網羅率を義務付けるような使い方をすると、かえって開発の妨げとなる可能性が高い。
テストケースの良し悪しを、定量的に自動で判断する方法は存在せず、結局のところ、1つずつ個人が判断するしかないが、優れたテストスイートの特徴を挙げることは可能である。
個人的に、「テストすることが開発サイクルに組み込まれている」ことが重要だなと感じています。
元々、私が参画しているプロジェクトでは、ユニットテストを書いていませんでしたが、テストを書く習慣がついてからは、予期せぬバグが減ったのはもちろん、自分自身のコードへの理解力が上がったり、プロダクションコードを綺麗に書こうという気持ちが強くなったりしました。
この本の概要を理解できたら、使っているテストフームワークの勉強を体系的にしてみたいなと思ってます。
*今回の本はこちら↓