外部服务的集成测试

我们的系统通常依赖于第三方服务(它们甚至可能是我们无法控制的公司内部服务)。 此类服务包括公开API的社交网络,带有诸如Salesforce,身份验证提供程序之类的API的SaaS或我们系统与之通信但不在产品生命周期内的任何系统。

在常规的集成测试中,我们将对所有子系统进行集成部署,以测试它们如何协同工作。 但是,在使用外部服务的情况下,我们只能使用实际部署(考虑到一些API凭据)。 我们必须编写集成测试哪些选项,即检查我们的系统是否与外部系统正确集成?


如果该服务提供了一个沙箱,那就是要走的路–您可以在目标环境中执行任何操作,并且该环境将短暂存在,并且对任何最终用户都不可见。 但是,这很罕见,因为大多数外部服务都不提供此类沙箱。

另一个选择是拥有一个集成测试帐户-例如,您在Twitter上注册一个名为“您的产品测试”的应用程序,创建一个测试Twitter帐户,并将这些凭据提供给集成测试。 如果您没有涉及多步交互和很多前提条件的复杂场景,那将很好用。 例如,如果您的应用程序在一段时间内分析推文,则您过去无法使用测试帐户发布推文。

第三种选择是模拟。 通常,模拟和集成测试是互斥的,但在这种情况下不是互斥的。 您不想测试外部服务是否符合其规范(或API文档),而是想测试您的应用程序是否以适当的方式调用了它,并正确地处理了它的响应。 因此,可以运行外部系统的模拟程序,该模拟程序以预定义的标准集返回预定义的结果。 这些结果和标准应直接符合规格。

这可以通过运行嵌入式模拟服务器轻松实现。 有多种工具可用于执行此操作-以下是其中一些Java列表-WireMock , MockServer , MockWebServer , Apache Wink 。 前三个是为上述用例专门创建的,而Apache Wink具有一个简单的模拟服务器类,作为较大项目的一部分。

