Javascript 如何使用pactjs为不同的环境处理不同的路径参数
我已经开始实施CDC测试协议。我如何处理在不同环境的路径中传递不同参数的场景 例如,我的测试调用一个函数,该函数通过点击端点并传递一些参数来请求服务中的一些数据。非常标准 例如:Javascript 如何使用pactjs为不同的环境处理不同的路径参数,javascript,pact,Javascript,Pact,我已经开始实施CDC测试协议。我如何处理在不同环境的路径中传递不同参数的场景 例如,我的测试调用一个函数,该函数通过点击端点并传递一些参数来请求服务中的一些数据。非常标准 例如:api/nodeId/${nodeId}/userId/${userId} 对于不同的环境(QA、UAT等),必须传递特定于该环境的唯一数据,以获得有效的响应。因此,在我的示例中,carId和userId对于每个env都需要不同。当我最初设置测试时,我使用了我们的QA环境,并生成了以下契约 { "consumer":
api/nodeId/${nodeId}/userId/${userId}
对于不同的环境(QA、UAT等),必须传递特定于该环境的唯一数据,以获得有效的响应。因此,在我的示例中,carId和userId对于每个env都需要不同。当我最初设置测试时,我使用了我们的QA环境,并生成了以下契约
{
"consumer": {
"name": "myConsumer"
},
"provider": {
"name": "myProvider"
},
"interactions": [
{
"description": "a request to view nodes",
"request": {
"method": "GET",
"path": "/api/nodeId/RRTT6-3AFA-4B5B-BF76-5B6AC7/userId/123456789",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": {
"startTime": 1549652248000,
"endTime": 1549911448000,
"startPrice": 83576,
"reservePrice": 83876,
"price": 84576,
"status": null,
"groupList": [
"78945"
],
"bids": 0,
}
}
}
],
"metadata": {
"pactSpecification": {
"version": "2.0.0"
}
}
}
正如您所看到的,契约中的路径有一个nodeId和硬编码的userId。如果我尝试针对不同的环境进行验证,这些测试将失败。那么,如何在不同的环境中重复使用相同的合同?目前,对于不同的环境,我正在为每个环境生成一个单独的契约,但似乎必须有另一种方法。依靠外部环境变量来运行测试通常不是一个好主意,主要是因为使用客户机驱动的契约的一个优点是可以单独测试生产者,甚至与环境隔离。这意味着您的测试应该设置它所依赖的东西,或者是灵活的,而不依赖于特定的环境配置。这是任何自动化测试都应该做的,而不仅仅是CDC
例如,在您的场景中,您可以在测试开始之前创建契约中指定的用户,或者模拟您的用户适配器以返回有效的用户,而不管传递的用户id是什么。这里的答案将取决于您的消费者如何使用
nodeId
和userId您可以使用术语
来表示动态路径,但正如Fabrico警告的那样,在每个环境中拥有特定的数据是一个危险的游戏。由于各种原因,提供者通常会有不同的ID,因此在可能的情况下,尝试将测试与这些ID分离
e、 g.使用路径匹配器:
const { Pact, Matchers } = require('@pact-foundation/pact');
const { term } = Matchers;
provider.addInteraction({
state: 'has node ID 1234 and user with ID 5678',
uponReceiving: 'a request to view nodes',
withRequest: {
method: 'GET',
api/nodeId/${nodeId}/userId/${userId}
path: term({ generate: '/api/nodeId/RRTT6-3AFA-4B5B-BF76-5B6AC7/userId/123456789', matcher: '/api/nodeId/[A-Z0-9\-]+/userId/[0-9]+' })
},
willRespondWith: {
status: 200,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: { ... }
}
})
提供程序验证通常针对本地计算机或持续集成生成节点上本地运行的提供程序运行。它并不打算针对已部署的环境运行,而且它在某种程度上违背了这样使用它的目的。契约测试的优点是,在部署之前,您应该知道服务是否能够协同工作。如果您对此感到困惑,请加入我们,并与我们交谈。谢谢Matthew。这正是我想要的。嗨,法布里西奥谢谢你的回复!嗨,贝丝。不,这很有道理。我最初认为,如果我们使用现有的测试环境和数据,那么安装和运行它会更容易,但现在我可以看出,这引入了它自身的复杂性。谢谢你的反馈!