Có thể kiểm tra đơn vị để khẳng định rằng một phương thức gọi sys.exit ()


Câu trả lời:


155

Đúng. sys.exittăng SystemExit, vì vậy bạn có thể kiểm tra nó bằng assertRaises:

with self.assertRaises(SystemExit):
    your_method()

Các bản sao của SystemExitcó một thuộc tính codeđược đặt thành trạng thái thoát được đề xuất và trình quản lý ngữ cảnh được trả về assertRaisescó trường hợp ngoại lệ bị bắt là exception, vì vậy việc kiểm tra trạng thái thoát rất dễ dàng:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)

 

Tài liệu sys.exit :

Thoát khỏi Python. Điều này được thực hiện bằng cách nâng cao SystemExitngoại lệ ... nó có thể chặn nỗ lực thoát ra ở cấp độ bên ngoài.


3
+1, ngoại trừ việc nếu anh ấy muốn xác minh rằng nó gọi sys.exit(1)(trái ngược với, giả sử, sys.exit(0)) bạn cần thực sự khẳng định nó codelà 1. Tôi đoán bạn có thể làm điều đó với assertRaisesRegexp(SystemExit, '1')?
abarnert

Tôi chắc chắn rằng có một unittestphương thức cho phép bạn chuyển một ngoại lệ và một vị từ có thể gọi để chạy trên ngoại lệ hoặc các args của nó, thay vì chỉ một mẫu regex để chạy trên biểu diễn chuỗi của đối số đầu tiên của nó… nhưng tôi đoán là không. Có mô-đun kiểm tra nào khác mà tôi đang nghĩ đến không?
abarnert

1
+1, đối với việc kiểm tra mã lỗi, việc thực hiện đơn giản hơn nhiều chỉ: self.assertRaisesRegex( SystemExit, '^2$', testMethod ) Ít mã hơn, đủ đọc.
Marek Lewandowski

1
@MarekLewandowski - lỗi đánh máy. Phải làself.assertRaisesRegexp
Evgen

12

Đây là một ví dụ làm việc hoàn chỉnh. Mặc dù câu trả lời xuất sắc của Pavel, tôi đã mất một lúc để tìm ra điều này, vì vậy tôi đưa nó vào đây với hy vọng rằng nó sẽ hữu ích.

import unittest
from glf.logtype.grinder.mapping_reader import MapReader

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"

class TestMapReader(unittest.TestCase):

    def test_get_tx_names_incomplete_mapping_file(self):
        map_reader = MapReader()
        with self.assertRaises(SystemExit) as cm:
            tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
        self.assertEqual(cm.exception.code, 1)

3

Tôi đã tìm thấy câu trả lời cho câu hỏi của bạn trong tìm kiếm tài liệu Kiểm tra đơn vị Python cho "Kiểm tra ngoại lệ". Sử dụng ví dụ của bạn, bài kiểm tra đơn vị sẽ giống như sau:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

Hãy nhớ bao gồm tất cả các đối số cần thiết để kiểm tra chức năng của bạn.


1

Như một lưu ý bổ sung cho câu trả lời tuyệt vời của Pavel, bạn cũng có thể kiểm tra các trạng thái cụ thể nếu chúng được cung cấp trong chức năng bạn đang thử nghiệm. Ví dụ: nếu your_method()chứa thông tin sau sys.exit("Error"), có thể kiểm tra "Lỗi" cụ thể:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.