1

我正在寻找一种优雅的解决方案,用于使用子命令和多个选项来自动化命令行工具的测试。到目前为止,我能找到的最接近的是 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,但是,在我这样做之前,我想知道是否有更好的现有解决方案来避免重新发明轮子。

我需要的是:

  1. 单独运行一系列 shell 命令的隔离环境
  2. 检查命令输出和退出状态的能力
  3. 最好提供一些回调或钩子以对某些测试(具有副作用的命令)进行进一步验证。

如果您有任何经验可以分享或对此有任何建议,请告诉我。

4

0 回答 0