CDK で Validation Test を行う

December 12, 2021

Validation Test (Snapshot Test) とは

Construct の引数にある程度自由度は持たせたいものの、一定の制約を儲けたい場合があります。例えば CloudWatch アラームを作成する際に Period は 1 分もしくは 5 分で指定可能にしたい、といったような場合ですね。そんな時は Validation Test (Snapshot Test) を用います。

実際に使ってみる

今回も例のごとく HitCounter を使います。DynamoDB テーブルの read_capacity をユーザーが決定できるように、HitCounter の引数として用意し、また DynamoDB テーブルのリソース側にも read_capacity を指定します。
さらに、read_capacity の値が 5 から 20 の範囲外であった時は例外を投げるようにします。

cdk_workshop/hitcounter.py
from constructs import Construct
from aws_cdk import (
  aws_lambda as _lambda,
  aws_dynamodb as ddb,
)

class HitCounter(Construct):

  @property
  def handler(self):
    return self._handler

  def __init__(self, scope: Construct, id: str, downstream: _lambda.IFunction, read_capacity: int = 5, **kwargs):
    if read_capacity < 5 or read_capacity > 20:
      raise ValueError("read_capacity must be greater than 5 or less than 20")
    
    super().__init__(scope, id, **kwargs)

    table = ddb.Table(
      self, 'Hits',
      partition_key={'name': 'path', 'type': ddb.AttributeType.STRING},
      encryption=ddb.TableEncryption.AWS_MANAGED,
      read_capacity=read_capacity,
    )

それでは、想定されない値が入力された際に正しく例外がスローされるか確認するテストコードを書きましょう。

tests/unit/test_cdk_workshop_stack.py
def test_dynamodb_raises():
  stack = Stack()
  with pytest.raises(Exception):
    HitCounter(stack, "HitCounter",
      downstream=_lambda.Function(stack, "TestFunction",
        runtime=_lambda.runtime.Python_3_9,
        handler="hello.handler",
        code=_lambda.Code.from_asset("lambda"),
      ),
      read_capacity=1,
    )

pytest によりテストします。

$ pytest
============================================================================================================================================================= test session starts ==============================================================================================================================================================
platform darwin -- Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /Users/yuk/Development/cdk/cdk_workshop
collected 4 items                                                                                                                                                                                                                                                                                                                              

tests/unit/test_cdk_workshop_stack.py ....                                                                                                                                                                                                                                                                                               [100%]

============================================================================================================================================================== 4 passed in 3.60s ===============================================================================================================================================================

きちんと例外が投げられていそうです。


 © 2023, Dealing with Ambiguity