测试 Go CAPTCHA 集成而不消耗余额

作者:solvethree阅读需 1 分钟

使用 NewClientWithBaseURL 将官方 Go SDK 指向 httptest 服务器。服务器提供任务响应,因此你可以测试 SDK,而无需消耗 solvethree 额度或提供应用密钥。

本页内容

使用本地测试桩运行 SDK

  1. 1.

    安装依赖项

    使用 Go 1.22 或更高版本。在 Go 模块中,使用 go get 安装 solvethree.com/[email protected]。该模块由 solvethree.com 提供。

  2. 2.

    保存并运行测试

    将示例保存为模块中专用测试目录下的 captcha_integration_test.go,然后在该目录中运行 go test。保持测试桩中的密钥、主机名和代理值不变:它们是测试数据,不是你需要配置的凭据或服务。

Go · 隔离的 SDK 集成测试
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 和相同输入重放请求时返回现有任务。否则,你测试的是第二次创建,而不是恢复。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
测试 Go CAPTCHA 集成而不消耗余额 · solvethree