Bypass가있는 Elixir의 외부 API를 테스트하는 방법은 다음과 같습니다.

$config[ads_kvadrat] not found

Nightcore seirei (Date a live)

Nightcore seirei (Date a live)

차례:

Anonim

우리는 서비스 지향 아키텍처 원칙에 우선 순위를 부여합니다. 역. 즉, 명확하고 명확하게 정의 된 책임을 지닌 작고 유지 가능한 구성 요소가 있음을 의미합니다. Representational State Transfer 또는 REST, API를 통해 서로 통신합니다 (주로).

이는 유연성을 제공하고 테스트의 중요한 한면을 제외하고는 우리에게 도움이되었습니다. 테스트 할 때 다음을 피해야합니다.

  • 동일한 컴퓨터에서 실행되는 외부 서비스에 대한 의존성.
  • 느린 테스트.

응용 프로그램은 본질적으로 외부 서비스에 의존하기 때문에 이러한 종속성을위한 테스트 전략을 마련하는 것이 중요합니다.

우리는 최근 Bypass를 사용하기 시작했으며 어떻게 도착했는지 구체적으로 설명합니다.

과거

모의 메서드를 호출하고 다음과 같은 예제 데이터를 반환합니다.

그것은 Ruby / Rails의 세계에서 "가는 길"이었습니다. 불행히도, 이것은 호세 발림 (José Valim)이 잘 설명한 것처럼 나쁜 행동을 조장합니다.

그런 다음 훌륭한 라이브러리 인 ExVCR을 사용하기 시작했지만 모의 / 스텁과 비슷한 단점이 있습니다. 이는 게으름을 조장하고 잘 정의 된 API에 중요한 관심사의 분리를 조장하지 않습니다. ExVCR을 사용하면 실제 라이브 데이터를 "기록"하고 "재생"할 수 있습니다. 통합이 매우 쉽습니다 (테스트에서 몇 줄을 포함하여 다른 모든 것은 처리됩니다). 그러나 이상적으로는 테스트에서 외부 종속성을 생각해 내야합니다. 끝점 동작을 최소한의 오버 헤드로 테스트해야하는 시나리오에서는 여전히 유용 할 수 있습니다 (우리는 S3와 같은 Amazon AWS 서비스에 대한 호출을 테스트하기 위해이 테스트를 사용합니다).

어댑터 입력

어댑터는 훌륭하게 작동하며 API 계약 및 명확하게 정의 된 통신 경계에 관한 심의를 촉진합니다. 우리는 여전히이 접근법을 사용합니다. 특히 어댑터가 더 복잡한 경우 (JSON-RPC 소켓과 같은 경우).

이것은 어댑터가 보일 수있는 방법입니다.

그러나 단순한 HTTP 엔드 포인트의 경우 어댑터는 많은 작업처럼 보이고 큰 단점이 있습니다. 즉, 테스트 식에서 소비하는 라이브러리는 그대로 두었습니다. HTTP 또는 JSON 라이브러리의 내용이 변경되면 테스트에서이를 catch하지 않습니다. 이 방법으로 테스트되지 않은 상태로 남겨진 프로덕션에 중요한 코드의 양은 용인 할 수 없습니다.

현재와 ​​미래

Bypass를 사용하면 우리가 사용하는 외부 서비스를 시뮬레이션하는 테스트에서 매우 간단한 웹 서버를 시작할 수 있습니다.

이제 HTTP 라이브러리, JSON 인코딩 / 디코딩 라이브러리 및 인증 메커니즘을 포함하여 전체 스택을 테스트 할 수 있습니다. Bypass README는 잘 쓰여졌 기 때문에 구현 세부 사항을 남겨 둘 것입니다. 그러나 우리는 테스트를 간결하고 읽기 쉽게 유지하기 위해 테스트 방법을 약간 변경합니다.

첫째, 테스트가 완전한 통합 제품군으로 실행될 때 페이스 북에 연락하기를 원합니다. 우리는 페이스 북 API가 우리의 기대에 따라 기능하도록하기 위해 이것을 불규칙하게합니다. 첨가 - 통합 포함 혼합 시험 API를 시뮬레이트하지는 않지만 대신 외부 서비스를 호출합니다 (5, 7 행).

외부 서비스에 대한 요청을 시뮬레이션 할 때 우리는 명시 적입니다. 따라서 바이 패스를 사용하는 각 테스트는 @ 태그 facebook_bypass (라인 7).

마지막으로, handle_fb 함수 (30 ~ 39 행)가 호출되고 있습니다 (주어진 request_path 성냥). 필자는 함수 헤드에서 일치하는 것을 좋아하는데, 이는 어떤 경로를 명시하고 있는지를 나타내며 다른 경로에 대해 서로 다른 함수를 정의 할 수있게 해줍니다.

따라서 Bypass는 태그가 지정된 테스트에서만 실행됩니다. @ 태그: 바이 패스 우리가 통합 스위트를 운영하지 않을 때. Bypass를 설정하는 동안 태그가 페이지 ID (8, 20 행)를 전달할 수 있도록하는 것이 더 좋습니다. 바이 패스를 사용하는 테스트가 어떻게 모든 영광을 얻는 지 살펴 보겠습니다.

보시다시피, facebook_bypass 태그는 API를 시뮬레이트하고 있음을 명시 적으로 나타냅니다 (통합 모드에 있지 않은 경우). 이를 통해 시뮬레이트 된 API에 정보를 전달할 수 있으며, 서로 다른 테스트에 대해 동일한 바이 패스 구성을 재사용하는 것이 매우 쉽습니다.

외부 API 테스트에 도움이되기를 바랍니다. 더 궁금한 점이 있으면 Twitter (아래 참조)에서 나를 찾을 수 있습니다.

$config[ads_kvadrat] not found