如何进行外部API测试(黑盒)


14

假设您使用的是供应商提供的API,如何确保其API可以正常工作?

我主要担心的是有时供应商将更改推到他们的代码中并破坏API,我们希望有某种自动软件来不断对其进行测试。该如何处理?


根据语言的不同,可能会有一些工具可以提供帮助(我认为Pex用于C#库/ API)。
史蒂文·埃弗斯

Answers:


10

简短的答案:您需要一个用于第三方供应商API的测试套件-因此您将不得不开发一个。

不要指望别人会为您做这件事,也不要指望能自动生成正确测试的“灵丹妙药”。

您可以尝试一些其他方法:

  • 询问供应商是否为每个新版本提供“重大更改”列表
  • 询问他们如何关心API兼容性/告知他们这对您来说是一项重要功能
  • 检查API是否提供了特定的测试钩子,日志记录输出或类似的东西,这些东西也无法轻松地进行测试
  • 使用您自己的日志记录代码包装重要的API调用,将API的输入和相关输出写入日志文件,这样可以在发生意外情况时更轻松地调试内容
  • 在API调用中添加断言以检查前置条件和后置条件,因此,如果新版本的API在您的应用程序中显示了意外行为,则会在错误消息的早期通知您

这些事情是否奏效取决于您的供应商是谁以及您想到的是哪种API。与控制某些物理设备的API相比,生成一些可检查的输出(如文件)的API比控制某些物理设备的API要容易得多,在API中,您必须观察事物的行为来确定API调用是否成功。


我完全同意,但在我看来,发问者没有测试单元的经验,也不知道与他们合作的方案。我的意思是:找到关键点,编写测试单元,运行所有测试,调试,在调试过程中查找新的关键点,编写新单元,在每次更改API后重复最后4个步骤。
Gangnus

@Gangnus:恕我直言,OP并没有告诉我们他以前在单元测试方面的经历。如果他对此有疑问,我相信他知道会问一个更具体的问题。此外,这里的主题不是“单元测试”,而是“自动化集成测试”。这些通常需要与例如以TDD样式方式进行单元测试不同的方案。
布朗

是的,他没有那么说。但是,如果他问“如何确保他们的API能够按预期工作”而不是提到测试单元,“在我看来”,他就是不认识他们。至于自动集成测试,他甚至不知道它们的可能性更高,他只提到了“某种自动软件”。您正在等待与您一样的人们的知识,但是在这些主题中,包括我在内的99%的程序员所了解的知识要少得多。而90%则远远少于此。
Gangnus

0

根据海报的措辞,它不仅仅是测试,IMO。在为API编写单元测试并确保一切正常后,您需要监视第三方API,以便在用户之前发现问题。这是第三方API的真正风险-这不是您的代码,您无法控制对API进行了多少测试或更改的时间/时间。

(免责声明:此处使用的产品名称)如果使用soapUI编写API测试,则可以在AlertSite中将这些测试重新用作操作监视器,以确保API能够按预期运行。如果测试未通过,您可能会在用户致电给您之前收到警报,并抱怨您的应用程序无法正常工作。


0

针对您感兴趣的领域(计划使用的功能)实施学习测试。学习测试是开发人员根据API的公共合同编写的集成测试。即使API的源代码可用,也不应针对内部实现细节编写测试。这种学习测试有两个目的-

  1. 它极大地提高了您对第三方API的理解。
  2. 这些测试有助于验证要求保护的新版本是否实际上向后兼容。

0

有两种解决此问题的方法...

您的应用程序已经投入生产并具有真实的用户流量:

如果您的生产中的应用具有实时流量并且依赖于外部api,则您别无选择,只能密切监视并具有良好的阈值,以便在外部api进行更改而不通知时尽快知道。

您应该始终考虑到以下几点:

  • api随着时间的变化
  • API供应商可能存在错误
  • api供应商测试工具包可能存在错误,或者没有完全涵盖生产api的所有功能

您的应用是安装,并且具有计划的版本/发行版:

在这种情况下,您会有宽限期失败...外部api的更改不会立即影响实时用户。

我认为这是一个更简单的任务。编写一个测试(完整的端到端测试),以对调用外部api的应用程序进行真正的事务处理/ http /请求,并检查是否没有失败。没有测试工具包,没有模拟真实交易。

完成此任务后,您可以选择每24H,1分钟等运行一次。

良好做法:

  • 自动化一切
  • 有可以快速从外部api供应商处联系的人
  • 不要盲目地相信供应商测试所有内容
  • 快速失败-如果您的服务严重依赖于外部api,请不要让您的服务崩溃。快速失败并返回正确的错误消息

工具:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.