The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
在我的一个名为SixNines.io的Ruby宠物网络应用程序中,我正在使用DynamoDB,这是由AWS提供的一种NoSQL云数据库。它的功能非常强大,但问题是很难创建一个集成测试,以确保我的代码与”真实”的DynamoDB服务器和表一起工作。让我向你展示如何解决这个问题。该代码是开源的,你可以在yegor256/sixnines GitHub存储库中查看。
首先,您需要使用由AWS创建的DynamoDB Local命令行工具进行测试。在进行集成测试之前,您需要启动它并在测试完成后停止。
为了使事情更简单,我建议您使用jcabi-dynamodb-maven-plugin
,这是我几年前开发的一个Maven插件。您需要将pom.xml
添加到您的代码库中,并从Rakefile
启动/停止Maven,就像我在这里所做的一样。
首先,我要删除dynamodb-local/target
目录,这是Maven保存临时文件的目录,以确保我们始终从头开始。
然后,我使用Process.spawn
作为后台进程启动mvn install
,并使用pid
作为其进程ID(这在Windows上不起作用,只在Linux/Mac上有效)。然后我立即注册一个at_exit
的Ruby钩子,如果Ruby因任何原因而死亡,该钩子将被执行。我相信很明显,我为什么要这样做——为了避免在Rake完成或终止后在后台运行垃圾。
请注意,我使用的是kill -TERM
而不是kill -KILL
,以便给Maven一个机会来完成所有工作,正确终止DynamoDB Local,关闭其TCP端口并退出。
接下来,我要检查sn-endpoints
这个表在DynamoDB Local中的状态。如果服务器正在运行,它就应该存在。根据sn-endpoints.json
中的JSON配置,它将由jcabi-dynamodb-maven-plugin
创建。
然而,这个表可能不会立即准备好,因为需要时间来启动Maven、启动服务器并在其中创建表。这就是为什么,如果出现异常,我会捕获它,等待5秒钟然后重试。我会一直尝试多次,直到服务器准备好。最终它会准备好的。在我的MacBook上大约需要12-15秒,也就是2-3次尝试/异常。
我的类需要在集成测试期间知道如何连接到服务器。在生产环境中,它们需要连接到AWS,在测试中,它们必须知道我刚刚启动的DynamoDB本地实例。这就是我在Dynamo
类中的内容,它负责与DynamoDB进行连接。它根据环境变量RACK_ENV
的决定来确定连接位置,该变量在test__helper.rb
中设置为"test"
,rake/testtask
会在所有其他测试之前加载它,感谢其名称中的双下划线。
如果环境变量设置为"test"
,Dynamo
将从YAML文件dynamodb-local/target/dynamo.yml
中获取连接参数,该文件是由maven-resources-plugin:copy-resources
创建的。DynamoDB Local数据库的TCP端口将在此处找到,以及DynamoDB的身份验证密钥和密码。
这是最容易的部分。我只需按照生产中的要求使用我的对象,并将它们连接到 DynamoDB 本地而不是 AWS。
为了测试整个应用程序,我使用 Rack::Test 进行一系列的 HTTP 调用。例如,在这里,我试图渲染 Jeff 的用户账户页面。它的 HTTP 响应代码应该是 200。
现在您可以从命令行运行整个测试。您可以在发布新版本时查看Rultor是如何运行它的:完整日志。此外,也可以在Travis中查看其运行方式:Travis链接。简而言之:
Rake 尝试运行
test
,它依赖于dynamo
。Rake,在
test
任务中,使用此pom.xml
在后台运行mvn install
。Maven unpacks DynamoDB Local 安装包;
Maven 保留 一个随机的TCP端口,并将其值存储在
${dynamo.port}
中;Maven saves
${dynamo.port}
and key/secret pair info;
Maven 会保存 ${dynamo.port}
和密钥/密码对信息;
Maven starts DynamoDB Local,将其绑定到保留的TCP端口上;
Rake waits for DynamoDB Local availability on the reserved port;
Rake在保留端口上等待DynamoDB Local的可用性;
从test__helper.rb开始,导入所有的测试类。
环境变量
RACK_ENV
被设置为"test"
;Rack::Test 试图 尝试 分发一个网页;
Dynamo
从dynamo.yml
加载 YAML 配置并连接到 DynamoDB Local。Rake stops;
Ruby terminates Maven and it stops DynamoDB Local.
Ruby终止Maven并停止DynamoDB Local。
That’s it.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:46