我正在寻找一种优雅的解决方案,用于使用子命令和多个选项来自动化命令行工具的测试。到目前为止,我能找到的最接近的是 Mercurial 的测试基础设施:
run_tests.py 脚本可以统一运行shell脚本测试、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应该有什么等价的呢?
我可能会使用现代 python 推出我自己的简化版 run_tests.py,但是,在我这样做之前,我想知道是否有更好的现有解决方案来避免重新发明轮子。
我需要的是:
- 单独运行一系列 shell 命令的隔离环境
- 检查命令输出和退出状态的能力
- 最好提供一些回调或钩子以对某些测试(具有副作用的命令)进行进一步验证。
如果您有任何经验可以分享或对此有任何建议,请告诉我。