2013-09-06 11 views
4

argparse 구현을위한 테스트 케이스를 작성하고 있습니다. 나는 '-h'기능을 테스트하려고합니다. 다음 코드는이를 수행합니다. 그러나 스크립트의 사용법도 출력합니다. 그걸 막을 방법이 있을까요?argparse unit tests : 도움말 메시지를 표시하지 않음

self.assertRaises(SystemExit, arg_parse_obj.parse_known_args, ['-h']) 

또한 예외 번호를 확인할 수 있습니까? 예를 들어, '-h'는 SystemExit : 0을 던집니다. 올바르지 않거나 불충분 한 args는 SystemExit : 2입니다. 숫자 코드를 확인하는 방법이 있습니까?

답변

12

예외 코드를 테스트 할 때는 self.assertRaises() as a context manager; 이것은 당신이 .code 속성 테스트시키는, 제기 예외에 액세스 할 수 있습니다 :

with self.assertRaises(SystemExit) as cm: 
    arg_parse_obj.parse_known_args(['-h']) 

exit_exception = cm.exception 
self.assertEqual(the_exception.code, 0) 

'억제'으로 또는 출력을 테스트, 당신도 sys.stdout 또는 argparse 출력에 따라 sys.stderr (도움을 캡처해야합니다 텍스트는 stdout). 내가 여기에 상황에 맞는 매니저를 중첩,하지만 당신은 또한 하나 개의 라인으로 그들을 결합 할 수 있습니다 파이썬 2.7과 새로운

with self.assertRaises(SystemExit) as cm: 
    with capture_sys_output() as (stdout, stderr): 
     arg_parse_obj.parse_known_args(['-h']) 

exit_exception = cm.exception 
self.assertEqual(the_exception.code, 0) 

self.assertEqual(stderr.getvalue(), '') 
self.assertEqual(stdout.getvalue(), 'Some help value printed') 

;

from contextlib import contextmanager 
from StringIO import StringIO 

@contextmanager 
def capture_sys_output(): 
    capture_out, capture_err = StringIO(), StringIO() 
    current_out, current_err = sys.stdout, sys.stderr 
    try: 
     sys.stdout, sys.stderr = capture_out, capture_err 
     yield capture_out, capture_err 
    finally: 
     sys.stdout, sys.stderr = current_out, current_err 

및 이들를 사용 : 당신은 그것을 위해 컨텍스트 관리자를 사용할 수 있습니다 이것은 서둘러 79 문자 제한을 초과하는 경향이 있지만. ['-h'] 사용에

+0

나는'with '가 연속 대괄호를 허용한다고 생각하지만 그렇지 않다. 그래서 (with a really_long_expression as a really_really_long_expression b) suite와 같은 일을 할 수 없다. – Bakuriu

+1

@Bakuriu : 백 슬래시를 사용해야합니다. –

+0

계속하려면 백 슬래시를 사용하는 것이 싫습니다. 나는 미래에 그들이 괄호를 허용하기를 바랍니다. 내가 볼 수있는 유일한 문제는 문법을'with (, , ...) :'(as를 사용하지 않고) 허용하면 중첩 된 컨텍스트 관리자를 사용하거나 컨텍스트 관리자로 자체 튜플 (이해가되지 않는다 ...). – Bakuriu

0

일부 변화는 다음과 같습니다

parser.print_help() # formats the help, prints it and exits 
parser.format_help() # format the help without printing or exit 
parser.exit # can be modified to not exit, such as for a parser subclass 
parser.error # default print usage and call parser.exit 

이는 공개 API의 일부입니다.

argparse 테스트 파일 (test_argparse.py)도 테스트 방법에 대한 아이디어를 제공합니다. 많은 테스트에서는 error 메서드를 사용하는 ArgumentParser 하위 클래스를 사용합니다.

1

는 모의 이렇게 당신에게 마티 피에 터스 '대답과 동일한 기능을 허용하지만, 자신의 함수를 작성하지 않고 수 :

from unittest.mock import MagicMock, patch 

argparse_mock = MagicMock() 
with patch('argparse.ArgumentParser._print_message', argparse_mock): 
    with self.assertRaises(SystemExit) as cm: 
     arg_parse_obj.parse_known_args(['-h']) 

패치도 장식으로 작동합니다. argparse 인쇄를 억제해야하는 몇 가지 인스턴스가있는 경우 데코레이터로 처리하고 여러 중첩 된 문을 사용하지 않아도됩니다.

관련 문제