Зачем нам нужен модульный тест в тесте PACT? - PullRequest
0 голосов
/ 28 февраля 2019

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

Например, у меня есть Producer с именем A и у меня есть потребитель B .Производитель A имеет конечную точку getAllUsers , которая будет возвращать json всех пользователей.Для потребителя B я написал тест pact:

@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);
    }

Я использовал несколько учебных пособий для написания теста pact.Я занимаюсь разработкой под Java, но мой вопрос в целом относится ко всем тестам Pact.Зачем мне создавать модульный тест?Мне кажется совершенно бессмысленным утверждать, что я получаю, поскольку я сам определил это несколькими строчками выше?Я заметил, что все потребительские тесты пакта следуют той же схеме.Чего мне не хватает?

1 Ответ

0 голосов
/ 01 марта 2019

Как правило, тестируемый класс будет делать больше, чем просто десериализовать тело JSON.Извините, что это пример Ruby, а не java, но вот пример клиентского класса, который превращает документ JSON в модель, представляющую ресурс: https://github.com/pact-foundation/pact-ruby/blob/master/example/zoo-app/lib/zoo_app/animal_service_client.rb

Мы используем пактtest здесь, чтобы проверить, как он ведет себя с различными http-ответами (например, он конвертирует 404 в ноль).Если вы просто тестируете свой HTTP-ответ напрямую, то для вашего потребительского кода вы ничего не получите, кроме заключения договора с провайдером.

...