针对公共API的PACT提供商验证

时间:2017-12-31 15:06:54

标签: microservices pact pact-jvm

我正在尝试使用pact jvm测试消费者驱动程序合同测试并能够生成消费者方合同文件。在提供者端验证期间,如何提供公共API而不是localhost大多数示例仅使用localhost作为提供者,任何帮助请

@RunWith(PactRunner.class) // Say JUnit to run tests with custom Runner
@Provider("WeatherProvider") // Set up name of tested provider
@PactFolder("D:\Workspace\pactConsumer\pactConsumer_v2\pacts") // Point where to find pacts (See also section Pacts source in documentation)
@VerificationReports(value = {"markdown","json"}, reportDir = "D:\Workspace\pactConsumer\pactConsumer_v2\target")

public class ProviderVerifyer {
@State("Weather information is available for Chennai") // Method will be run before testing interactions that require "with-data" state
public void getWeather() {
System.out.println("Weather information is available for Chennai" );
}
@TestTarget // Annotation denotes Target that will be used for tests
public final Target target = new HttpTarget(8114); // Out-of-the-box implementation of Target (for more information take a look at Test Target section)

}

1 个答案:

答案 0 :(得分:0)

这是可能的,但是 -

在验证实时提供商之前,您需要仔细考虑 - 尤其是您无法控制的提供商。任何改变服务器状态的东西(很可能)都会消失。

但是,没有技术原因您无法运行某些提供商验证来检查您的消费者合同是否已由当前部署的提供商履行。有host and port的构造函数:

public final Target target = new HttpTarget(host, port); 

有些事要小心:

  • 编写测试以使他们不依赖于数据非常重要。这意味着在您的消费者测试中使用matchers以确保您验证从提供程序返回的数据的形状(而不是验证从提供程序返回的特定数据)。无论如何,这是编写消费者测试的好习惯。
  • 如果您的合同包含预计会更改服务器状态的请求(可能不适合向实时提供商提出这些请求,除非您能够向沙箱环境发出请求),否则可能会遇到问题以某种方式)。
  • 根据合同的大小和/或提供商获得的正常流量,对您运行自己的自动化测试可能是不礼貌的。
  • 你无法set provider state。提供者状态用于避免在合同测试之间存在相互依赖性,因此如果您在执行任何其他操作之前必须(比方说)发出登录请求,则可能会遇到令人头疼的问题 - 协议不是设计为具有依赖于顺序的测试或包括不止一个请求。
  • 如果他们在其他地方运行的现场部署提供商进行测试可能会很脆弱 - DNS,服务器正常运行时间,网络超时等的变化都可能导致您的测试意外失败。

更好的选择

最好的解决方案是让控制提供商的任何人使用(或包括)您的消费者生成的协议进行自己的验证。对于协议经纪人来说,这是一个很好的用例 - 但是根据你与合适的人联系的能力,这可能是一个挑战。