因此,如果要测试每次成功购买后应用程序是否正确发布了推文,则可以(例如,使用WireMock)执行以下操作:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);@Test
public void purchaseTweetTest() {stubFor(post(urlEqualTo("/statuses/update.json")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(getMockJsonResponse()));// ...purchaseService.completePurchase(purchase);verify(postRequestedFor(urlMatching("/statuses/update.json")).withRequestBody(matching(".*purchaseId: " + purchaseId + "*")));
}

这样,您将验证与外部服务的通信在您的应用程序中是否得到正确处理,即您是否正确集成,但不会在实际系统上进行测试。

当然,这有一个缺点–您在模拟程序中放置的规则可能与外部系统中的规则不同。 您可能会误解了规范/文档,或者可能未涵盖所有特殊情况。 但是为了进行自动化测试,我认为这比支持无法正确清理或设置测试数据的测试帐户更好。

这些自动集成测试可以与在暂存环境中进行手动测试相结合,以确保即使在实际的外部系统中集成也可以正常工作。

翻译自: https://www.javacodegeeks.com/2014/05/integration-tests-for-external-services.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义控件中使用Render的writer

给自定义控件一个模板并输出&#xff0c;可以在重写控件的Render&#xff0c;并使用它的HtmlTextWriter writer例如&#xff1a;publicclassMyTextBox : TextBox { private string _template"<tr><td> {0} </td><td> {1} </td>&l…

使用JBoss AS 7进行SSL加密的EJB调用

加密客户端和服务器之间的通信可为您的系统提供改进的安全性和隐私保护。 这可能是客户的一项重要要求&#xff0c;尤其是在客户端或服务器需要在不受保护的网络中工作时。 本文向您展示了如何在JBoss AS 7中设置SSL加密的EJB调用。 服务器 在服务器端只需完成两件事&#xf…

random模块详解

1.import random randomrandint&#xff08;a&#xff0c;b&#xff09; 括号里是一个范围&#xff0c;randomrandint&#xff08;&#xff09;是取括号里范围的随机数。 >>> import random>>> random.randint(1,10)8>>>>>> random.randi…

【ABAP系列】SAP 面试 ABAPer的一些感想

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【ABAP系列】SAP 面试 ABAPer的一些感想前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版更好&#xff0c;阅读更舒适。 …

mean技术栈 linux,“MEAN”技术栈开发web应用

var express require(express);var app express();app.listen(3000);var _rootDir __dirname;var protectDir _rootDir /protect/;app.use(express.static(_rootDir));//注册路由app.get(/, function(req, res){res.sendFile(_rootDir/src/index.html);});app.use(functio…

VS2005 VS2008新建网站和新建项目里选Web应用程序区别

WebApplication编程模型的优点&#xff1a;●网站编译速度快&#xff0c;使用了增量编译模式&#xff0c;仅仅只有文件被修改后&#xff0c;这部分才会被增量编译进去。●生成的程序集WebSite&#xff1a;生成随机的程序集名&#xff0c;需要通过插件WebDeployment才可以生成单…

Perl线程池

Thread::Pool模块提供了Perl解释器线程的线程池&#xff0c;手册&#xff1a;https://metacpan.org/pod/Thread::Pool。 转载于:https://www.cnblogs.com/f-ck-need-u/p/10422449.html

编写干净的测试–分而治之

好的单元测试应该仅出于一个原因而失败。 这意味着适当的单元测试仅测试一个逻辑概念。 如果我们要编写干净的测试&#xff0c;则必须识别这些逻辑概念&#xff0c;并且每个逻辑概念仅编写一个测试用例。 这篇博客文章描述了我们如何识别从测试中发现的逻辑概念&#xff0c;以…

初学servlet之使用web.xml配置

先写两个servlet,之后展示web.xml配置 package app01c;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.Htt…

根本不存在 DIV + CSS 布局这回事

实际上div不是用来布局的&#xff0c;div只是用来表示一个其它元素都无法准确表达语意的一个块区&#xff0c;只有CSS是用于布局的&#xff0c;所以根本就不存在divCSS布局这回事。反过来&#xff0c;table布局的时候经常依赖于CSS定义一个单元格的布局属性&#xff0c;所以可以…

c语言空格键 key,c语言获得键盘的按键

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼TC 2.0版#include#includeint main(){int key;while(1){keygetch();/*用于去掉第一个字节*/if(key27) break; /*如果是ESC退出*/if(key>31 && key<127) /*如果不是特殊键*/{printf("You have pressed %c Press …

仔细研究Java Identity API

在深入探讨之前&#xff0c;让我们看一下有关Java Identity API JSR 351的一些快速事实。 这仍在进行中。 。 。 JSR是什么时候发起的&#xff1f; 该JSR在2011年10月通过了批准投票&#xff0c;随后在2011年11月成立了专家组。 谁负责此规范&#xff1f; Java Identity AP…

WEB页面的生命周期,DOMContentLoaded,load,beforeunload,unload

简言 理解WEB页面的生命周期&#xff0c;文档加载事件及顺序对WEB开发有十分的重要意义。如果不理解&#xff0c;在元素未加载就提前操作元素&#xff0c;则得不到想要的结果。而如果页面完全加载完成后&#xff0c;再进行操作&#xff0c;则又会影响用户体验。 一般来说&…

WinAPI: SetLayeredWindowAttributes - 设置窗口的透明

这是来宾 Dolby 在 http://www.cnblogs.com/del/archive/2008/03/08/1081295.html#1096814 询问的问题. //声明: SetLayeredWindowAttributes(Hwnd: THandle; {窗口句柄}crKey: COLORREF; {透明色}bAlpha: Byte; {Alpha 值}dwFlags: DWORD {LWA_COLORKEY(1)表示使用透明…

动态规划-线性dp-hdu-4055

https://www.cnblogs.com/31415926535x/p/10423047.html 这道题是大连的某一年的现场赛的题hdu-4055 &#xff0c;&#xff0c;&#xff0c;刚开始做线性dp的题&#xff0c;&#xff0c;看了好半天才看懂解法&#xff0c;&#xff0c; 分析 参考1参考2 题目的意思就是给出一个仅…

JQuery .net WebService 参数必须一致

$.ajax({type: "POST",contentType:"application/json; charsetutf-8",url: "/LearnJQuery/ajax1.asmx/response1",data:"{username:\""$("#inputName").val()"\"}",上面的username必须和webservice中的…

c语言按shift用户随时退出,2014年云南省“三校生”高考计算机第三次模拟试卷...

密班级&#xff1a; 姓名&#xff1a; 学号&#xff1a;密 封 线 内 不 得 答 题玉龙职高2012年高考第三次模拟试卷计算机基础总分&#xff1a;150分&#xff0c;考试时间&#xff1a;120分钟。一、单项选择题(在每小题给出的四个选项中&#xff0c;只有一个是符合题目要求的&a…

无状态EJB:池化和生命周期

无状态EJB池和生命周期的摘要视图&#xff08;注释&#xff09;。 对新手有用。 。 。 。 。 EJB池&#xff1a;快速概述 EJB实例存储在称为EJB池的位置–这不过是内存中的缓存 。 无状态EJB通常按需实例化&#xff0c;即&#xff0c;当客户端调用Bean上的方法时。 但是&…

有意思的批处理

echo off setlocal enabledelayedexpansion set b/-\ /-\ ** set 速度1 set 退格 :b for /l %%i in (0,1,200) do call :a %%i goto :b :a set/a a%1%%10 set/a c%a%%%4 if %a% EQU 0 set/p▌<nul if %c% EQU 3 (set/p^|<nul) else (set/p!b:~%a%,1!<nul) ping/n %速度…

1.原生js封装的获取某一天是当年的第几周方法

function getWeek(str){//str格式为yyy-mm-dd//周日归到了本周var dnew Date(str);var dayd.getDay();var originDated.getFullYear() - "01" - "01" 00:00:00;var nowDated.getFullYear() - ((d.getMonth() 1)>9?(d.getMonth() 1):0 (d.getMonth() 1…