更多分享内容可访问我的个人博客
本文介绍一款可以在 vim 中灵活进行单元测试的工具。
需求
对于较大规模的项目而言单元测试是必不可少的。要在 vim 中进行单元测试有很多种方法。比如使用内置终端,自己编写测试脚本,通过asynctasks.vim
等。但以上方法均无法做到精确、灵活地测试。比如有 10 个测试文件,共有 100 个测试函数,只想测试第 3 个文件中的第 2 个函数,依靠以上方法会比较困难。
解决方案
vim-test插件是目前最好的选择。该插件最大的优势在于可以精确地指定要测试的内容。该插件不需要安装依赖,因此只要安装插件本身即可。下面是一份简单的配置。
nnoremap <silent><nowait> <space>tn :<C-u>:TestNearest<CR>
nnoremap <silent><nowait> <space>tf :<C-u>:TestFile<CR>
nnoremap <silent><nowait> <space>ts :<C-u>:TestSuite<CR>
nnoremap <silent><nowait> <space>tl :<C-u>:TestLast<CR>
nnoremap <silent><nowait> <space>tg :<C-u>:TestVisit<CR>
let test#strategy = {
\ 'nearest': 'asyncrun',
\ 'file': 'asyncrun',
\ 'suite': 'asyncrun',
\ 'last': 'asyncrun',
\}
let g:test#echo_command = 0
该插件有四种测试的选择,分别是测试离光标最近的函数、测试当前文件、测试全部以及重新测试上一次的内容。
strategy
决定了测试运行方式以及结果展示形式,设置为asyncrun
即在后台异步运行并且自动打开 quickfix 显示结果。这应当是最合适的选项。
一般情况下使用以上配置足以,进一步还可以指定测试工具,为显示以及运行指定设置参数。因此该插件也可以进行性能测试。具体可见其github 主页。
优化
vim-test 的配置非常复杂,vim-ultest在该插件的基础上优化了配置并且添加了新功能。
这里给出一份简单的配置。测试结束后行号前会出现测试是否通过的标记。output
就是单元测试的具体结果,由于运行结束后自动显示结果效果不佳,于是在这里将其关闭,要看结果时使用快捷键即可。summary
是单元测试通过与未通过的结果汇总,并且附带跳转功能。
nnoremap <silent><nowait> <leader>ta :<C-u>:Ultest<CR>
nmap <silent><nowait> <leader>tf <Plug>(ultest-run-file)
nnoremap <silent><nowait> <leader>tn :<C-u>:UltestNearest<CR>
nnoremap <silent><nowait> <leader>tl :<C-u>:UltestLast<CR>
nnoremap <silent><nowait> <leader>ts :<C-u>:UltestStop<CR>
nmap <silent><nowait> <leader>to <Plug>(ultest-output-jump)
nmap <silent><nowait> <leader>tj <Plug>(ultest-summary-jump)
nmap ;j <Plug>(ultest-next-fail)
nmap ;k <Plug>(ultest-prev-fail)
let g:which_key_map2.t ={
\ 'name' : '+test',
\ 'a' : 'run all tests',
\ 'f' : 'run tests in the current file',
\ 'n' : 'run the test nearest to the cursor',
\ 'l' : 'run the last test',
\ 's' : 'stop all tests in the current file',
\ 'o' : 'show output of the nearest test',
\ 'j' : 'jump to the summary window',
\}
let g:ultest_max_threads=8
let g:ultest_use_pty = 1
let g:ultest_summary_height=10
let g:ultest_summary_open="botright split | resize".g:ultest_summary_height
let g:ultest_output_on_run=v:false
vim-ultest
插件还带有调试功能,但是配置较为复杂且功能不如vimspector
,因此不建议使用。