Go语言:编写一个 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,返回一个 error。...

本文介绍了使用Go语言编写一个名为`Racer`的函数,该函数通过并发请求两个URL来判断哪个先响应。文章遵循TDD(测试驱动开发)流程,从编写测试开始,逐步完善代码,解决超时和错误处理问题。通过`select`和`defer`关键字实现了进程同步,确保在10秒内返回结果或抛出错误。同时,文章还提供了测试用例和代码重构的过程。
摘要由CSDN通过智能技术生成

2023-03-29 更新

经过一段时间的学习与实践,针对 Golang 语言基础的 TDD 驱动开发测试训练已经告一段落,接下来会在此基础上继续使用 TDD 来构建应用程序 。

博主前一部分的代码Github先贴下面👇以供参考

https://github.com/slowlydance2me/My_Golang_Study.git

问题:

你被要求编写一个叫做 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,那么应该返回一个 error

实现这个功能我们需要用到
  •   net/http 用来调用 HTTP 请求
  •   net/http/httptest 用来测试这些请求
  •   Go 程(goroutines)
  •  select

先写测试

我们从最幼稚的做法开头把事情开展起来。
func TestRacer(t *testing.T) {
    slowURL := "http://www.facebook.com"
    fastURL := "http://www.quii.co.uk"

    want := fastURL
    got := Racer(slowURL, fastURL)

    if got != want {
        t.Errorf("got '%s', want '%s'", got, want)
    }
}

我们知道这样不完美并且有问题,但这样可以把事情开展起来。重要的是,不要徘徊在第一次就想把事情做到完美。

尝试运行测试

./racer_test.go:14:9: undefined: Racer

为测试的运行编写最少量的代码,并检查失败测试的输出

func Racer(a, b string) (winner string) {
    return
}

racer_test.go:25: got '', want 'http://www.quii.co.uk'

编写足够的代码使程序通过

func Racer(a, b string) (winner string) {
    startA := time.Now()
    http.Get(a)
    aDuration := time.Since(startA)

    startB := time.Now()
    http.Get(b)
    bDuration := time.Since(startB)

    if aDuration < bDuration {
        return a
    }

    return b
}
对每个 URL:
  • 1. 我们用 time.Now() 来记录请求 URL 前的时间。
  • 2. 然后用 http.Get 来请求 URL 的内容。这个函数返回一个 http.Response 和一个 error,但目前我们不关心它们的值。
  • 3. time.Since 获取开始时间并返回一个 time.Duration 时间差。

我们完成这些后就可以通过对比请求耗时来找出最快的了。

问题

 
这可能会让你的测试通过,也可能不会。问题是我们通过访问真实网站来测试我们的逻辑。
使用 HTTP 测试代码非常常见,Go 标准库有这类工具可以帮助测试。
  在前两章模拟和依赖注入章节中,我们讲到了理想情况下如何不依赖外部服务来进行测试,因为它们可能
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值