0

我有一个 click cli 应用程序,我正在尝试模拟 AWS SSM Parameter Store,但 runner.invoke 没有返回预期结果。

这是test_demo.py

from click.testing import CliRunner

import os
import boto3
from moto import mock_ssm
import pytest


@pytest.fixture(scope='package')
def aws_credentials():
    """Mocked AWS Credentials for moto."""
    os.environ['AWS_ACCESS_KEY_ID'] = 'testing'
    os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing'
    os.environ['AWS_SECURITY_TOKEN'] = 'testing'
    os.environ['AWS_SESSION_TOKEN'] = 'testing'
    os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'


@pytest.fixture(scope='package')
def ssm(aws_credentials):
    with mock_ssm():
        yield boto3.client('ssm')


def test_get_mock_ssm(ssm):
    # We need to create the ssm entry first since this is all in Moto's 'virtual' AWS account
    ssm.put_parameter(
        Name='test',
        Description='name',
        Value='text',
        Type='String',
        Overwrite=True,
        Tier='Standard',
        DataType='text'
    )
    out = ssm.get_parameter(Name='test')
    print('without cli')
    print(out)
    from src.cli import entrypoint
    runner = CliRunner()
    response = runner.invoke(entrypoint, ["get", "--name", "test"])
    print('with cli')
    print(response)
    assert response.exit_code == 0

测试结果如下:

without cli
{'Parameter': {'Name': 'test', 'Type': 'String', 'Value': 'text', 'Version': 1, 'LastModifiedDate': datetime.datetime(2020, 5, 31, 9, 3, 21, 920000, tzinfo=tzlocal()), 'ARN': 'arn:aws:ssm:us-west-2:1234567890:parameter/test'}, 'ResponseMetadata': {'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'amazon.com'}, 'RetryAttempts': 0}}

with cli
<Result okay>
PASSED

我希望 cli 的输出与无 cli 相同。

点击代码:

import click

import manage_secrets


@click.group()
def entrypoint():
    pass


@entrypoint.command()
@click.option('--name', required=True,
              help='Name of parameter to get value from SSM')
def get(name):
    """get secrets"""
    click.echo("getting value of: {0}" .format(name))
    print(manage_secrets.get_value_from_parameter_store(name))


if __name__ == "__main__":
    entrypoint()

manage_secrets 代码:

import boto3

parameter_name = None


def get_value_from_parameter_store(name):
    client = boto3.client('ssm')
    try:
        parameter = client.get_parameter(Name=name, WithDecryption=True)
        return parameter
    except client.exceptions.ParameterNotFound:
        print("parameter not found")

我添加了一个返回值,它只是默认值,而不是解析,我认为 ssm.get_parameter 是一样的。我不确定我错过了什么。任何指示或建议?

4

1 回答 1

0

我的结果是好的,我需要response.output从测试中得到。

这有帮助:https ://gist.github.com/lbillingham/6412cdc19f9a44901b03841e0443fbf7

于 2020-05-31T16:30:24.933 回答