실제로 API 클라이언트를 단위 테스트 할 가치가 있습니까?


38

이것은 지금 당장 저를 괴롭힌 일입니다. 실제로 API 클라이언트를 단위 테스트 할 가치가 있습니까?

petshop REST API에 대한 호출을 추상화하기 위해 작은 클래스를 작성한다고 가정 해 봅시다. petshop은 매우 간단한 API이며 기본 메소드 세트가 있습니다.

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

이를 테스트 할 때 모의 서비스를 만들거나 응답을 모의해야합니다. 그러나 그것은 과도한 것으로 보인다. 우리는 메소드가 오타 / 구문 오류를 통해 작동을 멈추지 않기를 원하지만 원격 메소드를 호출하는 함수를 작성하고 해당 원격 메소드에서 가짜 응답을 생성하기 때문에 다음과 같이 보입니다. 노력의 낭비와 우리는 실제로 실패 할 수없는 것을 테스트하고 있습니다. 더 나쁜 것은 원격 방법이 변경되면 생산 사용이 실패하는 동안 단위 테스트가 통과한다는 것입니다.

나는 무언가를 잃어 버렸거나 막대기의 끝이 잘못되었거나 나무의 나무를 보지 못하고 있다고 확신합니다. 누군가 나를 올바른 길로 인도 할 수 있습니까?


1
이것이 기본 메소드가있는 간단한 API가 아닌 경우 다른 느낌이 있습니까? 창고조차도 눈에 맞서야합니다.
JeffO

답변:


31

원격 API 클라이언트의 역할은 특정 호출을 발행하는 것입니다. 따라서 테스트를 통해 해당 호출을 발행하는지 확인해야합니다.

API 제공자가 응답의 의미를 변경하면 시스템이 프로덕션에 실패합니다. 그러나 이것은 클라이언트 클래스의 잘못이 아닙니다. 그것은 통합 테스트에서만 잡힐 수있는 것입니다. 통제 할 수없는 코드에 의존함으로써 내부 테스트를 통해 정확성을 검증 할 수있는 기능을 포기했습니다. 이는 트레이드 오프였으며 이는 가격입니다.

즉, 복잡한 오류의 위험이 상대적으로 적기 때문에 다른 클래스에 대한 위임으로 만 구성된 클래스를 테스트하는 것이 우선 순위가 낮을 수 있습니다. 그러나 이것은 균일 한 원 라이너로만 구성된 모든 클래스에 적용되며 다른 공급 업체의 코드를 호출하는 것과는 아무런 관련이 없습니다.


음, 잘 모르겠습니다. 당신은 그 테스트 할 수 있습니다 foo()전에 호출되는 bar(),하지만 평균 호출을하지 않습니다 foo()하기 전에 bar()할 수있는 올바른 것입니다; 코드가 잘못 되더라도 이와 같은 단위 테스트는 통과합니다. 그리고 그것이 모든 클라이언트가하는 일이라면, foo()이전 bar()에 호출 되었는지 확인하는 모의 객체를 설정하는 것은 클라이언트 코드를 한 눈에 볼 수있는 것으로 까다로울 수 있습니다.
Doval

1
add()메소드가 두 개의 숫자를 올바르게 추가하는지 테스트 할 수 있지만, 이것이 알고리즘에서이 시점에 추가하는 것이 옳은 것을 의미하지는 않습니다 add(). 프로그램이 잘못 되었더라도 단위 테스트는 성공할 것입니다. 이 경우 이다 잘못된 것은, 당신의 levenshteinDistance()방법이 아닌, 비난하는 것입니다 add()방법. 이것은 정확히 동일합니다. 코드를 메소드로 분리하는 요점은 항상 각 메소드가 가지만 올바르게 처리해야한다는 것입니다.
Kilian Foth

