toxからbatsを使ってPythonのバージョンを変えながらシェルスクリプトでテストする際のエラー

こんにちは. この前リリースしたPythonで使えるツールのshape_commentatorの評判が良く,最近はCIでPyPIにパッケージをアップロドする設定を書いたりしてCIとわいわい遊んでいます.

shiba6v.hatenablog.com

tox と bats

テストには,doctestに加えてbats を利用しています.これは,シェルスクリプト でテストを書けるツールで,今回のようなファイルを直接出力するなどPythonのコードよりもシェルスクリプトでテストを書きたいようなもののテストに適していると思い,導入しました.

shape_commentatorは,過去の数値計算のコードを読み解くツールとして有用になる可能性があるため,様々なPythonのバージョンでテストしておきたいという気持ちがあります.Pythonの様々なバージョンでのテストと言えばtoxですが,これはvirtualenvを使って様々なバージョンのPythonに対してテストを行うツールです.

tox.iniの書き方

tox.iniからbatsを呼ぶために,このようにtox.iniを書きました.

[tox]
envlist = py36
[testenv]
deps = numpy
whitelist_externals = bats
commands = bats --tap tests/test_all.bats

気をつける点

注意点は以下の2点です. 1. toxからbatsのような外部コマンドを呼ぶには,whitelist_externalsに書く必要があります. 2. batsを直接ターミナルから呼び出さない場合にあたるので,--tapオプションを付けます.

1をやらないと,

WARNING: test command found but not installed in testenv
  cmd: /usr/local/bin/bats
  env: /Users/xxxxxx/shape_commentator/.tox/py36
Maybe you forgot to specify a dependency? See also the whitelist_externals envconfig setting.

といったエラーが出ます. toxのcommandsからpython以外のコマンド(bats)を呼び出しているために出るエラーです.

2をやらないと,

tput: No value for $TERM and no -T specified
ERROR: InvocationError for command '/usr/local/bin/bats tests/test_all.bats' (exited with code 2)

といったエラーが出ます. toxからbatsを実行すると,batsが利用しているtputコマンドから出るエラーです.

まとめると,tox.iniでbatsを実行する際は,whitelist_externals--tapを書きましょうということです.