私の目標は、小さな *.bat スクリプトを介して Python スクリプト (いくつかの単体テストを実行する) を実行することです。*.bat スクリプトは、python スクリプトの終了ステータスも受け取る必要があります。しかし、*.py ファイルの終了ステータスが正しく送信されていないようです。
私のtestit.py:
execute_some_unittests()
...
if success:
sys.exit(1)
else:
sys.exit(2)
# End of the script
私のtest.bat:
python C:\testit.py
echo %ERRORLEVEL%
execute_some_unittests() で実行する単体テストに応じて、test.bat を実行すると 1、2、または 0 になります!!! コードが sys.exit(1) に到達することは絶対に確信していますが(すべてをログに記録しているため)、それでも(テストされるユニットテストによっては)うまくいきません。
私の推測では、単体テストを実行すると、終了コードとマージされて (8 ではなく) 16 ビットの終了コードのような UNIX が生成されるいくつかのフラグが設定され、cmd が私の終了コードを多少切り捨てていると思います...
備考:
- 上記のコードは、ブロックを除いて、try 内にありません
- sys.exit(1) を os._exit(1) に置き換えても役に立たない
私はこの問題に2日間取り組んでおり、すべてのアイデアに感謝しています...
私はWin7、python 2.6、モジュールを使用しています:unittest、doctest、sys、os
更新:完全に機能する例を求められました:
test.py:
import unittest
from scipy.interpolate import interp1d
class Test(unittest.TestCase):
def test_basic(self):
self.failUnlessEqual(1, 1)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Test)
unittest.TextTestRunner(verbosity=2).run(suite)
import sys
sys.exit(42)
test.bat:
python C:\test.py
echo %ERRORLEVEL%
結果: エラーレベル 0 (import scipy.interpolate がなければ 42 になりますが、この問題を引き起こすモジュールは scipy だけではありません)