javascript-Pact JS:提供程序测试

使用Pact JS来测试我的使用者和提供者.我可以成功生成协议文件,并希望根据我的提供商对其进行验证.

关于测试提供程序,我有几个问题:

>在进行测试之前,我是否需要启动提供程序服务?我应该在测试中达到实际的提供者端点吗?
例如,说我的提供程序代码库上有一个GET / dogs端点.在运行测试时,是否需要在本地启动服务,点击/ dogs端点,然后使用pact文件验证为端点返回的响应?
>如果我想将其作为我的CI管道的一部分来运行(我正在使用CircleCI),应遵循哪些最佳实践?我是否需要从circleci构建步骤启动服务,指向某处的某个数据库,然后执行上述步骤?
>在提供者测试中是否有使用存根的概念?如果是这样,这些如何启动提供程序服务.是否有任何示例或示例代码?

解决方法:

Do I need to start my provider service before I can do the tests? Should I be hitting the actual provider endpoint in the test?

是的,您可以启动提供程序,并使用实际的端点(请注意以下内容)

When I run my tests, do I need to start up my service locally, hit the /dogs endpoint and then verify the response returned for the endpoint with the pact file?

有点. Pact的模拟使用者将执行端点命中并将结果与​​pact文件中的预期响应进行比较.

If I want to run this as a part of my CI pipeline (I’m using CircleCI), what are some of the best practices to follow?

这是一个普遍的问题,但是您通常会创建一个构建步骤来启动服务,运行Pact的验证,然后关闭服务.请参阅文章末尾的示例链接.

Are there any concepts of using stubs on provider testing? If so, how do these work for staring a provider service?

因此,契约是一种合同测试工具.合同测试has some important differences from functional testing.

广义上,合同测试是关于验证您所发送和接收的数据的形状是否已被双方认可并且可以理解.这与验证数据行为是否正确无关.假设我对API进行了以下设计,该API采用代表电话号码的字符串:

>添加本地电话号码有效
>添加带有国家拨号代码的电话号码是有效的
>添加带有国家/地区代码的电话号码是有效的
>
>可以以a或00开头

>在开头以外的任何地方添加电话号码是无效的
>添加一定长度的电话号码无效

即使那里有很多案例,Pact也只有成功案例和失败案例才是合适的:

>尝试添加有效的电话号码->不管成功的反应是什么
>尝试添加无效的电话号码->无论无效的电话号码响应是什么.

(当然,除非API针对不同类型的失败返回不同的响应).

合同是关于可以表达的内容,而不是为什么要表达的内容.

这告诉我们我们可以在哪里使用存根-您的API端点工作流可能看起来像这样,用伪代码:

// end point for "add phone number"
request = unmarshalResponse(data)
success = recordPhoneNumber(request)
response = marshallResponse(success)
send(response)

因为我们只对合同感兴趣,所以在recordPhoneNumber()中添加业务逻辑是适当的,这意味着该协议将测试您的网络层和编组器.

根据您的代码设计,放置该存根的最佳位置将发生变化.在我们的示例中,存根可能看起来像这样:

// stub for recordPhoneNumber()
if (request.phoneNumber === "+12 345 1234 123") {
   return new Valid()
} else if (request.phoneNumber === "123") {
   return new Invalid("Number too short")
}

理想情况下,合同测试不需要端点之外的任何基础架构(数据库,缓存等).因此,理想情况下,您可以将存根放置在不需要着火的地方.

Pact不适用于集成测试工具(尽管可以以这种方式使用它,但是如果这样做的话,还会遇到其他问题).

>但是我的提供者如何知道要应用哪个存根?

您可以使用provider states来实现.这是javascript provider example的真实示例:

server.post('/setup', (req, res) => {
  const state = req.body.state

  animalRepository.clear()
  switch (state) {
    case 'Has no animals':
    // do nothing
    break
   default:
    importData()
  }
}

Is there any examples or sample code for this?

是.看看这个javascript provider example

上一篇:预计2019年发布的Vue3.0到底有什么不一样的地方?


下一篇:javascript-如何在协定中使用协定