我正在编写python单元测试,测试需要作为另一个进程运行的REST API。
REST服务器是一个tomcat应用程序,我从shell调用它以开发模式运行,所以我在python测试中要做的是:
有没有办法为python使用单一入口点,以便服务器启动并且单元测试从一个python脚本调用中运行?
我在python中查看python子进程和多线程,但我还是不太清楚如何从这里到达那里。
对于那些熟悉的人来说,这是我们正在开发的Atlassian JIRA插件,所以实际的shell命令是" atlas-run"。
答案 0 :(得分: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()