Контракты и функции в Spring Cloud Contract

Я понимаю, что тесты контрактов используются для тестирования контрактов между приложениями, а не для проверки бизнес-функций. Напишите один контракт на положительный сценарий, другой на отрицательный.

Но представьте себе следующие примеры:

// contract (#1)

org.springframework.cloud.contract.spec.Contract.make {
  request {
    method 'GET'
    url 'client/1'
  }
  response {
    status 200
    body([
        id: 1
        name: "Barbara"
        address: "Park Avenue 1"
    ])
  }
}


// contract (#2)

org.springframework.cloud.contract.spec.Contract.make {
  request {
    method 'GET'
    url 'client/9999'
  }
  response {
    status 404
    body([])
  }
}


// contract (#3)

org.springframework.cloud.contract.spec.Contract.make {
  request {
    method 'GET'
    url 'client/!^&(^%@'
  }
  response {
    status 400
    body([])
  }
}

Мой положительный случай - когда клиент найден (№1). Могу ли я передавать переменные в URL-адресе, возможно ли это в SCC? Могу ли я использовать здесь регулярные выражения для проверки ввода?

Я как бы почувствовал необходимость в двух отрицательных случаях: - пользователь не существует (# 2), - запрос недействителен (# 3)

Это разумно, или я упускаю из виду суть контрактов, ориентированных на потребителя? Вы бы написали что-нибудь на этих контрактах?

У меня также возникают проблемы с рассуждением о продюсере. Если вышеизложенное было как-то разумно, то на стороне производителя у меня будут (автоматически сгенерированные) тесты для контрактов, но как я могу различить существующего и несуществующего клиента? Я знаю, что не имеет смысла заботиться о реальных данных в контракте ... но как проверить контракт (№2), когда пользователя не существует?


person Jorge Viana    schedule 28.04.2017    source источник


Ответы (1)


Это очень хорошие вопросы !! Я постараюсь ответить на них по очереди.

1 да, вы можете передавать переменные и регулярные выражения. Если у вас есть регулярное выражение и контакт с конкретным значением, вы должны использовать приоритеты для определения порядка.

2 Я думаю, что № 3 я бы не стал вкладывать это в контракт, но обработал бы его вручную с помощью WireMock или какой-либо другой заглушки HTTP-сервера. Я бы смоделировал разные исключения и убедился, что смогу с ними справиться. Говоря о технических исключениях. Если приложение-производитель может отправить ошибку по бизнес-причинам, я думаю, что напишу для него контакт. И я думаю, что в этом случае №2 является таким исключением, потому что URL-адрес существует, но нет клиента.

Что касается производителя ... Выберите имя для клиента. Например, несуществующий, и для этого один возврат 404. Установите приоритет на 1. И создайте еще один с регулярным выражением и установите приоритет на 5 или sth.

person Marcin Grzejszczak    schedule 28.04.2017
comment
Я понимаю, что технические исключения выходят из контракта. Я надеялся сообщить все коды возврата, которые вернет мое приложение. Есть много определенных кодов возврата http, но мое приложение вернет только несколько, я подумал, что это хорошее место для обеспечения соблюдения контракта. Что касается несуществующего пользователя, который вернет 404, я все еще немного растерялся. Автоматически сгенерированные тесты будут утверждать некоторые предположения, но вызываемый код будет «производственным кодом», поэтому мне понадобится какая-то поддельная реализация, чтобы вернуть стандартный ответ? - person Jorge Viana; 29.04.2017
comment
Вы отключите любые реальные вызовы любых служб github.com/spring-cloud-samples/spring-cloud-contract-samples/ - person Marcin Grzejszczak; 29.04.2017