データ活用基盤を作ってみた その５(試験)

# はじめに
こんにちは、NTTデータ先端技術の@S-takahashi1129です。
本記事は、データ活用基盤を作ってみた連載記事のその5です。
本シリーズの取り組みの内容については [その1(構成シナリオ)](https://qiita.com/kamein/items/81df29ef9d32bf0a0810)をご覧ください
前の記事は、[その4(詳細設計)](https://qiita.com/shiraki_ils/items/fc69614df206bf24fd52)からご覧ください。
本記事では、試験計画と試験実施について記載します。

# 目次
* 試験計画
    * 試験計画の考え方
    * 試験計画で実施したこと
        * 試験工程定義
        * 単体試験計画
        * 結合試験計画
        * システムテスト計画
* 試験の実施
    * 単体試験
        * 単体試験項目書作成
        * 単体試験実施
    * 結合試験
        * 結合試験項目書作成
        * 結合試験実施
    * システムテスト
        * システムテストの実施
* 反省点
    * 試験実施について



# 1. 試験計画

## 1-1.試験計画の考え方
試験計画とは、試験の目的や戦略、試験を実施するうえで必要なタスクやそれらを実行する留意点をまとめることや、スケジュールを計画することです。
試験計画では関係者間の認識齟齬や各試験レベルの目的が不明確、十分な試験実行ができているかの判断ができないという問題を避けるために試験計画をドキュメント化した試験計画書を作成します。

## 1-2.試験計画で実施したこと
今回は、試験工程の全体計画を示し、以下を明確にすることを目的として試験計画書を作成しました。
  * 各試験工程の領域を明確にすること
  * 各試験の実施概要を定めること
  * 試験計画書を作成することで、メンバーの認識を合わせること
 
今回は、小規模な開発かつ少人数でメンバー全員が、試験実施内容を大方認識していたので、簡易的なものを作成しましたが、大規模な開発になればなるほど詳細な試験計画書が必要だと考えています。  
試験計画書の目次と概要は下記にとしました。
1. 試験工程定義
    * 各試験工程で何を行うか、概要レベルで記載
2. 試験工程詳細
    * 各試験工程で実施する試験の説明を記載。
    * 単体試験
    * 結合試験
    * システムテスト


### 1-2-1. 試験工程定義
こちらでは、各試験工程で実際にどのような試験を実施するか概要を明記しています。
|  #  |  試験工程  |  試験概要  |
| --- | ----        | ----       |
|  1  |  単体試験  |  IaCがAWSに反映されているか確認（プログラムの機能検証）  |
|  2  |  結合試験      |  AWSサービスの結合部分の検証  |
|  3  |  システムテスト  |  システム全体を通した検証（シナリオテスト）  |


### 1-2-2. 単体試験計画
AWSのリソースをIaC（Terraform）で作成しました。Terraformの設定値が正しく反映されているか目視で確認することを単体試験と位置づけました。
今回はパラメーターシートは作成しなかったため、Terraformのコードをもとにパラメータ確認することを考えました。また、作りこみのプログラムの機能検証することを含めて単体試験を計画しました。
* 概要
    * 詳細設計で作成したIaC（Terraform）の設定値がAWSの各サービスに反映されているか目視で確認する
    * IaCによるコードベースの環境構築を行ったことと作業時間を削減するために、作成したサービスのパラメータを全てチェックするのではなく、Terraformの記述でミスが起こりやすいと予想される、変数指定部分やエスケープ部分を検証する
    * Lambda関数等のプログラムの機能検証

* 領域
    * 各AWSサービス単位とする
    * 複数サービスにまたがる確認については、結合試験・システムテストで検証する

* 実施方法
    * テストユーザーを用いて実施する
    * IaCの設定値と対象AWSサービスの設定値に問題がないか目視で確認する
    * AWS環境上でLambda関数等の実行

### 1-2-3. 結合試験計画
基本設計を基に試験項目を洗い出しました。
AWSのサービスがサービス間を含めて基本設計通りに動くかどうかを確認し、プログラムの機能検証では、分岐条件網羅の観点で確認を計画しました。
* 概要
    * 基本設計の内容について検証する
    * 各領域間でのサービスの連携について検証を実施する
        * 例）Lambda to S3のデータ連携, Glue to S3のデータ連携 ...etc

* 領域
    * 領域に分けて結合試験の実施する
    　*例)　
        * IAM領域
            * IAMで設定した値が正常かどうか検証する
                * 各ユーザーで設定値の挙動確認を実施
        * データ収集・加工領域
            * Lambda,Glue,StepFunction,S3,Cloud Watch Logs,SNS ...etc

* 実施方法
    * IAM領域以外試験ユーザーを用いて実施する
    * IAM領域に関しては、各ロールに切り替えて検証する
    * 各領域で動作確認をする
        * 例）
            * IAM：各アクターロールでAWSサービスが意図した動作が実施できること

            * 加工：データ収集から加工、蓄積まで実施し、期待値がS3に格納されること
            
### 1-2-4. システムテスト計画
要件定義を基に試験項目を洗い出しました。
* 概要
    * 要件定義の内容について検証する
    * 業務フローに沿って試験を実施する
* 領域
    * 既存システムとデータ活用基盤を合わせた全体
* 実施方法
    * 業務フローごとに試験を実施する

# 2. 試験の実施
ここからは試験計画に沿って実際に行った試験の内容について紹介します。

## 2-1.単体試験
### 2-1-1. 単体試験項目書作成
試験項目は試験計画書に沿って作成しました。
試験項目書の作成は、
- リソースの種類
- 名称
- 確認項目
- 期待値
- 結果

以上の項目を主軸として記述し、Terraformファイルごとに試験項目書を分けて作成しました。

##### 試験項目書例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/47328672-1215-f214-f878-0bf1cc416763.png)




### 2-1-2. 単体試験実施
単体試験項目書に沿って単体試験を実施しました。今回実施した単体試験の一部であるGlueのTerraformによる変数指定部分が正しく反映されているかの確認方法と、エスケープ文字がポリシーエディタで反映されているかの確認方法を紹介します。
##### Terraformによる変数指定　
```terraform:変数指定
#Glue Crawler
resource "aws_glue_crawler" "biwa-glue-crawler-001" {
  
  s3_target {
    path = "s3://${aws_s3_bucket.csv-file-bucket.bucket}"
    #期待値:path="s3://csv-file-bucket"
  }
}      
```
Glueのデータソースのターゲットを確認し、期待値通り適切に反映されているかを確認しました。
![Glue S3 path.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/ab06bdb3-b805-7aa9-4f47-ef460175f1d2.png)



##### エスケープ文字の反映確認
```terraform:エスケープ部分

  policy = jsonencode({

        "Resource" : [
          "arn:aws:iam::*:mfa/*",
          "arn:aws:iam::*:user/$${aws:username}"
          #期待値:"arn:aws:iam::*:user/${aws:username}"
        ]
})
```

ポリシーエディタをJsonで確認し、Terraformのエスケープ部分が期待値通り適切に反映されているかを確認しました。
![ポリシーエディタ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/edb2ec28-2a35-f7ac-7be3-2008e32a4d17.png)


## 2-2. 結合試験
### 2-2-1.結合試験項目書作成
結合試験項目書の作成は単体試験同様に基本設計をベースに、
- リソースの種類
- 名称
- 確認項目
- 期待値
- 結果
以上の項目を主軸として記述しました。

##### データ加工領域の試験項目書例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/446f774e-ea31-8486-6a8c-e07033a3d082.png)

### 2-2-2.結合試験の実施
例として、スイッチロール実行がMFAの有効化が必須になっているかの確認方法と、Stepfunctionsで設定したLambda Functionが想定通りの動作するかの確認方法を紹介します。

##### スイッチロールのMFA必須化
MFAを設定していないアカウントでのロール切り替えを実施し、ロールの切り替えが不可能なことを確認しました。
![switchrole-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/17c30766-634c-8e0a-492c-0cf898d63b02.png)

MFAが設定されているアカウントでも同様の操作をし、MFA設定済みの場合ロールの切り替えが成功することを確認しました。

![analyst3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/7e462b23-9f69-38e2-821e-6e1c426b63f5.png)


##### StepfunctionsでのLambda Functionの実行
本PJではStepfunctionsによって、データの取得からAthenaでの分析が可能な状態にデータを加工する処理を行っています。

![AWS stepfunctions - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/1c9d109f-b6b0-6959-1655-83b8675fbedd.png)

結合試験の中ではStepfunctionsの各処理についてのテストも実施しました。
Lambda　Functionによって加工前データをダウンロードしてS3バケットに格納する際の動作テストでは、

StepFunctionsを実行しLambda Functionの処理に該当する部分（RunExtractionJob）が成功したことを確認しました。
![sf2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/dfd3aaae-f7d9-63ce-6861-70f8b0a7c0b4.png)


この処理によってLambda Functionによって指定したファイル(今回はken_all.zip)がダウンロードされ、指定のS3へ格納されていることを確認しました。
![sf3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/78642587-1595-2d96-8e5d-4dc6bca3f78d.png)


## 2-3. システムテストの実施
### 2-3-1.システムテスト
試験計画で定めたように、要件定義の業務フローを基に業務ごとのユースケースを洗い出しシステム試験として実施しました。

##### 試験項目書例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/6a44e8f3-7540-8e5c-8ef1-9659ce0c3782.png)

# 3.反省点

## 試験実施について
試験項目書に沿った試験実施方法が、試験を進めながらメンバー内で徐々に固まっていったため、試験実施時の証跡の取り方などが単体試験~システムテストで異なってしまいました。
次回以降、試験実施の際は事前に試験実施要領を作成することで証跡の取り方などをメンバーで合わせられるように工夫したいです。



# 最後に
今回は、試験の進め方について紹介しました。
Qiitaの執筆経験が無く文章等拙い部分があったかと思います。
ご意見・ご感想などございましたらぜひコメントいただきたいです！
次章は、[その6(構築・デプロイ方法)](https://qiita.com/shiraki_ils/items/863465b40c0bf85f9a03)です。
ここまでお読みいただきありがとうございました。