2016-11-17 75 views
2

我正在爲Vim開發一個插件,我想在啓動時測試它的行爲,當用戶編輯文件e.t.c.如何將密鑰輸入到終端進行單元測試

要做到這一點,我想要啓動一個終端,並向它提供鍵。 我正在考慮從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) 

回答

3

我想你應該檢查你的插件Vim內部的核心功能,使用單元測試。有各種各樣的Vim插件,但大多數提供了一些額外的映射或命令,由用戶調用,他們通常會在緩衝區,輸出或打開的窗口中留下一些副作用。這可以從Vim內部進行驗證。有很多種方法,我的是runVimTests test framework;插件頁面有幾個選擇的鏈接。

由於涵蓋了核心功能,幾乎沒有什麼可以「交互式」測試。 (我的意思是忘記調試輸出,執行時間過長,顯示混亂等。)由於你通常是Vim的大用戶和你自己的插件,所以大部分都會覆蓋它。


當然,如果你的插件嵌入自己緊緊地給Vim(像「IDE爲XXX」;雖然這通常是令人難以接受的),你可以考慮一些外部的測試車手。也許其他人會爲一些通用的,終端驅動的測試框架做出貢獻。我幾乎可以肯定這樣的存在。

+0

非常有用的答案。我已經接受了這個答案,因爲這更接近我決定要做的事情。 我把我所有的測試代碼放在一個.vimrc文件中,我將它複製到一個tempdir中。 然後我開始像這樣的vim: 'cd $ tmpdir && HOME =。 vim -X' 然後,我開始在vim8-timer上進行實際測試,因此在插件加載完成後。 – XPlatformer

+0

謝謝,快樂測試;從一開始就係統地做這件事具有不可否認的好處!你的方法聽起來不錯;如果你不想依賴Vim版本8,你也可以使用':autocmd VimEnter * call StartTests()'來觸發它們。 –

+0

與autocmd的絕妙主意,但劇本無論如何需要vim8 :-) – XPlatformer

2

雖然我保留的plugin允許在VimL函數上運行單元測試併爲quickfix窗口提供結果,但我使用另外幾個工具在某些操作後檢查緩衝區的狀態,甚至運行來自travis - > vimrunner + rspec的東西,以及用於安裝依賴關係的VimFlavour。 (我隱約記得一個Python替代靈感來自vimrunner)

它大多運作良好。唉它使用客戶端服務器功能和:redir(而不是更新的​​函數)。即使使用:silent:redir也會捕獲它返回給客戶端的噪音。因此有時候我會對非常奇怪的測試失敗。我還發現自己插入了一些僞暫停,以確保Vim已經完成了解釋我饋送它的內容。

你會在我的一些插件中找到使用的例子。例如,見lh-bracketslh-cpp測試(.travis.yml文件+ .rspec/目錄+ Rakefile + Gemfile +從vim-UT一些傭工)從你和Luc Hermitte