Tôi có một phương thức python 2.7 đôi khi gọi
sys.exit(1)
Có thể thực hiện một bài kiểm tra đơn vị để xác minh dòng mã này được gọi khi đáp ứng các điều kiện thích hợp không?
Tôi có một phương thức python 2.7 đôi khi gọi
sys.exit(1)
Có thể thực hiện một bài kiểm tra đơn vị để xác minh dòng mã này được gọi khi đáp ứng các điều kiện thích hợp không?
Câu trả lời:
Đúng. sys.exit
tă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 SystemExit
có 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ề assertRaises
có 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)
Thoát khỏi Python. Điều này được thực hiện bằng cách nâng cao
SystemExit
ngoại lệ ... nó có thể chặn nỗ lực thoát ra ở cấp độ bên ngoà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ó code
là 1. Tôi đoán bạn có thể làm điều đó với assertRaisesRegexp(SystemExit, '1')
?
unittest
phươ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?
self.assertRaisesRegex( SystemExit, '^2$', testMethod )
Ít mã hơn, đủ đọc.
self.assertRaisesRegexp
Đâ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)
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.
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")