Python/Flask 单元测试,抑制 Broken Pipe 错误 32
Python/Flask Unittest, suppress Broken Pipe Error 32
当 运行 单元测试时,我经常得到 error: [Errno 32] Broken pipe
。这似乎是在测试期间发生的无害错误,但我无法阻止或以其他方式抑制它。
我尝试过的一些事情包括将 SIGPIPE
处理更改为 SIG_DFL
和 运行 使用 threaded=True
的应用程序。如果我要 try/except
我不知道要包装哪个代码,因为这是在单元测试的上下文中。
我不关心 catching/preventing 这个错误,只是在所有其他测试完成时抑制它的输出 运行。我还应该尝试什么?
编辑:
下面是一些经常但并不总是导致错误的示例代码:
def test_register(self):
self.driver.get(self.get_server_url() + url_for(u'register'))
body = self.driver.find_element_by_id(u'body')
username_input = body.find_element_by_id(u'username')
username_input.send_keys(self.USER1_DISPLAY_USERNAME)
privacy_policy = body.find_element_by_id(u'privacy_policy')
privacy_policy.click()
#NOTE: not shown - more lines filling out form elements exactly like the above lines
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
register_button = body.find_element_by_id(u'onclick-register')
register_button.click()
下面是错误消息的示例:
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 44668)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 599, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 657, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 716, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
这似乎只发生在集成测试中。我正在使用 Selenium 和 LiveServerTestCase
,LIVESERVER_PORT
端口设置为 8943
。错误消息中提到的端口 44668
看起来很可疑。
我的问题听起来和 Suppress print output in unittests 完全一样,但是 none 这些解决方案有效。
我通过重定向 stderr
和 stdout
找到了解决方案。
在create_app()
中添加以下内容:
_stderr, _stdout = sys.stderr, sys.stdout
null = open(os.devnull,'wb')
sys.stdout = sys.stderr = null
当 运行 单元测试时,我经常得到 error: [Errno 32] Broken pipe
。这似乎是在测试期间发生的无害错误,但我无法阻止或以其他方式抑制它。
我尝试过的一些事情包括将 SIGPIPE
处理更改为 SIG_DFL
和 运行 使用 threaded=True
的应用程序。如果我要 try/except
我不知道要包装哪个代码,因为这是在单元测试的上下文中。
我不关心 catching/preventing 这个错误,只是在所有其他测试完成时抑制它的输出 运行。我还应该尝试什么?
编辑:
下面是一些经常但并不总是导致错误的示例代码:
def test_register(self):
self.driver.get(self.get_server_url() + url_for(u'register'))
body = self.driver.find_element_by_id(u'body')
username_input = body.find_element_by_id(u'username')
username_input.send_keys(self.USER1_DISPLAY_USERNAME)
privacy_policy = body.find_element_by_id(u'privacy_policy')
privacy_policy.click()
#NOTE: not shown - more lines filling out form elements exactly like the above lines
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
register_button = body.find_element_by_id(u'onclick-register')
register_button.click()
下面是错误消息的示例:
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 44668)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 599, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 657, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 716, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
这似乎只发生在集成测试中。我正在使用 Selenium 和 LiveServerTestCase
,LIVESERVER_PORT
端口设置为 8943
。错误消息中提到的端口 44668
看起来很可疑。
我的问题听起来和 Suppress print output in unittests 完全一样,但是 none 这些解决方案有效。
我通过重定向 stderr
和 stdout
找到了解决方案。
在create_app()
中添加以下内容:
_stderr, _stdout = sys.stderr, sys.stdout
null = open(os.devnull,'wb')
sys.stdout = sys.stderr = null