3
이제 우리가 동의하지 않는 곳을 봅니다! 외부 애완 동물 상점에 의존하는 경우 이는 시스템이 HTTP 경계에서 끝나므로 발행 된 REST 호출 출력되고 테스트 대상이됩니다. 이 모듈의 애완 동물 상점 부분을 고려한다면, 그렇습니다. 발행 된 호출의 패턴은 구현 세부 사항이며 단위 테스트는 그들에 대해 아무것도 처방하지 않습니다.
Kilian Foth

2
"그러므로 테스트를 통해 해당 통화를 발행하는지 확인해야합니다."이것이 내가 보지 못한 관점이라고 생각합니다. 감사!
필립 B 올덤

1
예를 들어 내 단위 테스트는 특정 매개 변수가 주어진 요청의 본문이 올바른지 확인할 수 있습니까?
마리아 Ines Parnisari

9

짧은 답변:

모든 방법은 단위 테스트를 거쳐야합니다.

긴 대답 :

예. 그만한 가치가 있습니다.

다음은 API 호출 메소드에서 테스트해야 할 단위 테스트입니다.

  • API 호출에 올바른 형식 또는 올바른 매개 변수를 전달하고 있습니다.
  • 예를 들어 API가 빈 문자열을 반환 할 때 메서드가 기본값을 반환 해야하는 경우와 같이 API에서 반환 한 특정 유형의 데이터 (모의 여부에 따라)에 따라 응답합니다.
  • API 호출에서 오류가 발생할 때 호출자 메소드가 올바르게 작동 함

API 서비스를 조롱하는 고립 된 메소드가 호출되는 메소드이며 API를 호출하는 클라이언트 코드의 오류로 인해 오류가 발생하지 않도록합니다.


"mocked or not"이라고 말하면 ... 실제 API에 대해 테스트해도 괜찮습니까? 단위 테스트처럼 보이더라도 통합 테스트라고 부를 수 있습니까? 아니면 이것을 부를 다른 것이 있습니까? 내 API 래퍼가 어떻게 작동하는지 테스트하고 싶습니다.
Dan Rosenstark

1
@ DanRosenstark API 서비스가 조롱되지 않는 경우 통합 테스트라고 생각합니다.
Tulains Córdova

API를 실제로 호출 할 때 데이터를 올바르게 가져 오면 5 초 안에 알고 있지 않습니까? API 모의는 실제 호출이 아니기 때문에 API를 변경하면 실패하는 유일한 방법입니다.이 경우 모의 테스트는 통과하지만 실제 호출은 실패합니다. 무의미 ​​해 보인다
MattE

5

제한된 통합 테스트와 같이 시스템의 입력 및 출력을 테스트하기 때문에 단위 테스트가 아닙니다.

"노력을 낭비하는 것처럼 보이며 실제로 실패 할 수없는 것을 테스트하고 있습니다" 라고 말할 때는 매우주의해야합니다. 실패 할 수 있습니다. 실패 할 수 있습니다. 테스트를하지 않으면 실패가 더 악화됩니다.

여기서 실수는 바퀴의 발명과 관련이 있습니다. 원격 서비스 및 API를 호출하는 것은 매우 일반적인 시나리오이므로이를 테스트하는 데 도움이되는 훌륭한 도구가 있습니다. 마지막으로 원격 서비스에 연결된 응용 프로그램을 작업 할 때 SoapUI를 사용 했습니다.서비스를보고 해당 서비스에 대한 모의 호출을하거나 테스트 호출을 수행하고 요청 및 응답을 추적 할 수있는 서버의 로컬 사본으로 작동 할 수 있습니다. 원격 인터페이스가 변경되면 설정하는 데 몇 분이 걸리고 업데이트도 매우 빨랐습니다. 나는 REST 시나리오에서 그것을 사용하지는 않았지만 그것이 잘 작동하지 않더라도 (또는 더 나은 도구가 존재할 때 누군가 가이 대답을 읽고있을지라도) 모의 할 수있는 도구를 찾을 수 있어야합니다 서비스를 제공하고 코드를 배포 할 때가되면 기뻐할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.