系统进行集成部署,以测试它们如
我们的系统通常依赖于第三方服务(它们甚至可能是我们无法控制的公司内部的服务)。这类服务包括社交网络(SocialNetworks),公开API、带有API(如Salesforce)的SaaS、身份验证提供者,或者我们的系统与之通信但在产品生命周期之外的任何系统。
在常规集成测试中,我们将对所有子系统进行集成部署,以测试它们如何协同工作。但是,对于外部服务,我们只能使用真正的部署(给定一些API凭据)。我们需要哪些选项来编写集成测试,即检查我们的系统是否与外部系统正确地集成?
如果服务提供了沙箱,这就是方法-您有一个目标环境,您可以做任何事情,它将是短暂的,任何终端用户都看不到。然而,这是罕见的,因为大多数外部服务不提供这样的沙箱。
另一种选择是拥有一个集成测试帐户--例如,您在Twitter注册一个名为“YourProduct-Test”的应用程序,创建一个测试Twitter帐户,并向集成测试提供这些凭据。如果您没有涉及多步交互和许多先决条件的复杂场景,那么这是很好的。例如,如果应用程序在一段时间内对tweet进行分析,就不能在过去用测试帐户发布tweet。
第三个选项是模拟。通常,模拟和集成测试是相互排斥的,但在这种情况下并非如此。您不想测试外部服务是否符合其规范(或API文档)--您希望测试应用程序是否以适当的方式调用它,并正确地处理其响应。因此,运行外部系统的模拟应该是可以的,它在预定义的一组标准中返回预定义的结果。这些结果和标准应与规范直接对应。
https://greasyfork.org/da/scripts?set=547873
这可以很容易地通过运行嵌入式模拟服务器来实现。有多个工具可以用来做这件事-下面列出了一些用于Java前三个是专门为上面的usecase创建的,而ApacheWink有一个简单的模拟服务器类作为更大项目的一部分。
因此,如果您想测试您的应用程序在每次成功购买之后是否正确地发布tweet,您可以(例如,使用WireMock)这样做:
https://greasyfork.org/ar/scripts?set=547873
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@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://greasyfork.org/bg/scripts?set=547873
当然,这也有一个缺点--你在你的模型中设置的规则可能与外部系统中的规则不一样。您可能误解了规范/文档,或者它可能没有涵盖所有的角落情况。但为了自动化测试,我认为这比支持无法正确清理或设置测试数据的测试帐户更可取。
这些自动化集成测试可以伴随着在分阶段环
https://greasyfork.org/cs/scripts?set=547873
并不特别,但我想获得一些基本的自然语言处理方面的经验,所以我决定分析用户最新的200条推特,并执行以下分析,这反过来会影响用户所获得的音乐:
- 情绪分析-我将每条推特传递如果所有推文的平均情绪为:正=>大音阶,负=>小音阶。中立导致利迪安或多里安音阶。让我详细说明一下“平均情绪”--每条推文的情绪是0(非常负)到4(非常肯定)之间的数字。那么,很明显,平均是情绪/数字推文的总和。
- Tweet长度--如果你的Twitter平均短于40个字符,那么它的音阶是五音的。否则是庚状的
- 推特频率-你的推特之间的平均间隔决定了音乐的节奏。你发的推特越多(而且两者之间的时间越短),音乐就越快。你的推特节奏就是你推特人的音乐节奏。
- 变化--这是最模糊的度量,而我使用的算法是最天真的。我从所有的推文中提取所有的单词,应用一个词干器(也就是说,把它们转换成它们的基本形式,例如吃->吃,小偷->小偷等等,同样是CoreNLP的一部分),删除停止词(或者,然后,等等链接词)。然后,我计算一个主题阈值-一个关键字必须出现的次数,才能被认为是你的推特主题。然后我数着话题,你拥有的话题越多,旋律的变化就越大。据我所知,“旋律的变化”不是音乐的标准指标,我把它定义为主要部分音符之间的平均距离。所以你的话题越多,你的音乐就应该越上上下下。
现在进入技术挑战。情感分析是一个繁重的过程,CoreNLP的管道类不是线程安全的,每次都要加载一个模型。除此之外,获取200条推特的速度也不是那么快。所以我无法实时得到相应的音乐。我不得不用某种排队的方式。我决定保持它的简单,并使用我的数据库(MySQL)作为一个队列--每当出现对twet-to-Music的请求时,我就将用户id插入到“twitter_Music_requents”表中。然后每X秒(延迟,即两次运行不能重叠)运行计划作业,选择标记为“process=false”的最新请求,并对其进行处理。这样,每次只有一个线程处理请求,这意味着我可以重