Python/Flask Unittest, menekan Kesalahan Pipa Rusak 32

Saat menjalankan unittests saya sering mendapatkan error: [Errno 32] Broken pipe. Tampaknya ini adalah kesalahan tidak berbahaya yang terjadi selama pengujian, namun saya belum dapat mencegah atau menekannya.

Beberapa hal yang saya coba termasuk mengubah penanganan SIGPIPE menjadi SIG_DFL dan menjalankan aplikasi dengan threaded=True. Jika saya ke try/except saya tidak tahu kode mana yang harus dibungkus karena ini dalam konteks pengujian unit.

Saya tidak peduli untuk menangkap/mencegah kesalahan, saya hanya menekan keluarannya sementara semua pengujian lainnya selesai berjalan. Apa lagi yang harus saya coba?

Sunting:

Berikut beberapa contoh kode yang sering, namun tidak selalu menghasilkan error:

  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()

Dan berikut contoh pesan errornya:

----------------------------------------
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
----------------------------------------

Hal ini tampaknya hanya terjadi dengan tes integrasi. Saya menggunakan Selenium dan LiveServerTestCase dengan port LIVESERVER_PORT disetel ke 8943. Penyebutan port 44668 dalam pesan kesalahan terlihat mencurigakan.

Masalah saya terdengar persis seperti Menekan keluaran cetak di unittests tetapi tidak ada solusi yang berhasil.


person thekthuser    schedule 29.07.2020    source sumber
comment
Tes (dan kode) paling sederhana apa yang dapat Anda lakukan untuk menunjukkan masalahnya? Posting itu.   -  person Dave W. Smith    schedule 29.07.2020


Jawaban (1)


Saya menemukan solusi dengan mengalihkan stderr dan stdout.

Di create_app() tambahkan yang berikut ini:

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