Pytestをvim-quickrunで走らせようとしたらハマった
PytestはPythonのテストランナーです。今まではnoseを使っていましたが、pytestの方がエラー箇所のレポートがいい感じだったので乗り換えました。
あと@pytest.mark.parametrize
が便利そうだったので。
pytestについては以下のブログなどで。
- 参考
VimでPytestを使う設定
というわけで、Vimでテストを書いてvim-quickrunで走らせられるように以下の設定を行いました。
let g:quickrun_config['python.pytest'] = { \'command': 'py.test', \'cmdopt': '-s -v', \}
で、以下のテストを書いて
#!/usr/bin/env python # -*- coding: utf-8 -*- class TestMkLink(object): def test_something1(self): assert True
:QuickRun python.pytest
を実行した結果がこちら↓
import _frozen_importlib # frozen import imp # builtin import sys # builtin # installing zipimport hook # installed zipimport hook # (中略) # destroy io # destroy marshal # cleanup[3] wiping sys # cleanup[3] wiping builtins # destroy _frozen_importlib
(ひどい)
ちなみに、同じファイルで!py.test -s -v .
やcall system('py.test -s -v .')
では以下のように正常に走りますし、ターミナル上でも正常にテストできます。また、テストランナーにnoseを使ってもquickrunでは同様の現象にみまわれました。
============================= test session starts ============================== platform linux2 -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2 -- /usr/bin/python plugins: cov collecting ... collected 1 items test_mklink.py:16: TestMkLink.test_something1 PASSED =========================== 1 passed in 0.03 seconds ===========================
で色々試した結果、原因はテスト一行目のShebang (#!/usr/bin/env python
)でした。Shebangを削除すればテストできます。
よく考えたらpytestとそれを走らせるPythonのバージョンはコマンド実行時に決定されているはずなので、テストスクリプトにはShebangいらないですね。 とはいえテストかどうかでテンプレートを変えたりするのもアレなので、なんとなく探した結果QuickRunのオプションで設定できることがわかりました。
というわけで、以下の設定でpytestもnoseもquickrunで実行できるようになりました。
let g:quickrun_config['python.pytest'] = { \'command': 'py.test', \'cmdopt': '-s -v', \'hook/shebang/enable': 0, \}
ついでに以下のような設定を追加して、test*.py
のファイルを開いた時にfiletypeがpython.pytest
になるようにしています。
autocmd BufRead,BufNewFile test*.py set filetype=python.pytest
これでtest_something.py
などのファイルでは<Leader>r
でテストできるようになりました。
quickrunのoutputterで出力バッファのファイルタイプなどを指定して('outputter/buffer/filetype': 'nose_result'
)、シンタックスファイル(~/.vim/syntax/nose_result.vim
)を作って適当に色付けした結果、こんな感じになりました。