読者です 読者をやめる 読者になる 読者になる

ぺぷしのーげん

アプリケーションエンジニア(C#er)による雑記ブログ

会社でユニットテストを書いてみて分かった3つのこと

f:id:hazakurakeita:20150902220743j:plain

ぱくたそ - フリー写真素材・無料ダウンロード

今やユニットテストを書くことは常識ですが、恥ずかしながら今まで書いたことありませんでした。必要性は重々承知していましたが、なかなかきっかけがないと難しいものですね。今回は忘れないうちに書いて思ったことを残しておきます。

 

実装前のユニットテストが失敗する確認っていらなくね?

テスト駆動開発では最初にユニットテストを書き、すべて失敗することを確認してから実装を開始します。当初はわざわざ実行する意味が分かりませんでした。実装していないから失敗するに決まってるじゃーん。だがしかし、これが結構テスト通っちゃうんですね笑。んなアホなって思ってたんですが、例えば下記のようなミスやっちゃってました。

    public void Unittest1(){
    ...
    if(...){ return True; }
    Try
    {
      if(...) { Assert.fail(); }
    }
    catch{}
    }

 全然理解してませんでした笑。Assert.fail()が実行されると、ここでテスト終わると勘違いしてました。実際には例外がスローされるので、catchされてしまいます。するとどうでしょう。テストが正常終了してしまうのです。ははは。こんな感じで意外と失敗するはずのテストが成功します。すべて失敗することを確認するというのは、ユニットテストにバグがないか調べるという意味があったのですね。

 

 コードの変更も怖くなくなる。躊躇しなくなる。

実装が終了してコードレビューを行うとき、「やっぱしこうしたほうがいいんじゃない?」という指摘を受けることがあります。このときに一部の処理を別のクラスに移したり、アルゴリズムを修正したりするのは結構面倒です。修正量は大したことがなくても、場所によってはテスト量が多くなってしまうからです。簡単な修正なのに、テスト工数を考えると修正できない!なんて悩みからユニットテストは解放してくれました。これも頭では理解していたつもりなんですけど、実際にこの利点を享受すると思ってた以上に助かります。

 

 ユニットテストの大事さを理解してない人が多い

これはもはや愚痴笑。弊社はユニットテスト書かない人が大半なのですが、なんと引き継いだコードがユニットテスト付だったのです。やったー。と、思ったのは間違いでした。修正後にユニットテストを実行してみると失敗の嵐。ナンテコッタイ。念のため、僕の修正前の状態でユニットテストを実行してみました。すると結果は全く同じ。なんと、ユニットテストが大量に失敗する状態で僕に引き継がれたのです。ごめん、ちょっと意味が分かんない。前任者に話を聞いてみると「ごめんなさい、仕様が変わったからテスト通らなくなってるね」。え?なんで修正したときにテスト通してないの?え?どういうこと?

こんな感じでユニットテストの大事さを理解していない人ってまだまだ多いみたいです。え?それとも弊社だけ…?