我正在寻找一个优雅的解决方案,用于使用子命令和多个选项自动化命令行工具的测试。到目前为止,我能找到的最接近的是Mercurial的testing infrastructure:
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版本,但在此之前,我想知道是否有更好的现有解决方案以避免重新发明轮子。
我需要的是:
如果您有任何经验可以分享或有任何建议,请告诉我。