测试 Go CAPTCHA 集成而不消耗余额
使用 NewClientWithBaseURL 将官方 Go SDK 指向 httptest 服务器。服务器提供任务响应,因此你可以测试 SDK,而无需消耗 solvethree 额度或提供应用密钥。
本页内容
使用本地测试桩运行 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 和相同输入重放请求时返回现有任务。否则,你测试的是第二次创建,而不是恢复。
运行您的第一个任务。
使用 $5 工作区额度开始体验。