Испорченные тесты провайдера Pact: pactVerificationTestTemplate »PreconditionViolation - PullRequest
0 голосов
/ 17 сентября 2018

Я новичок в тестировании CDC и делаю только первые шаги.Я развернул Pact-Broker (docker-compose), работающий на localhost: 80.Потребитель успешно отправляет сгенерированные договоры брокеру, но кажется, что поставщик не может получить действующий контракт (но это только предположение).

Я использую spring-boot, maven, jUnit5,Тесты приложений выполняются в Ubuntu. Использование PactFolder с сгенерированным потребителем пакт-контрактом в локальном каталоге приводит к успешным тестам.

Когда я переключаюсь на аннотацию @PactBroker, провайдер может подключиться к брокеру ион получает следующий ответ (я получил его из журналов отладки):

{"_links":
    {"self":{
        "href":"http://localhost/pacts/provider/provider-    name/latest","title":"Latest pact versions for the provider provider-name"},
    "pb:provider":{"href":"http://localhost/pacticipants/provider-name",
        "name":"provider-name"},
    "pb:pacts":[
        {"href":"http://localhost/pacts/provider/provider-name/consumer/consumer-name/version/1.0.0",
        "title":"Pact between consumer-name (v1.0.0) and provider-name",
        "name":"consumer-name"} 
     ],
    "provider":{
        "href":"http://localhost/pacticipants/provider-name",
        "title":"provider-name",
        "name":"DEPRECATED - please use the pb:provider relation"
     },
    "pacts":[
            {"href":"http://localhost/pacts/provider/provider-name/consumer/consumer-name/version/1.0.0",
            "title":"DEPRECATED - please use the pb:pacts relation. Pact between consumer-name (v1.0.0) and provider-name",
            "name":"consumer-name"
            }
        ]
    }
}

И результаты теста показывают следующее:

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 9.758 s 
FAILURE! - in com.tis.payment.mapper.PaymentMapperApplicationTests
[ERROR] pactVerificationTestTemplate{PactVerificationContext}  
Time elapsed: 9.752 s  
ERROR!
org.junit.platform.commons.util.PreconditionViolationException: 
No supporting TestTemplateInvocationContextProvider provided an invocation context
[INFO] 
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   PaymentMapperApplicationTests.pactVerificationTestTemplate » PreconditionViolation
[INFO] 
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

Поскольку использование локального файла пакта делает тесты зеленымиЯ полагаю, что причина не в коде моего тестового класса, хотя, если это может быть полезно, я предоставлю это здесь:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
        properties = "server.port=8082")
@Provider("provider-name")
@PactBroker(host = "localhost", port = "80", tags="latest")
//@PactFolder("target/pacts") # uncomment to use local pact files
public class ApplicationTests {

    @MockBean
    private ProviderServiceClient providerServiceClient;

    @BeforeEach
    void setupTestTarget(PactVerificationContext context) {
        context.setTarget(new HttpTestTarget("localhost", 8082, "/"));
    }

    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider.class)
    void pactVerificationTestTemplate(PactVerificationContext context) {
        context.verifyInteraction();
    }

    @State({"valid payment file"})
    public void toValid() {
        ServiceResponse response = new ServiceResponse();
        response.setBatchId("test");
        response.setId(1L);
        when(providerServiceClient.save(any())).thenReturn(response);
    }

    @State({"invalid payment file"})
    public void toInvalid() {
    }
}

Поскольку использование локальных файлов пакта не являетсявариант, мне действительно интересно, как исправить ошибку, и буду благодарен за любые полезные комментарии .

зависимости maven pact:

<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-model</artifactId>
    <version>3.5.22</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-provider-junit5_2.12</artifactId>
    <version>3.5.22</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-consumer-junit5_2.12</artifactId>
    <version>3.5.22</version>
    <scope>test</scope>
</dependency>

Плагин для maven для публикациипакты потребителя:

<plugin>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-provider-maven_2.12</artifactId>
    <version>3.5.22</version>
    <configuration>
        <pactBrokerUrl>http://localhost:80</pactBrokerUrl>
        <trimSnapshot>true</trimSnapshot>
        <!-- Defaults to false -->
    </configuration>
</plugin>

docker-compose.yml провайдера пакта:

version: '2'
    services:
        postgres:
          image: postgres
          restart: always
          # healthcheck:
            # test: psql postgres --command "select 1" -U postgres
          ports:
            - "5432:5432"
          environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: password
            POSTGRES_DB: postgres
        broker_app:
          image: dius/pact-broker
          depends_on: 
            - postgres
          ports:
            - "80:80"
          links:
            - postgres
          environment:
            PACT_BROKER_DATABASE_USERNAME: postgres
            PACT_BROKER_DATABASE_PASSWORD: password
            PACT_BROKER_DATABASE_HOST: postgres
            PACT_BROKER_DATABASE_NAME: postgres

1 Ответ

0 голосов
/ 23 сентября 2018

Ошибка JUnit 5 org.junit.platform.commons.util.PreconditionViolationException: No supporting TestTemplateInvocationContextProvider provided an invocation context означает, что тестовый контекст не был предоставлен, поэтому шаблонный тестовый метод не может быть вызван. Вероятно, это связано с отсутствием каких-либо пактов для проверки (каждый пакт приводит к контексту вызова).

Теперь обратимся к актуальной проблеме: почему вы не получаете никаких договоров для проверки от брокера? Pact Broker - это, по сути, хранилище, и среда проверки JUnit 5 будет использовать все аннотации класса pact для создания запроса для отправки в Pact Broker. Этот запрос не возвращает никаких пактов, поэтому где-то должно быть несоответствие.

Единственное, что я могу видеть из предоставленной вами информации, - это URL "http://localhost/pacts/provider/provider- name/latest" в JSON, в котором есть проблема (в имени поставщика есть пробел). Если это не просто проблема форматирования с SO, то это не будет соответствовать (брокер, вероятно, вернет 404 с этим URL).

Если это не проблема, убедитесь, что при запуске проверки из Maven вы можете получить доступ к брокеру так же, как и в тестовой среде. Включение регистрации уровня DEBUG покажет вам все запросы. Используйте что-то вроде curl и попробуйте те же запросы, чтобы увидеть, что вы получите.

...