2017-10-31 11 views
0

파이썬으로 테스트하는 것이 처음인데 이것이 가능한지 확실하지 않습니다.Python Unit Tests 특정 지점까지 메서드 실행

입력을 받아들이는 비교적 긴 메소드가 있는데, 일부 처리가 데이터를 API로 보냅니다.

나는 입력 된 데이터를 테스트에 보내고 데이터를 처리하지만 API로 보내지는 테스트를 작성하려고합니다. 따라서 기본적으로 메소드 내에서 일정량 만 실행되지만 끝까지는 실행되지 않습니다.

불행히도 어디서부터 시작해야할지 모르겠습니다. 관련 샘플 코드를 실제로 제공 할 수 없습니다. 입력과 함께 메소드를 실행하고 출력을 지정하는 표준 단위 테스트 일 것입니다.

+2

제 의견으로는 테스트 할 코드 조각을 자신의 함수로 추출해야합니다. 그런 식으로 관심있는 부분을 테스트 할 수 있습니다. – byxor

답변

3

잘못된 접근 방법을 취하고 있습니다. 당신이하고 싶은 것은 당신의 외부 API 함수 호출로부터 고립 된 테스트를 실행하는 것이다. API 호출을 모의하기 만하면됩니다. 즉, mock 메소드로 대체 된 API 호출로 테스트를 실행하십시오. 테스트중인 코드를 변경할 필요가 없으며 패치 데코레이터를 사용하여 API 호출을 mock 객체로 바꿀 수 있습니다. unittest.mock 문서와 예제 here

unittest.mock은 매우 강력 참조하십시오, 그리고 위협 또는 적어도 조금 시작 부분에 수수께끼 조금 볼 수 있습니다. 문서에서 mock으로 할 수있는 일의 종류를 이해하는 데 시간을 투자하십시오. 여기에, (일부 테스트 코드 단위) possibilites 중 하나의 매우 간단한 예 :

@patch('myproject.db.api.os.path.exists') 
def test_init_db(self, mock_exists): 
    ... 
    # my mock function call will always returns False 
    mock_exists.return_value = False 

    # now calls to myproject.db.api.os.path.exists 
    # in the code under test act just like the db file does not exist 
    ... 

그래서 당신은 아마 쉽게 외부 API 호출 (모두 또는 그 중 일부)를 무시할 수 있습니다. 원하지 않으면 API 결과를 지정할 필요가 없습니다. 모의는 "플라스틱"동작을 나타냅니다.

모의 객체를 만들고 임의의 모의 메소드를 호출하는 경우 (정의하고 있지 않은 API 메소드를 생각해보십시오) 해당 객체는 정상적으로 실행되어 다른 모의 객체를 반환합니다. 즉, 아무 것도하지 않지만 클라이언트 코드는 마치 실행 한 것처럼 실행됩니다. 따라서 테스트를 실행하여 원하는 부분을 실제로 비활성화 할 수 있습니다.

+0

문제는 테스트하려는 것이 원치 않는 API를 호출하는 것이 아닙니다. 문제는 그들이 관심을 가지고있는 것이 실행하고 싶지 않은 다른 코드와 섞여 있다는 것입니다. – byxor

+1

이것이 OP가 찾고있는 접근법이지만 조롱에 대해 모른다고 생각합니다. – Holloway

+0

OP 질문에 대한 더 나은 설명을 위해 편집되었습니다. – progmatico

관련 문제