現象
gaugeで以下のようなエラーが出ることがあった。
困ったことにStacktraceに何も出力されないので意味がわからない。
(venv) gauge-tests-py > gauge run
Python: 3.7.6
Error Message: error reading from server: read tcp 127.0.0.1:56868->127.0.0.1:56867: wsarecv: An existing connection was forcibly closed by the remote host.
Stacktrace:
Error Message: Runner is not Alive
Stacktrace:
Successfully generated html-report to = ...(以下省略)
解決方法
今回は、テストコードを記述したstep_impl.py
の読み込み時にインポートエラーが出ていたのが原因だった。
step_impl.py
ファイルの冒頭などでimport hoge
などとしているが、タイポなどでこれが失敗すると、上記のようなStacktraceなしのエラーになってしまう。
エラーがあったら原因箇所を特定しやすいように、以下のようにimport時例外を出力するようにした。
# gauge run からのインポートエラー時、何もでなくて困るので、try-except
try:
from getgauge.python import step, before_scenario, Messages
import sys
import os
import traceback
import hoge
except Exception as e:
print(traceback.format_exc())
raise e
# --------------------------
# Gauge step implementations
# --------------------------
@step("何かする")
def do_something():
hoge.do_something()
...
これは本件とは直接関係ないが、gaugeは、実行時にstep_impl
とvenv
等のpython環境内のパッケージしか見てくれないようで、テストコード内から、別ディレクトリにあるテストコード以外のソースを参照したい場合、sys.path
に参照先ディレクトリを追加しておく必要がある。
たとえば、ディレクトリ構造が以下のようなとき...
hoge_src/
hoge/
__init__.py
gauge_tests/
step_impl
step_impl.py
gauge_tests/
をワークディレクトリとしてgauge run
する前提で、step_impl.py
から正しくimport hoge
するには、以下のようにする必要がある。
# gauge run からのインポートエラー時、何もでなくて困るので、try-except
try:
from getgauge.python import step, before_scenario, Messages
import sys
import os
import traceback
# gaugeは、分散したコードまで見てくれないのでソースパスを追加
sys.path.append(os.path.join('..', 'hoge_src'))
import hoge
except Exception as e:
print(traceback.format_exc())
raise e
# --------------------------
# Gauge step implementations
# --------------------------
@step("何かする")
def do_something():
hoge.do_something()
...