크레딧을 사용하지 않고 Go CAPTCHA 통합 테스트하기
NewClientWithBaseURL을 사용해 공식 Go SDK가 httptest 서버를 가리키도록 설정하세요. 서버가 작업 응답을 제공하므로 solvethree 크레딧을 사용하거나 애플리케이션 비밀 정보를 제공하지 않고도 SDK를 실행해 볼 수 있습니다.
이 페이지의 내용
로컬 픽스처로 SDK 실행하기
- 1.
의존성 설치
Go 1.22 이상을 사용하세요. Go 모듈에서
go get으로solvethree.com/[email protected]을 설치하세요. 이 모듈은 solvethree.com에서 제공됩니다. - 2.
테스트 저장 및 실행
모듈 내 테스트 전용 디렉터리에 예제를
captcha_integration_test.go로 저장한 다음, 해당 디렉터리에서go test를 실행하세요. 픽스처 키, 호스트 이름, 프록시는 그대로 두세요. 설정해야 하는 인증 정보나 서비스가 아니라 테스트 데이터입니다.
package integration_test
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"sync/atomic"
"testing"
"time"
solvethree "solvethree.com/sdk"
)
func TestSolve(t *testing.T) {
var posts atomic.Int32
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if r.Method == "POST" {
posts.Add(1)
fmt.Fprint(w, `{"id":"fixture-1","status":"pending"}`)
return
}
fmt.Fprint(w, `{"id":"fixture-1","status":"ready","solution":{"token":"FIXTURE_TOKEN","userAgent":"fixture-browser-identity","secChUa":"fixture-hints"}}`)
}))
defer server.Close()
client, err := solvethree.NewClientWithBaseURL("fixture-key", server.URL, nil)
if err != nil { t.Fatal(err) }
result, err := client.Solve(context.Background(), solvethree.TaskRequest{
Site: "accounts.example.com", Action: "login", Proxy: "http://proxy.example:8080",
}, solvethree.SolveOptions{Timeout: time.Second, PollInterval: time.Millisecond})
if err != nil { t.Fatal(err) }
if result.Solution.Token != "FIXTURE_TOKEN" || posts.Load() != 1 { t.Fatal("incorrect lifecycle") }
}NewClientWithBaseURL은 테스트용 루프백 HTTP를 허용합니다. 여기서는 server.URL이 프로덕션 API 주소를 대체하고 핸들러가 로컬에서 응답합니다. 프록시 값은 제출된 작업의 일부일 뿐이며, 이 픽스처는 해당 프록시에 연결하지 않습니다.
테스트 통과로 확인할 수 있는 사항
POST 응답에서는 작업이 대기 중 상태로 유지됩니다. 이후 요청은 FIXTURE_TOKEN이 포함된 준비 완료 응답을 받습니다. 마지막 어설션은 반환된 토큰과 POST가 정확히 한 번 전송되었는지를 모두 확인해, 이 흐름에서 실수로 작업을 추가 생성하는 경우를 잡아냅니다.
핸들러는 의도적으로 간단하게 구성되어 있습니다. POST가 아닌 모든 요청에 준비 완료 응답을 반환합니다. 폴링 메서드, 요청 경로, 제출된 JSON은 검증하지 않습니다. 요청 규약도 테스트하려면 핸들러가 예상되는 생성 및 작업 조회 경로와 제출된 사이트, 액션, 프록시를 확인하도록 만드세요.
이 테스트를 통과하면 시뮬레이션된 SDK 수명 주기가 작동함을 확인할 수 있습니다. 실제 사이트 프로필이나 프록시의 유효성, 대상의 토큰 수락 여부를 검증하지는 않습니다. 반환된 토큰과 브라우저 식별 정보는 픽스처 값입니다.
연동 코드에서 판단이 필요한 지점에 실패 사례 추가하기
애플리케이션이 처리해야 하는 조건을 반환하도록 로컬 핸들러를 확장하세요. POST 카운터는 유지하세요. 폴링을 재시도해도 다른 작업이 생성되어서는 안 됩니다.
| 픽스처 동작 | 확인할 사항 |
|---|---|
| 폴링 요청이 HTTP 429, 502, 503 또는 504를 반환한 다음 준비 완료 응답을 반환합니다. | Solve가 일시적인 폴링 실패를 재시도하고, 제한 시간 내에서 Retry-After를 따르며, POST는 여전히 한 번만 전송하는지 확인하세요. |
| 작업이 실패 상태가 되고 errorCode는 site-unreachable로 설정되며 오류 메시지가 포함됩니다. | *solvethree.TaskFailedError를 처리하고 해당 작업의 폴링을 중지하세요. ErrorCode로 실패 원인을 식별할 수 있습니다. Error 텍스트가 필요하면 실패한 작업을 조회하세요. |
| 생성 요청이 성공이 아닌 HTTP 응답을 반환합니다. | 응답을 성공한 작업으로 취급하지 말고 HTTP 오류를 처리하세요. errors.As로 *solvethree.APIError를 추출하고 StatusCode를 확인하세요. |
| 작업이 제한 시간까지 대기 중 상태로 유지됩니다. | errors.Is로 context.DeadlineExceeded를 판별하세요. 시간 초과는 대기를 중지할 뿐, 원격 작업을 취소하지는 않습니다. |
| 서버는 생성을 기록하지만 클라이언트가 응답을 받지 못합니다. | *solvethree.Error의 복구 정보를 확인하세요. CreateTask는 POST를 자동으로 재시도하지 않습니다. TaskID를 알고 있다면 GetTask로 복구하고, 그렇지 않으면 동일한 RequestID로 원래 입력을 정확히 재전송하세요. |
응답을 받지 못하는 사례에서는 테스트에 명시적인 요청 ID를 지정하고, 해당 ID와 동일한 입력을 재전송하면 픽스처가 기존 작업을 반환하도록 만드세요. 그렇지 않으면 복구가 아니라 두 번째 생성을 테스트하는 셈입니다.
출처 및 API 레퍼런스
첫 작업을 실행하세요.
워크스페이스 크레딧 $5로 시작하세요.