サブコマンドと複数のオプションを使用してコマンド ライン ツールのテストを自動化するための洗練されたソリューションを探しています。これまでのところ、私が見つけることができる最も近いものは、Mercurial のテスト インフラストラクチャです。
run_tests.py スクリプトは、シェル スクリプト テスト、Python テストを統一された方法で実行できます。テストの検証は、主にコマンドの出力を定義済みのものと比較し、コマンドの終了ステータスを確認するためのものです。
ただし、mercurial で run_tests.py のソースを確認したところ、年月の進化で複雑になりすぎており、Mercurial は Python 2.4-2.7 用に設計されているため、2.5 以降の新機能は使用されておらず、コードが少し古くなっています。 、実際のすべてのコマンド実行は、自家製のPopen4にラップされます。
processlock = threading.Lock()
closefds = os.name == 'posix'
def open4(cmd, wd, timeout):
processlock.acquire()
p = subprocess.Popen(cmd, shell=True, bufsize=-1, cwd=wd,
close_fds=closefds,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
processlock.release()
p.fromchild = p.stdout
p.tochild = p.stdin
p.childerr = p.stderr
p.timeout = False
if timeout:
def t():
start = time.time()
while time.time() - start < timeout and p.returncode is None:
time.sleep(.1)
p.timeout = True
if p.returncode is None:
terminate(p)
threading.Thread(target=t).start()
return p
現在、新しいバージョンでは fromchild や tochild のような属性さえありません。最新の python と同等のものは何ですか?
単純化された独自のバージョンの run_tests.py を最新の python でロールバックすることもできますが、その前に、車輪の再発明を避けるためのより良い既存のソリューションがあるかどうかを知りたいと思います。
私が必要とするのは:
- 一連のシェル コマンドを個別に実行するための隔離された環境
- コマンド出力と終了ステータスをチェックする機能
- 一部のテスト (副作用のあるコマンド) をさらに検証するために、いくつかのコールバックまたはフックを提供することをお勧めします。
共有できる経験やこれに関する提案があればお知らせください。