【问题标题】:Why do we need unit test in a PACT test?为什么我们需要在 PACT 测试中进行单元测试?
【发布时间】:2019-03-01 14:10:08
【问题描述】:

最近,我熟悉了 PACT 测试。为每个交易对手剔除生产者/消费者的想法真的很酷。但是,我不明白一个核心原则。在客户端 PACT 测试中,生成 PACT json 文件的那个 - 为什么我需要启动一个测试服务器并使用特定的请求来访问它?

例如我有一个叫 A 的生产者,我有一个叫 B 的消费者。生产者 A 有端点 getAllUsers,它将返回所有用户的 json。 在消费者 B 中,我写了契约测试:

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

我用several tutorials写了契约测试。我正在 Java 下开发,但我的问题一般适用于所有 Pact 测试。为什么我需要创建单元测试?对我来说断言我收到的东西似乎完全没有意义,因为我已经在上面几行定义了自己?我注意到所有的契约消费者测试都遵循相同的模式。我错过了什么?

【问题讨论】:

  • 有什么东西你不能通过协议测试检查,但可以通过单元测试?

标签: 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 test 来检查它在不同http 响应下的行为(例如,它将404 转换为null)。如果您只是直接测试您的 HTTP 响应,那么除了与提供者建立合同之外,您的消费者代码根本不会获得太多价值。

【讨论】:

  • 这正是我所需要的——只需生成协议测试。那可能吗?目前,如果我删除单元测试,它会失败,并显示错误消息说端点没有被命中。
  • 生成契约测试违背了使用契约测试的目的。请阅读此内容(如果您不熟悉 Pact,请阅读 FAQ 和文档页面的其余部分 - 它应该可以回答您的大部分问题):docs.pact.io/faq#why-are-the-pacts-generated-and-not-static
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多