【AWS】Cloud9上でUnitテスト

1. 使用するサービス

(AWS)

  • Cloud9

2. 使用する言語

3.概要

Cloud9上でPythonのモジュール、unittestを用いたUnitテストに関して記載します。主にテストの対象はLambdaでテストの内容は基本的に与えられたテストデータとそれに対して期待通りのリターンをするかのブラックボックステストになります。

4. 実装

4-1. フォルダ構成

下記のようにhello Lambdaとそれをテストするtest_hello.py、及びテストデータとなるhello.csvを用意します。

demo----hello
| |
| |--index.py
|
|--tests
|
|--Data
| |
| |--hello.csv
|
|--Unit
|
|-test_hello.py

4-2. テスト対象のLambda

下記のようにコードを用意しておきます。

import json

def handler(event, context):
    
    data = {
         "data": "Hello World"
     }
     print("hello world")

     return {
          "statusCode": 200,
          "body": json.dump(data),
          "headers": {"Content-type": "application/json"}
     }

4-3. テストスクリプト

か機能ようにtest_hello.pyのコードを用意しておきます。テストスクリプトのファイル名の最初には必ずtestをつけてください。

import unittest
import json
import csv
import logging
import os
from hello import index

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def readTestData(csvFile):
    
    test_list = []

    with open(csvFile, encoding="UTF-8") as f:
        for line in csv.DictReader(f):
            del line["備考"]
            test_list.append(line)

    return test_line

class TestHandlerClass(unittest.TestCase):

    def test_response(self):
        logger.info("Hello Lambda Test")
        test_file_path = "../Data/hello.csv"
        test_file_path = os.path.join(os.path.dirname(__file__), test_file_path)
        test_list = readTestData(test_file_path)
        logger.info(test_list)
        for test in test_list:
            result = index.handler(None, None)
            self.assertEqual(result['statusCode'], 200)
            self.assertEqual(json.loads(result['body']), test)
            self.assertEqual(result['headers'], {"Content-type": "application/json"})

if __name__ == '__mian__':
    unittest.main()

4-4. テストデータ

下記のようにテストデータとその説明を備考として書いてあります。プログラム内でJSONに変換し、備考の部分は削除します。あくまでレビュー時に見やすくする為に存在します。

"data","備考"
"Hello World", "正常値テスト"

5. 実行

demoフォルダの上のフォルダから実行します。

5-1. 環境変数の更新

下記コマンドでPythonの実行環境を変更します。

export PYTHONPATH=/home/ec2-user/environment/demo

5-2. 下記コマンドでテストを指定して実行します。

python -m unittest demo.tests.Unit.test_hello

5-3 下記コマンドでフォルダ内のtestと名のつくファイルを実行します。

python -m unittest discover demo.tests.Unit


6. おわりに

これで、テストデータを増やすことでテストを自動的に複数実行されるようになります。テストデータもcsvで比較的見やすく、lambdaのコードと一緒にレビューすることで漏れも少なくなるかと思います。また、レビューしてもらう前にはしっかりと事前に実行してテストが完了してから改めてレビューしてもらいましょう。