유일한 실제 논리는 외부 API의 쿼리 구문에 있습니다. API를 쿼리하는지 여부를 테스트하고 싶지 않고 올바른 데이터가 반환되는 방식으로 쿼리하는지 테스트하고 싶습니다. 예를 들어 일부 의사 코드는 다음과 같습니다.
function retrieve_related_data(id)
{
query = "[potentially long, syntactically complex query that
uses param id to get some data]";
results = api_wrapper.query(query);
return results;
}
API를 구성한보다 구체적인 예 :
function retrieveLifeSupportingObjectsWithinRegion(id)
{
query = "
within region(" + id + ") as r
find objects matching hydration>0 and temp_range has 75
send name, id, relative(position, r)
";
results = astronomicalObjectApiWrapper.query(query);
return results;
}
쿼리는 API에 대한 구문 사용자 정의이며 복잡하며 동일하거나 유사한 결과를 얻는 여러 가지 방법이 있습니다. 이 기능의 목적은 식별 된 데이터를 얻는 것이 아니라 식별 된 id
데이터와의 퍼지 관계를 기반으로 다른 데이터의 하위 집합을 찾는 것 id
입니다. 다른 요구 사항은 id
시스템에 관계없이 항상 동일 하지만 시스템이 수정되면 시간이 지남에 따라 변경 될 수 있습니다. 예를 들어, 예제 api가 중력 정보에 대한 지원을 추가 한 경우 결과를 구체화하기 위해 중력을 사용하도록 쿼리를 변경하려고 할 수 있습니다. 또는 온도 범위를 확인하는 더 효율적인 방법을 제안했지만 결과는 변경되지 않습니다.
테스트하려는 것은 주어진 입력에 id
대해 올바른 데이터 세트가 반환 된다는 것입니다 . 누군가가 쿼리를 엉망으로 만들면 더 이상 올바른 데이터를 반환하지 않으므로 쿼리를 엉망으로 id
만들지 만 사람들이 쿼리를 수정하지 않고도 수정 할 수 있기를 원합니다. 시험.
내가 고려한 옵션 :
-
API를 스텁 할 수는 있지만 너무 간단합니다 (
id
질의가 쿼리에 있는지 확인한 다음 예상 데이터 세트가있는 경우 또는 예기치 않은 세트가 아닌 경우)를 반환하고 너무 취약합니다 (쿼리 문자열이 함수에있는 내용) 또는 너무 복잡한 (사용 된 쿼리가 구문 상 올바른지 확인 하고 올바른 데이터가 리턴 되는지 확인 ) -
실제 API에 쿼리를 제출할 수는 있지만 테스트 시스템의 제어 범위를 벗어나 외부 시스템의 데이터가 변경되면 시간이 지남에 따라 예상 결과가 변경 될 수 있습니다.
-
나는 가지고있는 데이터를 제어하기 위해 실제 API의 테스트 설치를 설정할 수 있지만 많은 노력이 필요합니다.
나는 2 번에 기대어 자주 실행되지 않는 통합 테스트를 더 만들고 외부 시스템의 데이터 변경이 테스트를 중단하는 빈도를 확인합니다. 지금은 이것이 가장 간단하다고 생각하지만, 내가 생각하지 않는 대안이 있거나이 문제를 해결할 더 좋은 방법이 있는지 궁금합니다. 모든 조언을 부탁드립니다.
답변
외부 API 응답의 유효성을 검사하면 함수를 테스트하는 것처럼 보이지만 실제로는 그렇지 않습니다. 어쨌든 외부 API와 API가 실행되는 환경을 테스트하고 있습니다.
테스트는 제 3자가 작성한 코드가 아니라 우리가 작성한 코드의 예상 된 동작을 보장하기 위해 해결되어야합니다.
어느 정도까지는 우리가 의존하는 API와 라이브러리의 적절한 기능을 신뢰해야합니다. 예를 들어, 일반적으로 구현하는 프레임 워크 구성 요소는 테스트하지 않습니다.
내가 왜 그렇게 말합니까?
테스트하려는 것은 주어진 입력 ID에 대해 올바른 데이터 세트가 반환된다는 것입니다
여기서 무엇을 테스트할까요? 말씀 드린 바와 같이, 데이터와 정확성은 우리가 통제 할 수 없으므로 테스트 단계의 성공을 통제 할 수없는 외부 에이전트로 제한합니다. 이러한 테스트는 비결정적이고 확실 하게 될 수있는 후보 입니다. 빌딩 파이프 라인에서 이러한 종류의 테스트를 원하지 않습니다 .
다른 관심사는 계약을 확인하는 것입니다. 릴리스 또는 배포 전에 통합이 여전히 예상대로 작동하는지 확인하기 위해 계약 테스트 1 이 매우 유용하다는 것을 알았습니다 .
누군가가 쿼리를 엉망으로 만들면 더 이상 ID를 기반으로 올바른 데이터를 반환하지 않도록 실패하고 있습니다.
쿼리가 정상이지만 API의 버그로 인해 데이터가 잘못된 경우 어떻게됩니까? 데이터 만 통제 할 수있는 것은 아닙니다. 논리도 마찬가지입니다.
기능 테스트 또는 엔드 투 엔드 테스트를 구현하면 도움이 될 수 있습니다. API가 잘못된 데이터를 반환하면 예기치 않은 동작 및 출력이 발생할 수 있도록 특정 실행 경로의 유효성을 검사하기 위해 이러한 테스트를 처리 할 수 있습니다. 반면에 쿼리의 형식이 잘못된 경우 API에서 오류가 발생할 것으로 예상합니다.
그러나 사람들이 테스트를 수정하지 않고도 쿼리를 수정하기 위해 쿼리를 수정할 수 있기를 바랍니다.
그런 목적으로 도구를 구현하는 것이 좋습니다. 다음과 같이 간단 할 수 있습니다.
- 테스트로 실행되지만 테스트 계획에 속하지 않는 클래스
- 쉘 스크립트 + 컬
아니면 더 정교한 것. 예를 들어 독립형 클라이언트입니다.
어쨌든 문제의 함수는 두 가지 종류의 테스트에 가치가 있습니다.
-
단위 테스트. 말했듯이 외부 API를 스텁해야하지만 단위 테스트의 전체 목적입니다. 의존성을 분리하는 코드 테스트.
-
통합 테스트. 코드가 올바른 요청을 보낼뿐만 아니라 응답 내용, 오류, 리디렉션 등을 올바르게 처리하는지 확인하십시오. 이러한 모든 경우에 대해 테스트를 수행하고 데이터를 테스트하지 마십시오 .
참고 사항 : 귀하의 질문은 응용 프로그램의 SQL 문을 어떻게 테스트합니까?
관련 질문 :
1 :이 주제 에 관한 @DocBrown의 답변에 관심이있을 것입니다
답변
생성 된 쿼리 문자열이 예상 값과 일치하는지 확인하는 단위 검사를 보았습니다.
하나. 제한된 사용이라면 이것은 내 의견이었다. 쿼리 구문은 복잡하고 버그가 많을 수 있으므로 A는 문자열이 ‘정확하게’생성 된 경우에도 확인하고 B를 끝낼 가능성이 있었으며 예기치 않은 결과가 실제 환경에서 반환 될 수 있습니다.
나는 당신이 당신의 옵션을 선택하는 것이 옳다고 생각합니다. 2. 라이브 인스턴스에 대해 통합 테스트를 실행하십시오.
비파괴적인 한, 오류의 원인을 파악할 수는 없지만 파악해야 할 첫 번째 테스트입니다.
옵션 3 ‘더미 데이터로 테스트 인스턴스 배포’를 선택하는 것이 좋습니다. 그러나 테스트 서버를 배포하는 데 시간이 많이 걸리는 경우 테스트 서버에서 동일한 테스트를 가리킬 수 있으므로 테스트 작성에는 영향을 미치지 않습니다.
답변
API에 따라 다르지만 가능하면 옵션 # 3 (개인 테스트 인스턴스)으로 이동하십시오.
언급 한 이유 때문에 API (옵션 # 1) 스터 빙은 최악의 옵션 이며이 경로를 사용하면 좋은 것보다 많은 해를 끼칠 것입니다 (많은 낭비 시간).
실제 API (옵션 # 2)에 대해 실행하면 테스트가 불안정하고 신뢰할 수 없으며 몇 가지 오 탐지 후에는 사용을 중단합니다. 데이터가 변경 될뿐만 아니라 서비스도 다운 될 수 있습니다. 내 생각에 이것은 쿼리에 대한 테스트가 없으며 문제를 찾기 위해 통합 / 시스템 테스트에 의존하는 것과 유사합니다. 즉, API 데이터가 거의 변경되지 않고 API 자체가 거의 항상 작동하는 경우 이는 실행 가능한 옵션 일 수 있습니다. 대부분의 API는이 설명에 맞지 않습니다.
결국 이러한 쿼리가 얼마나 중요하고 복잡한 지에 따라 결정됩니다. 소수 이상이 있고 일부는 테스트해야 할 정도로 복잡 할 경우 테스트를 위해 프라이빗 인스턴스를 설정하는 데 투자합니다. . 다른 단위 테스트와 마찬가지로 비용을 지불합니다.