Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将密钥输入到终端以进行单元测试_Python_Unit Testing_Vim_Terminal_Konsole - Fatal编程技术网

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

Python 如何将密钥输入到终端以进行单元测试,python,unit-testing,vim,terminal,konsole,Python,Unit Testing,Vim,Terminal,Konsole,我正在为Vim开发一个插件,我想测试它在启动时,当用户编辑文件e.t.c时是否正常工作 要做到这一点,我想启动一个终端,并将按键输入其中。 我想用python脚本来完成这一切。有办法做到这一点吗 在伪python中,它可能看起来像这样: #start a terminal. Here konsole konsole = os.system('konsole --width=200 --height=150') #start vim in that terminal konsole.feed_k

我正在为Vim开发一个插件,我想测试它在启动时,当用户编辑文件e.t.c时是否正常工作

要做到这一点,我想启动一个终端,并将按键输入其中。 我想用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)

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

由于涵盖了核心功能,所以几乎没有“交互”测试的余地。(我指的是像忘记调试输出、太长的执行时间、显示混乱之类的东西。)因为你通常是Vim和你的插件的大量用户,这主要包括它


当然,如果你的插件把自己嵌入到VIM中(就像XXX的IDE);虽然这通常是皱眉的,但是你可以考虑一些外部的测试驱动程序。也许其他人会为一些通用的、终端驱动的测试框架提供指针。我几乎可以肯定存在这种情况。

当我维护一个允许在VimL函数上运行单元测试并向quickfix窗口提供结果的程序时,我使用另外两个工具在一些操作后检查缓冲区的状态,甚至从travis->vimrunner+rspec和VimFlavor运行该程序来安装依赖项。(我隐约记得一个由vimrunner启发的Python替代方案)

它通常工作得很好。遗憾的是,它使用了客户机-服务器功能和
:redir
(而不是最近的
execute()
函数)。即使使用
:silent
:redir
也会捕捉到噪音,并返回到客户端。因此,有时我会因为非常奇怪的原因抵制失败的测试。我还发现自己插入了一些伪暂停,以确保Vim已经完成了对我提供给它的内容的解释


您可以在我的一些插件中找到使用示例。例如,请参见测试(
.travis.yml
文件+
.rspec/
目录+
Rakefile
+
Gemfile
+一些帮助者)

您和Luc Hermitte提供的非常有用的答案。我将这个答案设置为“接受”,因为这更接近于我决定要做的事情。我将所有测试代码放在一个.vimrc文件中,并将其复制到一个tempdir。然后我像这样启动vim:
cd$tmpdir&&HOME=。vim-X
,然后我在vim8定时器上开始实际测试,因此在插件加载之后;从一开始就系统地这样做有着不可否认的好处!你的方法听起来不错;如果您不想依赖Vim版本8,也可以使用
:autocmd vimnenter*call StartTests()
来触发它们。使用autocmd的想法很好,但脚本仍然需要Vim 8:-)