丝瓜+草莓+香蕉进出无限制!网友:没骗人,随便进
丝瓜+草莓+香蕉是款让大家心动不已的福利视频产品,可以带你领略各种各样的美女表演,诱人的剧情丰富多样,足以让所有的宅男疯狂,来这里消除你的寂寞,享受美妙的夜生活...
2023-04-08
前端分离已经成为业界常见的开发/部署模式。所谓前端分离,并不是传统行业的按部门划分。有的人是纯前端(),有的人是纯后端,因为这种方式不行:比如很多团队都采用了后端模板技术(JSP、ERB等)。),而前端的开发和调试需要一个后端Web容器的支持,无法实现真正的分离(更不用说部署时动态内容和静态内容的混合,关于前端开发的另一个讨论可以在这里找到。
即使前端和后端开发流程通过API解耦,前端和后端通过接口通信,前端的静态内容和后端的动态计算分开开发部署,集成仍然是不可避免的问题。前端和后端应用程序可以独立运行,但集成不起作用。我们需要花费大量的精力去调试,在上线之前没有人有信心所有的接口都在工作。
一点背景
每个前端和后端都有自己的开发流程、构建工具、测试集等等。前端和后端只通过接口编程,接口可以是JSON格式接口,也可以是XML接口。关键是后台只负责提供和计算数据,根本不处理展现。前端负责获取数据,组织数据,呈现数据。这样结构清晰,关注点分离,前后端变得相对独立,松散耦合。
以上场景还是比较理想的。事实上,我们在实际环境中会有非常复杂的场景,比如异构网络、异构操作系统等。
在实际场景中,后端可能更复杂,比如用C语言采集数据,然后通过Java集成到一个数据仓库中,然后数据仓库又有了一层,最后这几层被一个Ruby聚合集成,返回到前端。在这样一个复杂的系统中,后台任何一个端点的故障都可能会阻塞前端开发流程,所以我们将使用mock来解决这个问题:
这个服务器可以启动一个简单的HTTP服务器,然后发出一些静态内容供前端代码使用。这样好处很多。
后端的进度不会影响前端的开发
启动速度更快
你可以在前端和后端使用你熟悉的技术栈(前端学习和后端使用会非常不方便)
但是融合还是很头疼的。我们经常会发现集成时原来协商的数据结构发生了变化:字段原来是字符串,现在变成了数组(业务变了,系统现在可以支持多个快递地址);字段变成字符串,协商时间为;用户的电子邮件地址又多了一层,以此类推。这些变化是不可避免的,并且时有发生,这将花费大量调试时间和整合时间,的时间,更不用说修改后的回归测试了。
所以仅仅使用一个静态服务器然后提供数据是不够的。我们需要的应该还是能够做到的:
前端的开发和测试基于这些模拟数据
后端生成指定格式的模拟数据
简而言之,我们需要协商一些合同,并将其用作可以测试的中间格式。那么前端和后端都需要有测试来使用这些契约。一旦合同变更,对方的测试就会失败,带动双方协商,减少整合的浪费。
一个实际的场景是:前端发现一个现有的合同中有一个缺失的字段,所以它将这个字段添加到合同中。然后这个字段在UI上正确显示(当然还有字体、大小、颜色等。也被设置)。但是,在后台生成合同的服务并不知道这一变化。当运行生成合同部分(后台)的测试时,测试将失败,因为它没有生成此字段。所以后端工程师会和前端商量。理解了业务逻辑之后,他会修改代码,确保测试通过。这样在集成的时候,UI就不会出现字段缺失的情况,但是没有人知道是前端问题,后端问题,还是数据库问题。
而且在实际项目中,往往会有多个页面、多个API、多个版本、多个团队同时开发。这样的合同会减少很多调试时间的工作,使集成相对顺利。
实际上,合同可以定义为JSON文件或XML。只要保证前端和后端共享同一个契约集进行测试,集成工作就会受益。最简单的形式之一是提供一些静态文件,前端向后台发送的所有请求都被某种机制截获,并转换为对静态资源的请求。
Wiremock,基于Java
西纳特拉,基于鲁比
看到这里列出来,熟悉的人可能会反对:这是一个功能齐全的程序库。之所以在这里列出来,是因为它提供了一种简洁优美的语言,非常契合。我找不到更漂亮的方式让它更易读,就采用了。
例子
我们以这个应用为例,说明如何在分离前端和后端后,保证代码质量,降低集成成本。这个应用场景很简单:每个人都可以看到一个物品列表,每个登录用户都可以选择自己喜欢的物品,并在上面添加星星。添加了星号的条目将保存在用户自己的。用户界面如下所示:
但是为了专注于我们的中心,我去掉了登录、个人中心等页面,假设你是登录用户,然后我们来看看怎么写测试。
前端开发
然后,一种可能的方法是请求
这个json来测试前台:这样当然是可以工作的,但是这里发送请求的并不是最终的,当集成的时候我们又需要修改为真实的。一个简单的做法是使用来做一次url的转换:
这样,当我们和实际的服务进行集成时,只需要连接到那个服务器就可以了。
注意,我们现在的核心是这个文件。这个文件现在的角色就是一个契约,至少对于前端来说是这样的。紧接着,我们的应用需要渲染的功能,这就需要另外一个契约:找出当前用户加星过的所有条目,因此我们加入了一个新的契约:
通过这两个请求,我们会得到两个列表,然后根据这两个列表的交集来绘制出所有的星号的状态(有的是空心,有的是实心):
剩下的一个问题是当点击红心时,我们需要发请求给后端,然后更新红心的状态:
这里又多出来一个请求,不过使用Sinatra我们还是可以很容易的支持它:
可以看到,在没有后端的情况下,我们一切都进展顺利后端甚至还没有开始做,或者正在由一个进度比我们慢的团队在开发,不过无所谓,他们不会影响我们的。
不仅如此,当我们写完前端的代码之后,可以做一个的测试。由于使用了mock数据,免去了数据库和网络的耗时,这个的测试会运行的非常快,并且它确实起到了端到端的作用。这些测试在最后的集成时,还可以用来当UI测试来运行。所谓一举多得。
后端开发
我在这个示例中,后端采用了作为示例,你应该可以很容易将类似的思路应用到Ruby或者其他语言上。
首先是请求的入口,会负责解析请求路径,查数据库,最后返回JSON格式的数据。
具体查询的细节我们就不做讨论了,感兴趣的可以在文章结尾处找到代码库的链接。那么有了这个Controller之后,我们如何测试它呢?或者说,如何让契约变得实际可用呢?
提供了非常优美的DSL来编写测试,我们仅需要一点代码就可以将契约用起来,并实际的监督接口的修改:
建立了mockmvc之后,我们就可以编写Controller的单元测试了:
当发送请求到上之后,我们期望返回状态是200,然后内容是。然后我们预期返回的结果是一个长度为3的数组,然后数组中的第一个元素的字段不为空。
注意此处的方法,事实上它会去加载文件也就是前端用来测试的mock文件:
这样,当后端修改定义(添加/删除/修改字段),或者修改了mock数据等,都会导致测试失败;而前端修改mock之后,也会导致测试失败不要惧怕失败这样的失败会促进一次协商,并驱动出最终的service的契约。
总结
前后端分离是一件容易的事情,而且团队可能在短期可以看到很多好处,但是如果不认真处理集成的问题,分离反而可能会带来更长的集成时间。通过面向契约的方式来组织各自的测试,可以带来很多的好处:更快速的测试,更平滑的集成,更安全的分离开发等等。
代码
前后端的代码我都放到了Gitbub上,感兴趣的可以clone下来自行研究:
bookmarks-server
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。
本站部分文字及图片均来自于网络,如有侵权请及时联系删除处理,欢迎发送邮件
相关文章
丝瓜+草莓+香蕉是款让大家心动不已的福利视频产品,可以带你领略各种各样的美女表演,诱人的剧情丰富多样,足以让所有的宅男疯狂,来这里消除你的寂寞,享受美妙的夜生活...
2023-04-08
丝瓜+草莓+香蕉是一款非常精彩刺激的福利视频播放平台软件,在这里看视频更加的流畅稳定,不用考虑卡顿问题,是绝对不会出现的。画质绝对也是超清的,让你体验到在看视频...
2023-04-08
▇芭乐视频▇在线播放是一款非常精彩刺激的福利视频播放平台软件,在这里看视频更加的流畅稳定,不用考虑卡顿问题,是绝对不会出现的。画质绝对也是超清的,让你体验到在看...
2023-04-08
▇芭乐视频▇在线播放一款很实用并且强大的掌上福利播放器,里面满满的都是激情福利,各种各样的美女视频大家都可以免费欣赏,亲属度过漫漫的长夜。让你在这里刷福利视频看...
2023-04-08
迈开腿我可以尝尝你的软件是本年度最受男同胞青睐的福利神器,可以很轻松的享受到很多让人欲罢不能的视频,种类丰富多样,不要一分钱就能在线点播,喜欢的朋友们不要错过了...
2023-04-08
迈开腿我可以尝尝你的软件是一款宅男老司机们都喜欢使用的看片神器,丰富的资源加上高清无遮挡的画质,让喜欢看片的你能够享受到各种喜欢的内容,都有大量的视频更新,能够...
2023-04-08
热评文章
苏州大学医学院5加3怎样(苏州大学医学院怎么样)
浙江财经大学别来(浙江财经大学研究生招生信息网)
学校招生办公室工作怎么样(培训机构招生办招生办工作职
问号是什么意思(下四川农业大学招生网载输入法)
香港科技大学2020(香港科技大学2020研究生录取
中国美院2019分数线(2019年天津小学排名)