Зачем нам нужен модульный тест в тесте PACT?
Недавно я ознакомился с тестированием PACT. Действительно классная идея, чтобы заглушить производителя / потребителя для каждой встречной стороны. Однако я не понимаю одного основного принципа. На клиентском тесте PACT, который генерирует JACT-файл PACT - зачем мне крутить тестовый сервер и проверять его конкретными запросами?
Например, у меня есть продюсер по имени A, а у меня потребитель B. У производителя A есть конечная точка getAllUsers, которая будет возвращать json всех пользователей. Для потребителя Б я написал тест пакта:
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "ProducerA", port = "1234")
public class ProducerAPactTest {
private static JSONArray body = new JSONArray("[ {'user_id': '1' }]");
@Pact(provider = "ProducerA", consumer = "ConsumerB")
RequestResponsePact createPact(PactDslWithProvider builder) {
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", ContentType.APPLICATION_JSON.toString());
DslPart regionDsl = PactDslJsonArray.arrayEachLike()
.stringType("id", "1").closeObject().closeArray();
return builder.given("Normal state")
.uponReceiving("Get all users request")
.path("/users").method("GET").willRespondWith()
.status(200).headers(headers).body(regionDsl).toPact();
}
@Test
void runTest() {
// when
ResponseEntity<String> response = new RestTemplate()
.getForEntity(mockServer.getUrl() + "/users", String.class);
// then
assertThat(response.getStatusCode().value()).isEqualTo(200);
List<String> contentTypeHeaders = response.getHeaders().get("Content-Type");
String responseBody = response.getBody();
assertThat(contentTypeHeaders).isNotNull();
assertThat(responseBody).isNotNull();
assertThat(contentTypeHeaders.get(0)).isEqualTo(ContentType.APPLICATION_JSON.toString());
JSONAssert.assertEquals(responseBody, body, JSONCompareMode.LENIENT);
}
Я использовал несколько учебных пособий, чтобы написать тест пакта. Я занимаюсь разработкой под Java, но мой вопрос в целом относится ко всем тестам Pact. Зачем мне создавать модульный тест? Мне кажется совершенно бессмысленным утверждать, что я получаю, поскольку я сам определил это несколькими строчками выше? Я заметил, что все потребительские тесты пакта следуют той же схеме. Что мне не хватает?
1 ответ
Как правило, тестируемый класс делает больше, чем просто десериализацию тела JSON. Извините, что это пример Ruby, а не Java, но вот пример клиентского класса, который превращает документ JSON в модель, представляющую ресурс: https://github.com/pact-foundation/pact-ruby/blob/master/example/zoo-app/lib/zoo_app/animal_service_client.rb
Мы используем здесь pact-тест, чтобы проверить, как он ведет себя с различными http-ответами (например, он конвертирует 404 в ноль). Если вы просто тестируете свой HTTP-ответ напрямую, тогда вы не получите никакой пользы для своего потребительского кода, если не будете заключать контракт с поставщиком.