アサーションとは何か？TDDとAPIテストでの実装法

## はじめに
テストを実施する際には、アサーションを利用することが非常に重要です。プログラミング開発中にアサーションはテストにおいて欠かせない要素にもなっています。本文では、アサーションという概念の基本情報を皆さんに紹介した上、さまざまな言語でアサーションを実装する方法を皆さんに紹介します。

:::note info
もし、APIやアプリケーションを開発しており、強力なAPIツールとのシームレスな統合が必要であれば、ぜひ無料でApidogをお試しください！[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)は、洗練されたユーザーインターフェースの構築に集中しながら、APIのスムーズな連携を実現するための理想的なツールです。
:::


## プログラミングのアサーションとは
アサーション(assertion)とは、プログラミングのデバッグやテストのために用いられる方法の1つです。日本語の中で、アサーションを「表明」として表現することもよくあります。

アサーションはプログラムの中に設けられたチェックポイントで、その地点で意図した条件が満たされていない場合にプログラムの実行を中止させることができます。

具体的には、プログラマが「この条件が真であるはず」ということをアサート(assert)する文をプログラム中に記述します。その条件が偽だった場合、アサーションによって例外が発生したり、エラーメッセージが表示されるといった動作がおこなわれます。これにより、想定外のデータが渡された場合や、バグによって意図しないコードのパスが実行されそうな場合に、早期に気づくことができるようになります。プログラムの安定性や信頼性を高める効果があります。

アサーションはテスト中に使われるほか、プログラムリリース後もチェック機構として実装されることがあります。

### アサーションのサンプル
つまり、アサーションは「この地点で取得したデータや値が、正常な場合に予測されるものと一致しているはず」という憶測をコードの中に記述したものです。したがって、アサーションが失敗した場合、つまりアサート条件が偽と評価された場合は、そこで取得したデータが開発者の予測した範囲外の異常なものである可能性が高いと判断できます。

例えば、ある関数の返り値が負の値にはなりえないはず、という場合に、その返り値が0より小さいかをチェックするアサーションを実装できます。これが失敗すれば、その関数に何らかのバグがあることがわかります。

このように、アサーションは「取得したデータが想定内の正常なものか」を判断するのに用いられます。想定と違った場合に早期に検知できるのがアサーションの大きなメリットです。

## テスト中にアサーションが不可欠な理由
テストを実施する際にアサーションを利用することは非常に重要です。以下のようなメリットがあるため、アサーションはテストコードにおいて欠かせない要素といえます。

- テスト結果を即座に確認できる
- テストが意図した通りに動作したかを検証できる
- テスト条件が妥当なデータかを判断できる
- テストが失敗した要因を特定しやすい


アサーションによって各テストケースのパス/フェイルを判断できるので、テスト結果の正確性が向上します。また、テスト実施中に意図しない異常系のケースが発生しても、アサーションが検知することで早期発見が可能です。

そこで、テスト品質や網羅性を高めるうえでアサーションは欠かせません。テストコード作成時やレビュー時に、適切なアサーションが実装されているか確認するのが大切です。

## アサーションの実装方法：Java、JSとPython
それでは、アサーションを実装するには、どうしたらいいですか？次は、皆さんによく使われているJava、JSとPython言語で、Assert文を書く方法を紹介します。

### Javaでアサーションを実装
例えば、javaで返り値が0より小さいかをチェックするアサーションを行うとします。その記述例は以下のようになります。
```
int getValue() {
  int value = -1;
  return value;
}

void doTest() {
  int result = getValue();
  assert result >= 0 : "値は0以上である必要がある";
}
```

ポイントは、assertキーワードを使って条件式を記述し、その後にコロン(:)を付けてエラーメッセージを指定することです。

この例では、getValue()の返り値であるresult変数が0より小さい場合、アサーションが失敗して例外がスローされます。

アサーション失敗時の動作はJVMの起動オプションで設定でき、デフォルトでは例外が発生します。

また、アサーションを使わない方法として、単純にif文でチェックするという手もあります。

