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 ===============================================================================================================================================================
きちんと例外が投げられていそうです。