テストの初心者向けガイド:エッジケースのエラー処理

言語に関係なく、複雑なソフトウェアを構築する場合、テストの習慣にパターンがあることに気づき始めます。同じように見える問題は、異なるプラットフォームまたはプロジェクト間で発生します。講演用に別の簡単なやることリストのデモを作成する場合でも、PaaSスタートアップの包括的なバックエンドを設計する場合でも、同じ一般的なパターンが出現し始めます。

驚くべき数の問題に光を当てる、テストする必要のある6つのケースがあります。これらは、包括的であること、または独自の完全なテストスイートを意味するものではありません。むしろ、それらは、あらゆる言語、フレームワーク、または環境に適用できる一般的なテストパラダイムの覚えやすいサブセットです。

これらのケースは、日常のコーディングルーチンの2つの側面ですぐに役立ちます。発生した特定の問題のデバッグと、コードベースのテストスイートの作成です。これらは、ジュニア開発者が直面する最も一般的な問題のいくつかに光を当てる、一般的で抽象的な形式のテストを目的としています。

これらは、関数型プログラミングの回り道でのみ役立ちます。関数型プログラミングは、以下に概説する最も単純なタイプのバグの多くを回避します。いずれにせよ、これらの種類の抽象的な境界のケースは、コードの悪い慣行に対するガードレールを提供するので、覚えておくと便利です。

6つのテストは次のとおりです。

  • ゼロ
  • 1
  • 2から最大-1
  • 最大
  • max + 1

これらは境界の場合ですが、それらの価値はそれらが表すものにあります。テストがプログラムのすべての機能をカバーしていることを確認しながら、テストをできるだけシンプルに保ち、少しだけ工夫する必要があります。

ゼロ

ゼロは、未定義、null、空の配列、または単に実際の数値0であるかどうかに関係なく、あらゆる形式のnull入力を示すために使用されます。おそらく最も一般的で単純な形式のバグはゼロ値を参照することであり、常にテストが必要です。関数、エンドポイント、またはアップロードをゼロ入力でテストし、期待どおりに動作することを確認するだけです。

1

1つは、ゼロのように、一般化された単一テストの最も基本的な形式です。関数は、最初の有効な通常の入力でテストされます。これは回帰テストに最も役立ちます。コードの将来の反復では、このテストはプログラム(またはプロセス)が期待どおりに動作しているかどうかをすばやく示します。

1つのテストで、管理エンドポイントでの認証の成功、有効なファイルのアップロード、または正しいアレイの変更など、成功のベースラインが得られます。

2つは、配列インデックス2をテストすること、またはアルゴリズムが2つの入力で機能するかどうかだけではありません。また、同じコードを2回実行したときに何が起こるかについても説明します。

誰かが同じリソースに対して2回続けてDELETEHTTPリクエストを行うとしたら、どうなりますか?カスタムコンパレータを使用した並べ替え関数が2回続けて呼び出された場合、期待どおりに動作しますか?

2つは興味深い数字です。これは、一度呼び出されたときに機能する有効なコードが、繰り返し実行すると副作用を示すのは初めてだからです。上でテストした関数に小さな変更を加えます。

それは、状態の変更と、関数の動作の理解に帰着します。関数名だけの場合、このコードは予想どおりに正確に動作します。0という変数があり、関数setVarToOneを呼び出してから、それが1に等しいことを表明します。

一見すると、これは期待どおりに動作しました。ただし、Twoのアイデアを念頭に置いてテストすると、コードのより深い問題が浮き彫りになります。2回呼び出して、どちらの場合もmVarが1に等しいと主張してテストします。

2から最大-1

2からmax-1はサニティチェックです。Oneテストと非常に似ていますが、微妙な違いがあります。これは平均的なユースケースである必要があります—最も単純または最も単純な、または最も読みやすいものではありません。おそらく特に単純ではないが、それはかなり一般的な平均的なユースケースです

マックス

Maxはかなり単純です。アプリケーションの制限、特に定義された最大定数の周りをテストするだけです。

単純なリンクリストの実装がある場合、許可された挿入の数は一見無限にあると想像するかもしれません。実際には、上限があります。それがINT_MAXであろうと、OSが開くことができるファイル記述子の数であろうと、単にプログラムに割り当てられたメモリまたはディスク容量の量であろうと。

状況によっては、テストしているものに既知の最大値がないため、最大値は不可能なテストのように見える場合があります。ただし、これらの場合の目標は別の性質です。アプリケーションのストレステストを行うことです。

たとえば、ユーザーが送信した特定のデータが削減され、定義したループに到達するまで関数を通過する可能性があります。このデータがたとえばINT_MAXの場合、コードが完了するまでに無視できない時間がかかる可能性があります。さらに悪いことに、コードが停止しない状態になる可能性があります。これらは、コードが本番環境に移行したときにのみ発生する微妙な問題である可能性があるため、テスト段階でそれらをキャッチすることが重要です。

最大+1

Max + 1は、プログラマーによって設定された標準またはルールを検証するために主に使用されるテストです。これには、理論上の限界+イプシロンまで何でもテストすることが含まれます。

これは、配列の範囲外の問題、1つずれのエラー、整数オーバーフローエラー、または関数やプログラムの境界に達したときに発生するその他の種類の問題として現れる可能性があります。

ファイルの最大アップロードサイズが2MBの場合は、サイズが2mb + 1bのファイルをアップロードしてみてください。ユーザーカタログのエントリ数に制限がある場合は、検証がクライアント側クライアント側の両方で行われていることを確認してください。サーバ側。

結論

上記のように、これはデバッグまたはテストルーチンがどうあるべきかを完全に把握しているわけではありません。これは、特定のテストスイートまたはフレームワークを超越する必要がある堅固で一般的なベースラインを提供するだけです。

テストは一般的に境界またはエッジケースと見なされますが、すぐにはわからない場所で醜い頭を後ろに向けることができます。