我试图为我正在构建的烧瓶应用程序编写一些单元测试,这是包含烧瓶应用程序的文件
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'hello world'
然后是包含测试的文件
tests.py
from unittest import TestCase, main
from app import app
from multiprocessing import Process
import requests
class Test(TestCase):
@classmethod
def setUpClass(cls):
cls.hostname = 'http://localhost:8000'
with app.app_context():
p = Process(target=app.run, kwargs={'port': 8000})
p.start()
cls.p = p
def test_options(self):
# print(self.p.is_alive()) # returns True but requests doesn't connect
result = requests.post(self.hostname).text
self.assertEqual(result, 'hello world')
@classmethod
def tearDownClass(cls):
cls.p.terminate() # works fine if i comment it out
pass
if __name__ == '__main__':
main()
我想出了一个想法,即使用requests
模块来测试应用程序,而不是烧瓶附带的test_client
。
根据我对unittest模块的理解,
调用setUpClass
方法一次,创建一个新进程并启动应用程序。
之后,我可以使用request.post
或request.get
自由运行各种测试。
然后在一天结束时,当所有测试都已运行时,tearDownClass
应该终止该过程。
当我尝试运行测试时,这就是我得到的(堆栈跟踪实际上比这更长,但这一切归结为此)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=5000): Max retries exceeded with url: / (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7faeeba183c8>: Failed to establish a new connection: [Errno 111] Connection refused',))
因为烧瓶过程没有启动,请求无法通过端口8000连接到localhost。
但奇怪的是,如果我评论cls.p.terminate
一切正常并且测试通过,唯一的问题是我不能再次杀死烧瓶过程。
我知道我可以使该过程守护进程或使用test_client
这样:
class Test(TestCase):
@classmethod
def setUpClass(cls):
cls.hostname = 'http://localhost:8000'
with app.app_context():
app.config['TESTING'] = True
cls.app = app.test_client()
def test_options(self):
# print(self.p.is_live())
result = self.app.get().data
self.assertEqual(result, b'hello world')
继续我的生活,但我真的想明白为什么我的代码在我试图摧毁测试套件时试图杀死这个过程时不起作用。
我尝试使用pdb
进行调试,但出于某种原因,当我尝试在pdb提示符下输入任何内容时,我不知道我的终端搞砸了(有些字母不是&# 39;当我输入时,t显示在终端中,但当我点击输入时,我发现字母实际上在那里但是不可见,例如输入print
我可能最终得到prrrinnnttt
因为{当我按下它们时{1}}和r
拒绝出现)
答案 0 :(得分:1)
我不知道你的情况发生了什么,但在我的一个项目中,我使用这样的bash脚本进行测试:
#!/bin/bash
set -eux
python app.py &
sleep 3
set +e
python tests.py
result=$?
kill $(ps aux | grep app.py | grep -v grep | awk '{print $2}')
exit $result
它处理启动服务器,运行测试,然后终止服务器,并且没有提到在python测试中处理服务器。