### JSでアサーションを実装
同じく返り値が0より小さいかを検証するアサーションの場合、JavaScriptでのコードは以下のように書けます。
```
function getValue() {
  return -1; 
}

function validateResult(result) {
  assert(result >= 0, 'Returned value must be >= 0');
}

let result = getValue();
validateResult(result);
```

ポイントは次の2つです:

- 1.assert関数に検証したい条件とエラーメッセージを渡す
- 2.条件が**false**の場合はAssertion failedエラーがthrowされる


このコードでは、getValue()の返り値が0未満の場合アサーションに引っかかり、エラーが発生します。

アサーション失敗時の動作をカスタマイズするには、**assert.throws()**などのバリエーションを使えます。

以上のようにして、JavaScriptでもアサーションによる検証が可能です。

### Pythonでアサーションを実装
pythonで返り値が0より小さいかを検証するアサーションのコードは次のように書けます。
```
def get_value():
    return -1

def validate_result(result):
    assert result >= 0, "Returned value must be >= 0"

result = get_value()
validate_result(result)
```

pythonのアサーションもassert文を使います。

- 1.assertの第一引数に検証したい条件式
- 2.第二引数にエラーメッセージの文字列
を指定します。

条件が**False**の場合、AssertionErrorが送出されます。

このコードでは**get_value()**の返り値が0未満ならば、アサーションエラーが発生するようになっています。

pythonのアサーションもテストコードやバリデーションチェックに良く利用される特徴があります。


## ApidogでAPIテストにアサーションを導入
APIテストの際に、APIの正常性などを検証するために、アサーションを導入する必要があります。APIのリクエストを取得して取得するレスポンスのデータを対象にアサーションを行うと、API動作の正確さを保証することで、APIの信頼性と安定性を向上させることにも繋がっています。


それでは、APIテスト中に、レスポンスデータをアサートするには、どうしたらいいですか？ここで[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)というAPI管理ツールを皆さんに紹介します。このツールのAPIテスト機能を使う場合、「後処理」で簡単にアサーションを行うことができます。

**ステップ⒈** Apidogを開き、APIのリクエストを送信する前に、「後処理」タブに切り替えて、「後処理を追加」から「**アサーション**」を追加します。

![assertion-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/99068957-e941-b67a-1b50-baf8b8c4e0e7.png)

**ステップ⒉** ここでJSONPath式を利用して、アサートの対象をレスポンスデータを抽出します。そして、「アサーション」でアサート条件を設定します。

![assertion-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/9b89d3e6-fb39-efb4-a126-c6a710b4f4ba.png)

**ご案内**：上記画像のように、ペット情報を検索するためのAPIを利用しています。このAPIのレスポンスデータ構造に従って、「$.data.category.id」というJSONPath式でレスポンスのデータからペットのIDを取得できます。アサート条件を「10より大きい」と設定します。

**ステップ⒊** 「**送信**」ボタンをクリックして、レスポンスを取得します。ここでアサーションの結果はレスポンスの右側に表示されます。

![assertion-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/5ad98c63-e3dc-1b41-fe03-32070abc2d67.png)

上記のステップのように、Apidogを使うことで、非常に簡単な手順でAPIレスポンスのアサーションを行うことができます。

### データベースに連携してリアルデータでアサートする
また、Apidogは[データベースに連携](http://apidog.com/jp/blog/api-database-integration/)して、そこから直接にリアルなデータを取得して変数に設定することができます。このような場合、アサート条件で変数を適用すれば、データベース中のリアルデータを使用してレスポンスデータの正確さを検証することもできますので、非常に便利です。

![apidog-db-operation-4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/59b09f57-ecb2-44e4-46d3-972cc3b34d92.jpeg)

## 終わりに
プログラミングにおけるアサーションは、コード内の重要なところで意図した条件が満たされているかを検証するものです。アサーションによってプログラム内の異常値を早期検知し、信頼性の高いロジックを構築することが可能となります。テスト駆動開発(TDD)ではアサーションが欠かせない要素でもあります。

また、アプリ開発中にAPIを導入している場合、APIテストの際に[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)というツールを使えば、レスポンスデータを対象にアサーションを簡単に適用できます。

**最後まで読んでくださり、ありがとうございました！
この記事を読んで少しでも理解を深めていただければ幸いです！**