тестирование мото для ecs

#python-3.x #boto3 #moto

Вопрос:

У меня есть метод python, который перечисляет определенные сервисы ECS Fargate на основе некоторых тегов и некоторых имен, используя boto3 get_paginator.

 def list_service_name(environment,
                      resource_owner_name,
                      ecs_client):
    list_of_service = list()
    cluster_name = "my cluster name "   environment
    target_string = "-somedummy"
    resource_owner_tag = resource_owner_name
    service_paginator = ecs_client.get_paginator('list_services')
    for page in service_paginator.paginate(cluster=cluster_name,
                                           launchType='FARGATE'):
       
        for service in page['serviceArns']:

           
            response = ecs_client.list_tags_for_resource(resourceArn=service)
           
            for tags in response['tags']:
                if tags['key'] == 'ResourceOwner' and 
                        tags['value'] == resource_owner_tag and 
                        service.endswith(target_string):
                    list_of_service.append(service)

    return list_of_service
 

Теперь я хотел бы проверить это с помощью moto.
Поэтому я создал conftest.py , где я определил все фиктивные подключения moto к таким сервисам, как ecs. Кроме того, я создал test_main.py файл, как показано ниже, в котором я создал фиктивные службы, подключенные к ECS Fargate. Но по какой-то причине, если я попытаюсь подтвердить результат основного метода в тестовом файле, списки служб вернутся empty . В то время как я хотел бы видеть test-service-for-successful в качестве результата. Есть ли что-то, чего мне не хватает, или разбиение на страницы все еще недоступно в moto?

 from my_code.main import *


@pytest.fixture
def env_name():
    return "local"


@pytest.fixture
def cluster_name(env_name):
    return "my dummy"   env_name   "cluster_name"


@pytest.fixture
def successful_service_name():
    return "test-service-for-successful"


@pytest.fixture
def un_successful_service_name():
    return "test-service-for-un-successful"


@pytest.fixture
def resource_owner():
    return "dummy_tag"


@pytest.fixture
def test_create_service(ecs_client,
                        cluster_name,
                        successful_service_name,
                        un_successful_service_name,
                        resource_owner):
    _ = ecs_client.create_cluster(clusterName=cluster_name)
    _ = ecs_client.register_task_definition(
        family="test_ecs_task",
        containerDefinitions=[
            {
                "name": "hello_world",
                "image": "docker/hello-world:latest",
                "cpu": 1024,
                "memory": 400,
                "essential": True,
                "environment": [
                    {"name": "environment", "value": "local"}
                ],
                "logConfiguration": {"logDriver": "json-file"},
            }
        ],
    )
    ecs_client.create_service(
        cluster=cluster_name,
        serviceName=successful_service_name,
        taskDefinition="test_ecs_task",
        desiredCount=0,
        launchType="FARGATE",
        tags=[{"key": "resource_owner", "value": resource_owner}]
    )

    ecs_client.create_service(
        cluster=cluster_name,
        serviceName=un_successful_service_name,
        taskDefinition="test_ecs_task",
        desiredCount=0,
        launchType="FARGATE",
        tags=[{"key": "resource_owner", "value": resource_owner}]
    )
    yield


def test_list_service_name(env_name,
                           resource_owner,
                           ecs_client):

    objects = list_service_name(env_name,
                                resource_owner,
                                ecs_client)
    # here object is []
    # Where as I should see successful_service_name
 

Комментарии:

1. Имя кластера, используемое в «list_service_name», неверно (my_cluster_name_local против my_dummy_local_cluster_name). Тег-ключ также неверен (resource_owner против ResourceOwner). Наконец, «target_string» должен иметь значение «_successful» (если вам не нужна служба _unsuccessful)

2. @BertBlommers Я думаю, что вы правы, указали мне на ошибку, позвольте мне исправить ее и протестировать еще раз. возвращайся к этому поскорее.

3. это сработало как заклинание.