Как начать с тестирования контракта PACT в Java для новичка - PullRequest
0 голосов
/ 10 октября 2019

Я должен сделать POC при тестировании контракта с использованием pact, но я не смог найти ничего полезного для новичка. Может кто-нибудь помочь мне с рабочим кодом, как установить, выполнить буду благодарен.

1 Ответ

0 голосов
/ 14 октября 2019

Я попытался объяснить ниже.

Потребитель : Контракт, созданный потребителем.

Провайдер : Контракты проверены провайдером.

Пакетный брокер : После создания контрактов в определенном вами месте (например, targer / pacts),Вы должны опубликовать контракты на общей платформе, где будут видеть потребитель и поставщик.

Сторона потребителя - Создать контракт для поставщика

public class CreateContractForProvider {
@Rule //Provider, HostInterface and Port defined with @Rule annotation (Used PactProviderRuleMk2)

public PactProviderRuleMk2 pactProviderRuleMk2 = new PactProviderRuleMk2(
        // Provider Application Name
        "ProviderName",

        //Mock Server
        "localhost",
        8112,

        this);

@Pact(consumer = "ConsumerName") // Consumer Application Name (Our application) - Consumer defined with @Pact annotation(

public RequestResponsePact createPact(PactDslWithProvider builder) {

    Map<String, String> headers = new HashMap();
    headers.put("Content-Type", "application/json"); //Defined headers


    //Defined responses with PactDslJsonBody()
    DslPart expectedResultBodyWhenGetPayments = new PactDslJsonBody()
            .integerType("id",308545)
            .integerType("contractNo",854452)
            .numberType("amount",3312.5)
            .stringType("status","UNPAID")
            .asBody();


    return builder
            .uponReceiving("A request for all payments")
            .path("/payments")
            .method("GET")
            .willRespondWith()
            .status(200)
            .headers(headers)
            .body(expectedResultBodyWhenGetPayments).toPact(); //Response bodyies and headers used in return builder
  //  We can define more than one endpoint with .uponReceiving or .given



 //Then we have to test beacuse contracts are created test stage. 
 //When we say test with  @PactVerification, the server we described above stands up(localhost:8112). İf we get localhost:8112/(definedpathlike/payments) its return expectedResultBodyWhenGetPayments.If the test is successful, the contracts is create.
 @Test
 @PactVerification()
public void pactVerification() {    

    int contractNo=((Integer) new   ContractTestUtil(pactProviderRuleMk2.getPort()).getContractResponse("/payments","contractNo")).intValue();
    assertTrue(contractNo == 854452);
}}

Test Util

public class ContractTestUtil {

int port=8111;

   public ContractTestUtil(int port) {
    this.port=port;
    System.out.println("Custom port "+port);
}

public  Object getContractResponse(String path,String object) {
    try {
        System.setProperty("pact.rootDir", "./target/pacts");
        System.setProperty("pact.rootDir", "./target/pacts");

        String url=String.format("Http://localhost:%d"+path, port);
        System.out.println("using url: "+url);
        HttpResponse httpResponse = Request.Get(url).execute().returnResponse();
        String json = EntityUtils.toString(httpResponse.getEntity());
        System.out.println("json="+json);
        JSONObject jsonObject = new JSONObject(json);
        return jsonObject.get(object);
    }
    catch (Exception e) {
        System.out.println("Unable to get object="+e);
        return null;
    }
}}

ОпределитьPact Broker

PactBrokerUr должен быть определен до публикации в pom.

            <plugin>
            <!-- mvn pact:publish  -->
            <groupId>au.com.dius</groupId>
            <artifactId>pact-jvm-provider-maven_2.11</artifactId>
            <version>3.5.10</version>
            <configuration>
                <pactDirectory>./target/pacts</pactDirectory> <!-- Defaults to ${project.build.directory}/pacts -->
                <pactBrokerUrl>http://yourmachine:8113</pactBrokerUrl>
                <projectVersion>1.1</projectVersion> <!-- Defaults to ${project.version} -->
                <trimSnapshot>true</trimSnapshot> <!-- Defaults to false -->
            </configuration>
        </plugin>

Теперь мы можем публиковать с помощью команды pact: puplish.

Сторона поставщика - Созданы контракты вызовапо потребителю

На этом этапе вы можете протестировать с помощью отказоустойчивого плагина. Из-за своего интеграционного теста.

@RunWith(PactRunner.class) // Say JUnit to run tests with custom Runner
@Provider("ProviderName")
@Consumer("ConsumerName")// Set up name of tested provider// Provider Application Name
@PactBroker(port = "8113", host = "yourmachine")
public class VerifyContractsWhichCreatedForProviderIT {

private static ConfigurableWebApplicationContext configurableWebApplicationContext;

@BeforeClass
public static void start() {
    configurableWebApplicationContext = (ConfigurableWebApplicationContext)
      SpringApplication.run(Application.class);
}

@TestTarget // Annotation denotes Target that will be used for tests
public final Target target = new HttpTarget(8080); //Test Target
}

Наконец, вы можете создавать контрасты и проверять контраст, созданный для вас, с помощью команды clean test pact:publish verify.

...