4

我正在编写 python 单元测试来测试需要作为另一个进程运行的 REST API。

REST 服务器是一个 tomcat 应用程序,我从 shell 调用它以在开发模式下运行,所以我希望在 python 测试中做的是:

  1. 启动服务器,服务器启动时返回。
  2. 运行单元测试
  3. 发送服务器Ctrl+D,使其正常关闭。

有没有办法为 python 使用单点入口,以便服务器启动和单元测试从一个 python 脚本调用中运行?

我已经查看了 python 中的 python 子进程和多线程,但我仍然不太明白如何从这里到达那里。

对于熟悉的人来说,这是我们正在开发的 Atlassian JIRA 插件,因此实际的 shell 命令是“atlas-run”。

4

1 回答 1

3

由于没有人提供任何代码来帮助解决这个问题,我会做如下的事情。结果pexpect非常强大,您不需要该signal模块。

import os
import sys
import pexpect

def run_server():
    server_dir = '/path/to/server/root'
    current_dir = os.path.abspath(os.curdir)

    os.chdir(server_dir)
    server_call = pexpect.spawn('atlas-run')
    server_response = server_call.expect(['Server Error!', 'Sever is running!'])
    os.chdir(current_dir)
    if server_response:
        return server_call #return server spawn object so we can shutdown later
    else:
        print 'Error starting the server: %s'%server_response.after
        sys.exit(1)

def run_unittests():
    # several ways to do this. either make a unittest.TestSuite or run command line
    # here is the second option
    unittest_dir = '/path/to/tests'
    pexpect.spawn('python -m unittest discover -s %s -p "*test.py"'%unittest_dir)
    test_response = pexpect.expect('Ran [0-9]+ tests in [0-9\.]+s') #catch end
    print test_response.before #print output of unittests before ending.
    return

def main():
    server = run_sever()
    run_unittests()
    server.sendcontrol('d') #shutdown server

if __name__ == "__main__":
    main()
于 2014-11-21T19:20:09.583 回答