Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

Pytestをvim-quickrunで走らせようとしたらハマった

PytestPythonのテストランナーです。今までは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)を作って適当に色付けした結果、こんな感じになりました。

f:id:h-miyako:20140613001106p:plain