Câu hỏi liên quan

Chuyển đổi Python 3 ResourceWarnings thành ngoại lệ


0 Phiếu
Đã hỏi 24/5/2016 bởi IsLiao (230 điểm)
Có một cách để buộc một Python 3 unittest để thất bại, chứ không phải là chỉ đơn giản là in một cảnh báo cho stderr, nếu nó gây ra bất kỳ ResourceWarning? Tôi đã cố gắng sau:
import warnings
warnings.simplefilter(action='error', category=ResourceWarning)
mà kết quả trong output này từ unittest:
my_test (__main__.MyTest) ... Exception ignored in: <socket.socket fd=9, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 54065), raddr=('127.0.0.1', 27017)>
ResourceWarning: unclosed <socket.socket fd=9, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 54065), raddr=('127.0.0.1', 27017)>
ok
----------------------------------------------------------------------
Ran 1 test in 0.110s
lưu ý thông báo "Bỏ qua ngoại lệ". Tôi đã thay vì test không thành công, thay vì yêu cầu tôi để đọc output của nó tìm kiếm ResourceWarnings.

3 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi xrrMind (1,270 điểm)
 
Câu trả lời hay nhất
Dưới đây là một test unit không thành công nếu ResourceWarning được tạo ra bởi code trong with catch_warning() tuyên bố:
#!/usr/bin/env python3
import gc
import socket
import unittest
import warnings
class Test(unittest.TestCase):
    def test_resource_warning(self):
        s = socket.socket()
        ####s.close() #XXX uncomment to pass the test
        # generate resource warning when s is deleted
        with warnings.catch_warnings(record=True) as w:
            warnings.resetwarnings() # clear all filters
            warnings.simplefilter('ignore') # ignore all
            warnings.simplefilter('always', ResourceWarning) # add filter
            del s        # remove reference
            gc.collect() # run garbage collection (for pypy3)
            self.assertFalse(w and str(w[-1])) # test fails if there
                                               # are warnings
if __name__=="__main__":
    unittest.main()
Đã bình luận 06/6/2016 bởi abj3055 (110 điểm)
Làm thế nào về cách sử dụng 'warnings.catch_warnings' bối cảnh quản lý được mô tả trong phần [29.5.4. Thử nghiệm cảnh báo] (https://docs.python.org/3/library/warnings.html#testing-warnings)?
Đã bình luận 06/6/2016 bởi Working (100 điểm)
Tôi đã đọc câu trả lời của Daniel trước khi gửi bài nhưng tôi không chắc chắn không có gì nhiều hơn để các chủ đề. Đặc biệt, câu trả lời của ông dựa trên phân tích của ' ngoại trừ bỏ qua: (...) ' mà tôi tin là kết quả của việc sử dụng * simplefilter * với 'hành động-' lỗi '' của bạn. Nó không có nghĩa là không thể có một cách khác để có được giữ trên cảnh báo, sẽ không chuyển tiếp vào chuyển đổi chúng để trường hợp ngoại lệ như vậy, tránh các hành vi đáng tiếc của 'PyErr _ WriteUnraisable'.
Đã bình luận 06/6/2016 bởi yust_Worki (100 điểm)
@ PiotrDobrogost - cảm ơn bạn làm cho tôi nhận thức của 'warnings.catch_warnings'. Trông giống như một cách tuyệt vời để giải quyết vấn đề này.
0 Phiếu
Đã trả lời 04/6/2016 bởi Reemit (190 điểm)
Thật không may, nó không xuất hiện để được có thể. Rằng "bỏ qua ngoại lệ:" thông điệp được sản xuất bởi CPython function PyErr_WriteUnraisable trong Python/errors.c. Bình luận trước đó function nói:
/* Call when an exception has occurred but there is no way for Python
   to handle it.  Examples: exception in __del__ or during GC. */
ResourceWarning thực sự đang được tạo ra trong bộ sưu tập garbage và Python in một tin nhắn vì nó không có một cách để nâng cao một exception vào thời điểm đó. Điều này đã làm với việc thực hiện CPython lõi và không có gì là unittest mà có thể làm để ghi đè lên nó. Cập Nhật : trong khi ở trên một phân tích kỹ thuật chính xác, có một cách tiếp cận thực sự sẽ giải quyết vấn đề của OP. Xem câu trả lời bởi J.F. Sebastian cho biết thêm chi tiết.
Đã bình luận 06/6/2016 bởi Boris (810 điểm)
Không, tôi đã cố gắng đó. Daniel Harding đã chỉ ra dưới đây tại sao ResourceWarnings đặc biệt và không thể phát hiện những cách bình thường.
0 Phiếu
Đã trả lời 04/6/2016 bởi eutonhow (140 điểm)
Câu trả lời của tôi là sai - tôi quên rằng warnings.catch_warnings có thể đối phó với điều này (mà là kinda lúng túng, vì tôi đã giúp viết điều: http://bugs.python.org/issue3781 )

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...