2

我可以创建一个 PACT 以在不同的主机名上运行吗?我一直在使用协定规则并将主机名保持为 localhost。但现在我正在尝试为无法在 localhost 上运行的应用程序创建一个协议。

@Rule public PactProviderRule provider = new PactProviderRule("ServiceNowClientRestClientProvider", "localhost", 8080, this);

是否可以将 localhost 更改为其他内容,如果可以,是否有我需要的其他配置。我尝试将在 localhost 上工作的测试更改为代码正在使用的实际主机名,但它失败了,我收到各种错误消息“未解析的地址”或“无法分配请求的地址:绑定”或“使用中的地址”

4

3 回答 3

2

Ronald Holshausen 很好地回答了我的问题。完整对话在 Pact Google 论坛帖子上:

主机名被传递到 HTTP 服务器库以启动一个 HTTP 服务器作为模拟服务器。该服务器将与测试运行在同一台机器上(实际上也将是同一个 JVM 进程)。HTTP 服务器库将使用主机名解析为 IP 地址,该地址又将解析为服务器端口将绑定到的机器上的网络接口。

这不像是/否的答案那么简单。可以这样做(您可以在另一台机器上运行独立的模拟服务器),但 PactProviderRule 总是在与运行测试的主机相同的主机上启动模拟服务器。

要实现您的要求,您需要使用其中一个模拟服务器实现,并且需要实现一个新的 JUnit 规则(最好从 PactProviderRule 扩展)。

有许多独立的契约模拟服务器:

https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-server

https://github.com/bethesque/pact-mock_service

https://github.com/pact-foundation/pact-reference/tree/master/rust/pact_mock_server_cli

唯一可以使用的有效值是:运行测试的机器的主机名、运行测试的机器的 IP 地址、localhost、127.0.0.1 或 0.0.0.0

如果在另一台机器上启动了独立的模拟服务器(例如从您的示例主机名:test.service-now.com 和端口:80),那么 PactProviderRule 将需要知道它不应该尝试启动新的模拟服务器,而是与已经提供了一个(通过地址https://test.service-now.com)。

于 2016-11-15T15:38:08.537 回答
1

您可以在 ruby​​ 版本中使用pact-provider-proxy。但是,消费者驱动合同的最佳用例是当您对消费者和提供者都有开发控制权时,这通常意味着您可以在本地建立提供者的实例。如果您正在尝试测试公共 API,或者您没有开发控制权的 API,那么 pact 可能不是您的最佳工具。你可以在这里阅读更多关于什么协议不好的信息。

于 2016-11-11T22:56:18.087 回答
1

It is possible to do (there are standalone mock servers you can run on another machine), but the PactProviderRule always starts a mock server on the same host as where the tests are running.

To achieve what you require, you would need to use one of the mock server implementations, and a new JUnit Rule would need to implemented (preferably extended from PactProviderRule).

There are a number of standalone pact mock servers: https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-server https://github.com/pact-foundation/pact-reference/tree/master/rust/pact_mock_server_cli as well as the pact-mock_service from the Ruby implementation (I can't post the link due to reputation restrictions on stack overflow).

于 2016-11-12T01:35:11.187 回答