我有这个 ruby 库,它可以与远程设备建立 telnet 或 ssh 连接。一切似乎都有效。测试框架(适用于 telnet)定义绑定(bind)到端口的设备模拟器,以及绑定(bind)到同一端口的测试连接。整个有效载荷交换然后通过该 channel 进行,身份验证步骤也是如此。
使用 SSH,我在适应它时遇到了问题,因为显然,模仿协议(protocol)的身份验证步骤并不那么容易。由于我们使用 net-ssh,客户端需要所有身份验证步骤(ssh 版本、alghoritm 协商、 key 交换等),而且我不知道消息的详细格式(我没有找到很多任何地方的例子)。
我期望的是一种实际向客户端发出信号的方式,该 channel 可以未加密(用于测试,不是问题)并且我想收到提示(基于密码,我不需要 authorized_keys 进程测试环境)。
是否有针对此类考验的简单实现/现有实现?
是的,
对于单元测试模拟 Net::SSH
,对于集成测试做全栈测试(Net::SSH
+ 你的应用 + 你的基础设施)
单元测试
对于单元测试,将 Net::SSH
替换为 Struct
、OpenStruct
或实现方法的同名普通旧 Ruby 对象正在使用。这个模拟类不需要连接到实际的 SSH 服务器,它只需要像连接到服务器一样发出嘎嘎声,它可以将其输入和输出存储到实例变量中,以便您可以对它们进行断言。
通过这种方式,您可以测试应用程序是否发送正确的用户名/密码/IP/执行和正确解析命令等,而不是测试 Net::SSH
是否能够进行 SSH 连接(这将是责任Net::SSH
gem)。
而且测试将比连接到真实的东西快很多。
这是 VCR 背后的基本思想gem - 不要让服务器嘎嘎叫,让客户端嘎嘎叫。
一旦你这样做了,如果你为它制作了一个很好的 API,你可以将它提交给 https://github.com/net-ssh/net-ssh/ 上的好人, 它是有用的东西,但现在似乎缺少它。
集成测试
保持集成测试非常基本。
您可能想要检查 Net::SSH
+ 您的应用程序 + 您的服务器基础架构是否兼容,方法是进行一个额外的硬编码集成测试,该测试连接到您基础架构中的实际服务器并建立连接并执行命令。
升级 SSH 守护进程或强化您的基础架构可能会破坏您的应用程序的功能 - 例如,如果您引入 selinux,禁用弱密码,切换到一个有趣的操作系统,如 Solaris 或 Net::SSH
人们忘记了针对您可能正在使用的特定体系结构的错误引入解决方法(solaris SSH 密码问题、ubuntu 10 known_hosts 问题,...)。