Javascript 如何创建中型、第三方API密集型nodejs应用程序的集成测试?
我拥有一个中型nodejs应用程序(),它严重依赖于第三方api 简而言之,该应用程序所做的就是根据输入参数和之前一些调用的响应调用不同的Salesforce(低代码平台)API,包括REST和SOAP。这意味着一个请求的执行路径和API调用的数量可以与另一个请求完全不同。基于一些输入参数,应用程序可以在一个请求中调用300多个API(通过异步处理作业) 考虑到API调用及其条件逻辑的复杂性,我很难弄清楚如何为这个应用程序创建测试(mocha、jest等) 大多数在线示例都是关于具有通用或可预测响应的简单端点的,这些端点可以通过以下方式进行测试Javascript 如何创建中型、第三方API密集型nodejs应用程序的集成测试?,javascript,node.js,testing,jestjs,Javascript,Node.js,Testing,Jestjs,我拥有一个中型nodejs应用程序(),它严重依赖于第三方api 简而言之,该应用程序所做的就是根据输入参数和之前一些调用的响应调用不同的Salesforce(低代码平台)API,包括REST和SOAP。这意味着一个请求的执行路径和API调用的数量可以与另一个请求完全不同。基于一些输入参数,应用程序可以在一个请求中调用300多个API(通过异步处理作业) 考虑到API调用及其条件逻辑的复杂性,我很难弄清楚如何为这个应用程序创建测试(mocha、jest等) 大多数在线示例都是关于具有通用或可预测
assert(response)ToBe(200)
但我的应用程序有太多不同的API,响应范围很广
我可以通过单元测试分别模拟所有这些端点,但坦率地说,这似乎太多工作了,它不会给我端到端的集成测试
我还可以模拟一个完整作业的整个响应,只需创建测试来断言处理该响应的代码是否正常工作,但是,我更感兴趣的是测试聚合所有这些API调用结果的数据转换代码
更糟糕的是,大多数处理API的代码都封装在闭包中,这意味着我无法单独测试它们。如果没有模拟内部函数响应的方法,只测试外部函数是不可能的
是否有人成功地为大量传递和转换第三方数据的应用程序创建了自动化集成测试?如果是,您能否提供经验教训、模式等?缓慢性和不可靠性
我知道您有很多API调用。如果您实际上调用了第三方API,那么您将不得不等待它们。更糟糕的是,如果测试有一些不可逆转的影响(插入/更新/删除信息),那么您的测试将使您的应用程序不可靠。避免对写操作进行自动测试是不可接受的,因此实际上调用API函数是需要避免的
替代方案
好吧,但如何避免呢?你会想要的。请记住,您不是在测试第三方API,而是在测试它们的使用情况。因此,您的测试应该尝试有意义的场景
规划有意义的情景
根据您的期望,每个API调用可以有多个场景。选择所有可能响应的代表性案例(或其缺少响应,即拒绝/超时),您的完整场景树将可定义,如:
如果第一次API调用导致第二次API调用
将是这个和那个,如果它有
当然,您将能够修剪一些分支,就像您的第一个API请求超时一样。在这种情况下,您可能希望通过测试超时是否得到正确处理来完成测试
重构你的代码
您提到需要在闭包内测试代码。这清楚地表明您的代码不适合进行单元测试。您需要重构代码,确保要测试的代码不是依赖于封装代码,而是一个单独的函数,该函数接收参数,其中您可以传递以前由于闭包而自动知道的信息。这将把要测试的函数从它们的上下文中分离出来,因此您可以自己测试它们
太多的场景?
你可能有太多的场景,这意味着你有很多工作要做。如果是这样,那么您可能需要创建一个规则数组。规则如下所示:
let dummyRule = {
called: 'API1',
formerResult: 'someresult1',
toBeCalled: 'API2'
expectedResult: 'expectedresult2',
parameters: {/*some object*/}
}
您将有一个测试用例的图形表示。您可以对图形进行深度优先或广度优先遍历,以生成所有实际场景。基于这些场景,您可以在源代码级别生成测试函数,前提是您能够将所有自定义逻辑分离为可用函数。生成测试场景后,只需将生成的文件集成到项目中。缓慢和不可靠
我知道您有很多API调用。如果您实际上调用了第三方API,那么您将不得不等待它们。更糟糕的是,如果测试有一些不可逆转的影响(插入/更新/删除信息),那么您的测试将使您的应用程序不可靠。避免对写操作进行自动测试是不可接受的,因此实际上调用API函数是需要避免的
替代方案
好吧,但如何避免呢?你会想要的。请记住,您不是在测试第三方API,而是在测试它们的使用情况。因此,您的测试应该尝试有意义的场景
规划有意义的情景
根据您的期望,每个API调用可以有多个场景。选择所有可能响应的代表性案例(或其缺少响应,即拒绝/超时),您的完整场景树将可定义,如:
如果第一次API调用导致第二次API调用
将是这个和那个,如果它有
当然,您将能够修剪一些分支,就像您的第一个API请求超时一样。在这种情况下,您可能希望通过测试超时是否得到正确处理来完成测试
重构你的代码
您提到需要在闭包内测试代码。这清楚地表明您的代码不适合进行单元测试。您需要重构代码,请确保