Инструменты для тестирования плагинов vim
Я ищу некоторые инструменты для тестирования скриптов vim. Либо скрипты vim, которые
- выполнить модульное/функциональное тестирование или
- для некоторой другой библиотеки (например, Python unittest), что делает его удобным для
- запустить vim с параметрами, которые заставляют его выполнять некоторые тесты в своей среде, и
- определить из результата, прошел ли данный тест.
Мне известно о нескольких сценариях vim, которые выполняют модульное тестирование, но они довольно неопределенно документированы и могут быть или не быть действительно полезными:
vim-unit:
- purports "Чтобы обеспечить vim-скрипты простой платформой для тестирования модулей и инструментами
- первая и единственная версия (v0.1) была выпущена в 2004 году
Документация
- не упоминает, работает ли она надежно, кроме как заявить, что это "плата [sic] от завершена".
unit-test.vim:
- Это тоже кажется довольно экспериментальным и может быть не особенно надежным.
- Может быть, оставлено или отложено: последнее совершение было в 2009-11 ( > 6 месяцев назад)
- Никакие тегированные изменения не были созданы (т.е. без релизов)
Таким образом, очень приветствуется информация от людей, которые используют один из этих двух существующих модулей и/или ссылки на другие, более понятные для использования варианты.
Ответы
Ответ 1
vader.vim - это просто и удивительно. У него нет внешних зависимостей (не требуется ruby /rake), это чистый vimscript-плагин. Здесь полностью указан тест:
Given (description of test):
foo bar baz
Do (move around, insert some text):
2Wiab\<Enter>c
Expect:
foo bar ab
cbaz
Если у вас открыт файл теста, вы можете запустить его следующим образом:
:Vader %
Или вы можете указать путь к файлу:
:Vader ./test.vader
Ответ 2
У меня был успех с помощью Андрея Радева Вимруннера в сочетании с RSpec как для тестирования Vim плагинов и настроить их на сервере непрерывной интеграции.
Вкратце, Vimrunner использует функциональность клиент-сервер Vim для запуска сервера Vim, а затем отправки удаленных команд, чтобы вы могли проверить (и проверить) результат. Это драгоценный камень Ruby, поэтому вам понадобится хотя бы некоторое знакомство с Ruby, но если вы поместите время в это, вы получите полную мощность RSpec, чтобы написать свои тесты.
Например, файл с именем spec/runspec.vim_spec.rb
:
require "vimrunner"
require "fileutils"
describe "runspec.vim" do
before(:suite) do
VIM = Vimrunner.start_gui_vim
VIM.add_plugin(File.expand_path('../..', __FILE__), 'plugin/runspec.vim')
end
after(:all) do
VIM.kill
end
it "returns the current path if it ends in _test.rb" do
VIM.echo('runspec#SpecPath("foo_test.rb")').should == "foo_test.rb"
VIM.echo('runspec#SpecPath("bar/foo_test.rb")').should == "bar/foo_test.rb"
end
context "with a spec directory" do
before do
FileUtils.mkdir("spec")
end
after do
FileUtils.remove_entry_secure("spec")
end
it "finds a spec with the same name" do
FileUtils.touch("spec/foo_spec.rb")
VIM.echo('runspec#SpecPath("foo.rb")').should == "spec/foo_spec.rb"
end
end
end
Я подробно описал это в "Тестирование плагинов Vim на Travis CI с RSpec и Vimrunner" , если вы хотите более подробно.
Ответ 3
Существует еще один (чистый VimL) плагин UT, который я поддерживаю.
Он задокументирован, он поставляется с несколькими примерами, и он также используется моими другими плагинами.
Он предназначен только для тестирования результатов функций и отображения сбоев в окне quickfix. Кроме того, декодируются стоп-сигналы отмены. AFAIK, это единственный плагин до сих пор (или, по крайней мере, первый), который должен был заполнить окно quickfix. С тех пор я добавил вспомогательные скрипты для создания результатов теста с помощью rspec (+ Vimrunner)
Обратите внимание, что для проверки того, как изменяется буфер с помощью сопоставлений/фрагментов/..., я рекомендую использовать другие плагины. Например, я тестирую свои фрагменты С++ (из lh-cpp) на travis с VimRunner + RSpec.
Что касается синтаксиса, он выглядит так:
" Old way, to test boolean expressions
Assert 1 > 2
Assert 1 > 0
Assert s:foo > s:Bar(g:var + 28) / strlen("foobar")
AssertTxt! (s:foo > s:Bar(g:var+28),
\, s:foo." isn't bigger than s:Bar(".g:var."+28)")
" New, recommended way to test relations
AssertEquals('a', 'a')
AssertDiffers('a', 'b')
let dict = {}
AssertIs(dict, dict)
AssertMatch('abc', 'a')
AssertRelation(1, '<', 2)
AssertThrows 0 + [0]
Ответ 4
Я использовал vim-unit
раньше. По крайней мере, это означает, что вам не нужно писать свои собственные функции AssertEquals
и AssertTrue
. Он также имеет приятную функцию, которая позволяет запускать текущую функцию, если она начинается с "Test", путем размещения курсора внутри тела функции и ввода :call VUAutoRun()
.
Документация немного некорректна и незавершенна, но если у вас есть опыт работы с другими библиотеками тестирования XUnit, она не будет вам незнакома.
Ни один из упомянутых script не имеет возможности проверить специфические функции vim - вы не можете изменить буферы, а затем проверить ожидания на результат - так что вам нужно будет написать свой vimscript в тестовом режиме. Например, передайте строки в функции, а не вытаскивайте их из буферов с getline()
внутри самой функции, возвращайте строки вместо использования setline()
, что-то типа.
Ответ 5
Для функционального тестирования есть инструмент под названием vroom. Он имеет некоторые ограничения и может занимать от нескольких секунд до конца, чтобы пройти тщательные тесты для проекта с хорошим размером, но он имеет хороший грамотный формат тестирования/документации с поддержкой подсветки синтаксиса vim.
Он использовал для тестирования плагина codefmt и нескольких подобных проектов. Вы можете проверить vroom/dir там для примера.
Ответ 6
Еще несколько кандидатов:
VimBot - Подобно VimRunner в том, что он написан на Ruby и позволяет удаленно управлять экземпляром vim. Является построенным для использования с модульной схемой тестирования RSpec.
VimDriver - То же, что и VimBot, за исключением сделанного в Python вместо Ruby (запускается как прямой порт из VimBot), поэтому вы можете использовать Python если вы более знакомы с этим.
Ответ 7
Существует vim-vspec.
Ваши тесты написаны в vimscript, и вы можете написать их с помощью BDD-стиля (описать, это, ожидать,...)
runtime! plugin/sandwich/function.vim
describe 'Adding Quotes'
it 'should insert "" in an empty buffer'
put! = ''
call SmartQuotes("'")
Expect getline(1) == "''"
Expect col('.') == 2
end
end
В GitHub есть ссылки на видео и статью, чтобы вы начали: