如何将密钥输入终端以进行单元测试

Posted

技术标签:

【中文标题】如何将密钥输入终端以进行单元测试【英文标题】:How can I feed keys in to a terminal for unittesting purposes 【发布时间】:2017-04-01 02:20:06 【问题描述】:

我正在为 Vim 开发一个插件,我想测试它在启动时的行为是否正确,当用户编辑文件等时

为此,我想启动一个终端,并将密钥输入其中。 我正在考虑从 python 脚本中完成这一切。有没有办法做到这一点?

在伪 python 中它可能看起来像这样:

#start a terminal. Here konsole
konsole = os.system('konsole --width=200 --height=150')

#start vim in that terminal
konsole.feed_keys("vim\n")
#run the vim function to be tested
konsole.feed_keys(":let my_list = MyVimFunction()\n")
#save the return value to the file system
konsole.feed_keys(":writefile(my_list, '/tmp/result')\n")

#load result into python
with open('/tmp/result', 'r') as myfile:
    data = myfile.read()

#validate the result
assertEqual('expect result', data)

【问题讨论】:

【参考方案1】:

我认为您应该使用单元测试在 Vim 中验证插件的核心功能。 Vim 插件种类繁多,但大多数都提供了一些额外的映射或命令,供用户调用,它们通常会在缓冲区、输出或打开的窗口中留下一些副作用。这可以从 Vim 内部验证。有多种方法,我的是runVimTests test framework;插件页面有几个选项的链接。

有了如此覆盖的核心功能,几乎没有什么可以“交互式”测试了。 (我的意思是诸如忘记调试输出、执行时间过长、显示混乱等问题。)由于您通常是 Vim 和您的插件的重度用户,因此大部分内容都涵盖了。


当然,如果您的插件将自己紧密嵌入到 Vim 中(例如“XXX IDE”;尽管这通常不受欢迎),您可以考虑使用一些外部测试驱动程序。也许其他人会为一些通用的、终端驱动的测试框架提供指针。我几乎可以肯定这样的存在。

【讨论】:

您和 Luc Hermitte 提供的非常有用的答案。我已将此答案设置为接受,因为这更接近我决定做的事情。我将所有测试代码放在一个 .vimrc 文件中,然后将其复制到 tempdir。然后我像这样启动 vim:cd $tmpdir && HOME=. vim -X 然后我在 vim8-timer 上开始实际测试,因此在加载插件之后。 谢谢,祝测试愉快;从一开始就系统地执行此操作具有不可否认的好处!你的方法听起来不错;如果你不想依赖 Vim 8,你也可以使用:autocmd VimEnter * call StartTests() 来触发它们。 autocmd 的好主意,但脚本无论如何都需要 vim8 :-)【参考方案2】:

虽然我正在维护一个plugin,它允许对 VimL 函数运行单元测试并将结果提供给 quickfix 窗口,但我使用另外几个工具在一些操作后检查缓冲区的状态,甚至运行来自 travis -> vimrunner+rspec 的东西,以及用于安装依赖项的 VimFlavour。 (我依稀记得一个受 vimrunner 启发的 Python 替代方案)

它大多运作良好。唉,它使用客户端-服务器功能和:redir(而不是更新的execute() 功能)。即使使用:silent:redir 也会捕捉到返回给客户端的噪音。因此,有时我会与因非常奇怪的原因而失败的测试作斗争。我还发现自己插入了一些伪暂停,以确保 Vim 已经完成了对我输入的内容的解释。

您会在我的一些插件中找到使用示例。参见例如 lh-brackets 或 lh-cpp 测试(.travis.yml 文件 + .rspec/ 目录 + Rakefile + Gemfile + 来自 vim-UT 的一些助手)

【讨论】:

以上是关于如何将密钥输入终端以进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

我如何对这样的代码进行单元测试?

什么是单元测试?如何做好单元测试?

如何使用输入对 Angular 指令进行单元测试?

软件测试培训第28天

如何在 python 中对装饰器工厂输入进行单元测试

如何在 Xcode 中加载本地 json 文件以进行单元测试?