2018年12月14日 テクノロジー

<開発プロセス公開・第二弾>品質アップのための単体テストの導入

こんにちは、エリックです。久しぶりの記事ですね。今回は開発にとって重要な部分について書いていきたいと思います。

開発にあたって
・最終的にバグが少ない
・エラーがでないこと
この二つが一番大事だと言っても過言ではないですね。

時にバグを修正したつもりが、レグレッションが発生し、新しいバグが出来てしまいます。単体テストを導入するとバグ数が減り、レグレッションの発生率を低下させることができます。アイスリーデザインでは高品質を目指して、どのようなプロセスを行っているか一部を説明します。
 
 

開発フロー説明

まずは「テストすべき」「テストしないべき」というカテゴリに分けます。
 

「テストしないべき」ものとは?

主に我々が実装していないコード、いわゆる外部API、ライブラリの動作など。こちらの「テストしないべき」部分を開発している方々が、すでにテストし世の中に提供しているコンポネートなので、我々利用者がテストをする意味はあんまりないですね。そして「テストすべき」は我々が作っているプログラムのロジックですね。実装している機能はネットを通してAPIを叩いてる部分があれば結果を想定できず正確な単体テストをうまく作成することができません。

実装している機能の中に外部のリソースをインスタンスすると、それら固定されてしまい、外部リソースはテストに想定できない影響を与えてしまうことがあります。そうならないように外部リソースを装って、モックを作って期待しているアウトプットを常に出します。このようにモックを通して単体テストで実装している機能のロジックを確認できます。
もちろん、モックの作成に失敗したら単体テストがエラーになったり、想定している動作が行われないこともあります。

しかし、先ほど話した通り、機能の中に固定しているインスタンスがあり、モックを作成することができないのです…。
 
 

 
 
そこで大事なデザインパターンが入ります。「Dependency Injection(依存性の注入)」です。機能を実装する時は、使っている外部API・ライブラリに依存しているクラスをインスタンスして固定するのではなく、コンストラクタかメソッドに引数としてリソースのインスタンスを渡します。こうすると、単体テストでモックが作れるようになるだけではなく、同時に外部リソースが開発中になっていてもスタブを作って我々が実装している機能の開発をが進めることができます。アイスリーでは「Test-Driven Development(テスト駆動開発)」という開発手法でも進めていますが、こちらは次回でお話します。

テスト可能なロジックが実装できて単体テストが作れるようになっても、単体テスト自体はそう簡単に作れるものではないですね。想定しているインプットに対して、正しいアウトプットを確認するのはもちろんですが、想定していないインプット(例外など)に対して、正しいアウトプットがあることを確認することも大事です。例えばエラーメッセージを返したり、空の値を返したりなど(こちらは設計と実装により変わります)。
 
 

メリットとデメリット

単体テストを作成する、依存性の注入を使うなど、高品質を目指すにはメリットとデメリット様々があります。
 

「メリット」

開発が進み、複数の変更やリファクタリングが行われた時としても、各機能は正常に動いているかどうかをすぐに確認できます。レグレッションの発生がにすぐに目をつき、修正することができます。複数人で開発を行なっている場合は特に大事ですね。自分が作ってないコードを変更し、単体テストを実行するだけで期待しているアウトプットが変わってないことを確認でき、自分の変更による機能が壊れてないことがある程度、確認できます。

「デメリット」

デメリットというもの自体は、他の手法や新技術と同じく、やったことないプロセスに慣れるまで時間と努力が必要だということですね。手間がかかり、実装を行うにはより時間が必要ですが、一度慣れたら開発が円滑に進捗して、品質をあげることができます。
 
 

まとめ

我々が作ったコードがテストできることはとても大事なことですね。品質をあげることにはエンドユーザにいい影響を与えるだけではなく、
バグを低下するにあたって、工数を無駄なタスクに使わず、その時間を他の大事なタスクに使うことができます(改善したり、新しい機能を追加したりなど)。プロジェクトの工数が減りますし、より大きな利益を得ることもありますね。

もちろん、バグが発生すること自体は防ぐことができません。必ずバグが発生しますが、コードに対する単体テストを作ることにで、バグの数を減らすことができるし、レグレッションをなくすことができます。
 
 
 
開発プロセス大公開・第一弾はこちら!

2018-11-16
こんにちは、荒澤です。 最近は、ごっりごりテストスクリプトを書いて、毎日奮闘しています。今回は弊社で実施している、Ap
 

現在、アイスリーデザインでは以下のエンジニアを大・大・大募集中です!

・システムエンジニア
・アプリエンジニア
自社クラウドサービスからウェブ、アプリの受託開発までチャレンジしてみたい方はぜひご応募ください♪一緒に楽しく働きましょう!お待ちしております!

ご応募はこちらから↓
https://www.i3design.jp/recruit/