测试使用Docker容器的节点库

时间:2016-05-24 19:20:45

标签: node.js unit-testing testing docker

我目前正在编写一个Node库来在Docker容器中执行不受信任的代码。它基本上维护一个容器池运行,并提供一个接口来在其中一个容器中运行代码。执行完成后,相应的容器将被销毁并替换为新容器。

图书馆的四个主要类别是:

  • 沙箱即可。公开具有各种选项的构造函数,包括池大小和两个公共方法: executeCode(代码,回调)清理(回调)
  • 作业即可。具有两个属性的类,代码回调(在执行完成时调用)
  • PoolManager ,由Sandbox类用于管理容器池。提供公共方法初始化(大小,回调) executeJob(作业,回调)。它具有与容器管理相关的内部方法( _startContainer _stopContainer _registerContainer 等)。它使用在构造函数中传递的dockerode库的实例来执行所有与docker相关的东西。
  • 容器即可。具有属性 tmpDir dockerodeInstance IP 和公共方法 executeCode(代码,回调)的类,基本上发送针对 ContainerIP:3000 / compile 的HTTP POST请求以及要编译的代码(在每个Docker容器内运行的极简主义API)。

最后,该库的最终用户将只使用Sandbox类。

现在,我的问题是:我应该如何测试?

首先,我似乎很清楚我应该首先针对我的Sandbox类编写功能测试:

  • 它应该创建X容器,其中X是所需的池大小
  • 它应该正确执行代码(包括安全方面:处理图书馆要求中的超时,分叉炸弹等)
  • 它应该正确清理它使用的资源

但是,我不确定测试它有什么意义,怎么做,以及我使用的架构是否适合正确测试。

任何与此相关的想法或建议都非常感谢! :)如果看起来不清楚,请随时要求澄清。

克里斯托弗

1 个答案:

答案 0 :(得分:2)

尽可能多地尝试分离功能和单元测试。

如果您对Sandbox上的构造函数进行了细微更改,那么我认为测试会变得更容易。 Sandbox应该直接使用PoolManager。然后,您可以单独模拟PoolManager并测试Sandbox,它只显示Jobs,为PoolManager调用Containers并进行清理。好的,现在Sandbox已经过单元测试了。

PoolManager可能更难进行单元测试,因为Dockerode客户端可能难以模拟(API相当大)。无论你是否嘲笑它,你都要测试:

  • 正确地缩小/缩小池大小
  • 测试发送的请求多于池中可用容器
  • 如何处理卡住的容器。启动和停止
  • 处理网络故障(模拟事物时更容易)
  • 您可以想到的任何失败案例

可以通过在测试中(在容器中或本地)启动API来测试Container。如果它是最小的重新创建它应该是直截了当的。一旦你拥有它,它真的只是测试一个HTTP客户端听起来像。

可以使用标准单元测试来测试容器中实际API的源代码。因为你正在处理不受信任的代码,所以有很多可能性:

  • 不编译
  • 永不完成执行
  • 永远不会开始
  • 各种炸弹
  • 使用所有主机的磁盘空间
  • 是一个机器人并通过网络进行交谈

代码基本上可以做任何事情。你必须选择你关心的事情。尝试并限制其他一切。

功能测试也很重要,这里有一些碎片需要处理,而且模拟Docker并不容易。

代码隔离是一个难题;我希望Docker最后一次我不得不处理它。请记住,您的客户将始终做您没想到的事情!祝你好运!