Go语言进阶与测试 | 青训营笔记

75 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一、本堂课重点内容:

由于已经具有一定Go语言基础,因此不会详细介绍一些冗余内容,仅记录个人新学习到的一些知识点: Go语言进阶知识点以及代码测试相关内容

二、详细知识点介绍:

  • 协程

Go语言在并发编程方面的强大能力离不开Go语言自身所提供的Goroutine。Go 语言的调度器通过使用与 CPU 数量相等的线程减少线程频繁切换的内存开销,同时在每一个线程上执行额外开销更低的 Goroutine 来降低操作系统和硬件的负载,大约能减少80%左右的开销。

  • Channel

Channel 是 Go 语言中Goroutine 之间的通信方式,通过Channel可以实现多协程之间共享内存。

  • 单元测试

单元测试是检查我们的代码能否按照预期执行,检查代码逻辑是否有问题的必经流程,为项目的鲁棒性提供保证。Go语言本身对自动化测试非常友好,自身提供了testing包,并且有许多优秀的测试框架支持,例如testify等。

假设我们需要编写demo.go的测试文件,需要创建一个名称为demo_test.go文件(必须以_test.go结尾),该文件包含 TestXxx 函数(Xxx为被测试的函数名称),举个例子:

my_proj
--demo.go
--demo_test.go

假设demo.go中包含的代码为:

func Add(a, b int) int {
   return a + b
}

将测试文件demo_test.go文件放在与被测试文件相同的包中,该文件不会影响这个包的正常运行,但在运行 go test 命令时将会被包含进去。测试函数的形参必须接受一个指向 testing.T 类型的指针,并且不能返回任何值,例如:

func TestAdd(t *testing.T) {
   sum := Add(2, 3)
   if sum == 5 {
      t.Log("PASS")
   } else {
      t.Fatal("WRONG")
   }
}

在my_proj目录下执行test得到测试结果:

go test -v
=== RUN   TestAdd
    demo_test.go:16: PASS
--- PASS: TestAdd (0.00s)
PASS
ok      my_proj       0.467s

显示PASS说明该项测试通过,返回的值与我们预期的值是相同的。现在尝试把预期结果修改一下:

func TestAdd(t *testing.T) {
   sum := Add(2, 3)
   if sum == 7 {
      t.Log("PASS")
   } else {
      t.Fatal("WRONG")
   }
}

得到测试结果:

go test -v
=== RUN   TestAdd
    demo_test.go:18: WRONG
--- FAIL: TestAdd (0.00s)
FAIL
exit status 1
FAIL    my_proj       0.339s

此时提示测试不通过,得到的值与预期的值不相同。

三、课后个人总结:

  • 利用单元测试,能够快速熟悉项目,并且发现原有代码中可能存在的一些需要改进的地方。

五、引用参考:

Go语言编程与实现