はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在はRailsを勉強しているのですが、並行してソフトウェアテスト技法も学ぶことで、Railsチュートリアルの理解が深まるのではないかと考え、テスト技法の勉強を始めました。
今回学んだテスト設計アプローチについて、記憶が薄れないうちに簡単にまとめておきたいと思います。
ちなみに、テスト技法はUdemyで勉強しています。とても分かりやすいので、テスト技法を勉強したいと思う方はぜひ見てみてください。
テスト設計アプローチ
テストには「正解」が常に存在するわけではなく、プロジェクトの状況に応じて判断が必要です。そこで役立つのが「テスト設計アプローチ」という考え方です。主に次の2つに分類されます。
- 契約によるテスト
- 防御的テスト
契約によるテスト
教材では以下のように定義されていました
事前条件の範囲内だけでテストを行うアプローチ
事前条件とは?⇒ 渡される必要のある引数など、メソッド(ソフトウェアテストの用語ではモジュール)が正しく呼び出される際に満たすべき条件
では前回の記事で扱ったコードを見てみましょう
if a <= 2
# 処理
elsif a >= 10
# 処理
else
# 処理
end
ここで「a は自然数である」という設定があった場合、これが「事前条件」にあたります。
契約によるテストでは、この事前条件を満たす値、つまり自然数に対してのみテストを行います。
防御的テスト
教材では以下のように定義されていました
事前条件の範囲外もテストを行うアプローチ
if a <= 2
# 処理
elsif a >= 10
# 処理
else
# 処理
end
「a は自然数である」という事前条件があったとしても、マイナスや小数点、分数、文字列など、想定外の値を渡したときの動作を確認するのが「防御的テスト」です。
Railsのバリデーションを例に考える
Railsチュートリアルを進める中で実際に出てきた例をもとに、契約によるテストと防御的テストを考えてみましょう。
class User <ApplicationRecord
validates :name, presence: true, length:{ maximum:50 }
end
models/user.rb
では、name
カラムに上記のようなバリデーションを設定しています。今回は、length: { maximum: 50 }
に注目しましょう。
-
契約によるテスト
例えば、name
が 50 文字以内であれば有効であることを確認するテストが該当します。
事前条件として「name
は文字列で、かつ 50 文字以内」という想定範囲内の値をテストします。 -
防御的テスト
一方で、「name が空文字だった場合にどうなるか」や「50 文字を超えた場合」にどう動作するかといった、事前条件の範囲外や境界ギリギリのケースをテストします。こちらが防御的テストにあたります。
まとめ
今回は、テストを設計する上での指針となる「テスト設計アプローチ」について解説しました。大きく分けると、
- 契約によるテスト
- 防御的テスト
の2つがあります。テストを設計する際にこれらを意識することで、テスト漏れを減らし、より網羅的なテストを行えるようになるでしょう。
次回は、もう少し具体的なテスト手法について紹介する予定です