단위 테스트가 메서드가 sys.exit ()를 호출한다고 주장 할 수 있습니까?


98

가끔 호출하는 python 2.7 메서드가 있습니다.

sys.exit(1) 

올바른 조건이 충족 될 때이 코드 줄이 호출되는지 확인하는 단위 테스트를 만들 수 있습니까?


답변:


155

예. sys.exit발생 SystemExit하므로 다음으로 확인할 수 있습니다 assertRaises.

with self.assertRaises(SystemExit):
    your_method()

의 인스턴스 에는 제안 된 종료 상태로 설정된 SystemExit속성 code이 있고에서 반환 된 컨텍스트 관리자 assertRaises에는으로 포착 된 예외 인스턴스가 exception있으므로 종료 상태를 쉽게 확인할 수 있습니다.

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

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

 

sys.exit 문서 :

Python을 종료합니다. 이것은 SystemExit예외 를 발생시킴으로써 구현됩니다 . 외부 수준에서 출구 시도를 가로 챌 수 있습니다.


3
+1, 그가 호출하는지 확인하려는 경우 sys.exit(1)(예 :라고하는 것과는 반대로 sys.exit(0)) 실제로 1이라고 주장해야 한다는 점을 제외하고는 다음 과 같이 code할 수 있습니다. assertRaisesRegexp(SystemExit, '1')?
abarnert

첫 번째 인수의 문자열 표현에서 실행 되는 정규식 패턴 이 아닌 unittest예외와 호출 가능한 조건 자를 전달 하여 예외 또는 인수에서 실행할 수 있는 메서드가 있다고 확신했습니다 .하지만 그렇지 않은 것 같습니다. 내가 생각하고있는 다른 테스트 모듈이 있습니까?
abarnert 2013 년

1
+1, 오류 코드 검사에 관해서는 훨씬 간단합니다 self.assertRaisesRegex( SystemExit, '^2$', testMethod ) . 코드가 적고 충분히 읽을 수 있습니다.
Marek Lewandowski 2011

1
@MarekLewandowski-오타. 이어야합니다self.assertRaisesRegexp
Evgen

12

여기에 완전한 작동 예가 있습니다. Pavel의 훌륭한 답변에도 불구하고 이것을 알아내는 데 시간이 걸렸으므로 도움이 될 것이라는 희망으로 여기에 포함했습니다.

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

"예외 테스트" 에 대한 Python 단위 테스트 문서 검색 에서 질문에 대한 답을 찾았습니다 . 예제를 사용하면 단위 테스트는 다음과 같습니다.

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

함수를 테스트하는 데 필요한 모든 인수를 포함해야합니다.


1

Pavel의 탁월한 답변에 대한 추가 메모로 테스트중인 기능에서 제공되는 경우 특정 상태를 확인할 수도 있습니다. 예를 들어 your_method()다음 sys.exit("Error")이 포함 된 경우 "오류"를 구체적으로 테스트 할 수 있습니다.

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.