1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【テスト技法】テスト設計アプローチ

Last updated at Posted at 2025-01-29

はじめに

こんにちは。アメリカで独学でエンジニアを目指している者です。
現在はRailsを勉強しているのですが、並行してソフトウェアテスト技法も学ぶことで、Railsチュートリアルの理解が深まるのではないかと考え、テスト技法の勉強を始めました。
今回学んだテスト設計アプローチについて、記憶が薄れないうちに簡単にまとめておきたいと思います。

ちなみに、テスト技法はUdemyで勉強しています。とても分かりやすいので、テスト技法を勉強したいと思う方はぜひ見てみてください。

テスト設計アプローチ

テストには「正解」が常に存在するわけではなく、プロジェクトの状況に応じて判断が必要です。そこで役立つのが「テスト設計アプローチ」という考え方です。主に次の2つに分類されます。

  • 契約によるテスト
  • 防御的テスト

契約によるテスト

教材では以下のように定義されていました

事前条件の範囲内だけでテストを行うアプローチ
事前条件とは?⇒ 渡される必要のある引数など、メソッド(ソフトウェアテストの用語ではモジュール)が正しく呼び出される際に満たすべき条件

では前回の記事で扱ったコードを見てみましょう

if a <= 2
  # 処理
elsif a >= 10
  # 処理
else
  # 処理
end

ここで「a は自然数である」という設定があった場合、これが「事前条件」にあたります。
契約によるテストでは、この事前条件を満たす値、つまり自然数に対してのみテストを行います。

防御的テスト

教材では以下のように定義されていました

事前条件の範囲外もテストを行うアプローチ

if a <= 2
  # 処理
elsif a >= 10
  # 処理
else
  # 処理
end

「a は自然数である」という事前条件があったとしても、マイナスや小数点、分数、文字列など、想定外の値を渡したときの動作を確認するのが「防御的テスト」です。

Railsのバリデーションを例に考える

Railsチュートリアルを進める中で実際に出てきた例をもとに、契約によるテストと防御的テストを考えてみましょう。

user.rb
class User <ApplicationRecord
 validates :name, presence: true, length:{ maximum:50 }
end

models/user.rb では、name カラムに上記のようなバリデーションを設定しています。今回は、length: { maximum: 50 } に注目しましょう。

  • 契約によるテスト
    例えば、name50 文字以内であれば有効であることを確認するテストが該当します。
    事前条件として「name は文字列で、かつ 50 文字以内」という想定範囲内の値をテストします。

  • 防御的テスト
    一方で、「name が空文字だった場合にどうなるか」や「50 文字を超えた場合」にどう動作するかといった、事前条件の範囲外や境界ギリギリのケースをテストします。こちらが防御的テストにあたります。

まとめ

今回は、テストを設計する上での指針となる「テスト設計アプローチ」について解説しました。大きく分けると、

  • 契約によるテスト
  • 防御的テスト
    の2つがあります。テストを設計する際にこれらを意識することで、テスト漏れを減らし、より網羅的なテストを行えるようになるでしょう。

次回は、もう少し具体的なテスト手法について紹介する予定です

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?