Python/Flask Unittest, подавление ошибки Broken Pipe 32

При запуске юнит-тестов я часто получаю error: [Errno 32] Broken pipe. Кажется, это безобидная ошибка, которая возникает во время тестирования, но я не смог предотвратить или иным образом подавить ее.

Некоторые вещи, которые я пробовал, включают изменение обработки SIGPIPE на SIG_DFL и запуск приложения с threaded=True. Если бы я был try/except, я не знаю, какой код обернуть, так как это в контексте модульного тестирования.

Меня не волнует отлов/предотвращение ошибки, а просто подавление ее вывода, пока все остальные тесты завершают работу. Что еще я должен попробовать?

Редактировать:

Вот пример кода, который часто, но не всегда приводит к ошибке:

  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 в сообщении об ошибке выглядит подозрительно.

Моя проблема звучит точно так же, как Подавить вывод на печать в модульных тестах, но ни одно из этих решений не работает.


person thekthuser    schedule 29.07.2020    source источник
comment
Какой самый простой тест (и код) вы можете придумать, чтобы продемонстрировать проблемы? Разместите это.   -  person Dave W. Smith    schedule 29.07.2020


Ответы (1)


Я нашел решение, перенаправив stderr и stdout.

В create_app() добавьте следующее:

_stderr, _stdout = sys.stderr, sys.stdout                                                           
null = open(os.devnull,'wb')                                                     
sys.stdout = sys.stderr = null
person thekthuser    schedule 05.08.2020