在Vim中运行测试

2016-12-30   出处:https://8thlight.com  作/译者:Chris Jordan/亚然  

能够从Vim中快速运行单元测试在进行TDD时至关重要。 我经常看到开发人员使用Vim编写代码,并切换到不同的终端来运行测试。 这通常涉及到输出我们想要运行的测试文件的路径,这变得不方便。

大多数编程语言都有一个插件,允许你在Vim中运行单元测试。 例如,Ruby有vim-rspec。 虽然这些插件非常有帮助,做得很好,但是当跟其他的计算机上配对时,对第三方插件的依赖可能会成为问题。

在本文中,我们将描述几种不使用语言特定插件而运行测试的方法。还将介绍,在几个通用插件的帮助下,如何以最佳方式运行测试。

使用Vim中的shell运行测试

在Vim中,我们可以通过键入:!后跟一些shell命令的这种命令行模式进行交互。例如 :!pwd将临时退出Vim,打印工作目录,然后允许您跳回到Vim。

当使用Ruby和RSpec时,运行测试的命令通常类似于rspec spec/some_test.rb. 正在编辑的当前文件的文件名映射到%,因此我们可以使用以下命令:!echo % 回显当前文件或用命令:!wc -l %获取行数。如果我们已经在要运行的测试文件上,我们可以使用RSpec执行测试,如下所示:

!rspec %

我喜欢用零配置的普通的Vim进行工作。 可以用vim -u NONE来运行没有配置的Vim。

我们也可以将它映射到一个快捷方式,使其运行速度更快。我将它映射到rt,把这个作为“run tests”的助记符。像下面这样:

:nnoremap <leader>rt :!rspec %<cr> ,rt 运行我正在处理的当前spec文件的单元测试。

如果你用下面的这句命令:nnoremap <leader>rt :!rspec %<cr>,这里的rake就代表运行所有测试(我用的是ra,代表“run all”);

运行单独测试

RSpec允许我们通过在命令中指定行号来运行单个测试。

所以rspec some_test.rb:10 表示在第10行运行测试。

我们可以使用一个 .连接当前行号和文件名。所以如果我们在第一行执行echo "!rspec %:" . line(".")那么将返回"!rspec %:1"。我们想要执行这个字符串。execute 命令接受一个字符串作为输入,并执行它的内容。我们可以添加运行特定测试的快捷方式如下:

nnoremap <leader>rs :execute "!rspec %:" . line(".")<cr>

到目前为止,我们所看到的是一个基本的运行测试的方法,没有任何插件的帮助,当你与某人合作时,这是非常棒的。

这种方法也有几个限制。 测试正在运行时我们失去Vim窗口,这意味着我们会暂时丢失上下文。 此外,我们必须等待测试运行完成,然后再做其他事情。

与Vimux异步运行测试(需要使用tmux

使用Vimux(和tmux),我们可以在单独的tmux窗格中以分屏格式运行命令。 这在运行测试时很有用,因为测试的输出通常显示在屏幕底部。 我们可以使用以下命令运行测试:

VimuxRunCommand("clear; bundle exec rspec " . expand("%"))

VimuxRunCommand("clear; bundle exec rspec " . expand("%") . ":" . line("."))

这些可以也映射为一种快捷方式。

Vimux遇到的问题是,它需要熟悉tmux,我发现,使用配对有时相当具有挑战性。 我通常需要给tmux一些指示并进行一些配置,以允许我的搭档做一些基本的事情,如导航到一个窗口。 我也无法与错误消息进行交互。 当某些操作失败时,通过单击错误消息中的行号可以返回到Vim是很好的。 IDE通常会为你提供一个stacktrace,可以单击它来导航代码库。我不知道如何用Vimux / tmux做到这一点。

使用:make与quickfix列表运行测试

我们可以使用Vim命令 :make,它将运行我们的单元测试并解析发生在Vim的quickfix列表中的任何错误/失败测试。 接着quickfix列表就可以用于导航到测试失败的各个地方。

当我们试图运行RSpec测试时,我们首先必须将编译器设置为rspec。 这是为了说明当我们执行'make'时将运行什么命令,并且它还定义错误格式,所以任何测试失败都可以解析到quickfix列表中。将编译器设置为RSpec:

:compiler rspec

然后用make运行当前文件:

:make %

如果测试失败,您可以使用 :copen打开quickfix列表。 然后,您可以从quickfix列表导航到测试失败的位置。

或者,我们可以改用rake。

:compiler rake

:make spec

要查看所有可用的编译器,可以运行:compiler。 你可以通过安装类似vim-polyglot来下载更多的编译器。

但是,我们仍然存在在测试运行时丢失Vim窗口的问题。

最好方法是使用Vim Dispatch进行异步测试

我发现Vim Dispatch是在Vim中运行测试的最佳选择。 当使用tmux时,它允许我异步地运行测试,同时在分屏中看到当前测试输出,例如,我可以看到有多少测试失败。 但是它与Vimux的不同之处在于,测试已经完成运行,tmux窗格退出,quickfix列表随后将填充任何测试失败。 如果没有测试失败,则窗口消失。

:Dispatch rspec %

:execute "Dispatch rspec %:" . line(".")

我更喜欢使用Vim Dispatch而不是语言特定的插件,这样我能感觉到更多地控制运行的是什么。 我可以换一种不同的语言并且只是改变要运行什么测试命令。

设置特定语言的配置

我们可以把这些映射在.vimrc文件中,但这只适用于Ruby项目。 Vim为我们提供了设置语言特定配置的功能。

我们可以将此键映射添加到~/.vim/ftplugin/ruby.vim中,这将使此快捷方式仅适用于Ruby文件,而不是将其放在~/.vimrc文件中。 这样,如果你想使用Clojure或Elixir运行测试,你可以把这些键映射放在~/.vim/ftplugin/clojure.vim 或~/.vim/ftplugin/elixir.vim中,这样就只需更改运行的测试命令。

扩展阅读

·:help shell

·:help make

·:help compiler

·:help quickfix

·Vim Dispatch

·Vimux

·ftplugin


【英文原文:https://8thlight.com/blog/chris-jordan/2016/06/13/running-tests-in-vim.html】
{测试窝原创译文,译者:亚然}
译者简介:亚然,软件测试爱好者,长期从事软件测试工作


欢迎给测试窝投稿或参与内容翻译工作,请邮件至editors@testwo.com。也欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,并与我们的编辑和其他窝友交流。
159°|1596 人阅读|0 条评论

登录 后发表评论