从零开始的Go语言学习生活part-2 | 青训营笔记

166 阅读4分钟

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

Go (Golang) 工具之单元测试go-junit-report | go的单元测试

将go test输出转换为** junit xml**

go-junit-report是一种将go test 输出转换为XML报告的工具,适用于预期JUnit-Style XML报告

安装和使用

go install github.com/jstemmer/go-junit-report@latest

go-junit-report 读取stdin的完整GO测试输出,并将JUNIT兼容XML写入stdout。为了捕获构建错误以及测试输出,将stdout和stderr重定向到go-junit-report。

go的单元测试

文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码

必须import testing这个包

所有的测试用例函数必须是Test开头 测试用例会按照源代码中写的顺序依次执行 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态 测试格式:func TestXxx (t testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。 函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。

单元测试执行

go的自带go test还是很好用的,执行的前提是需要写对应的单元测试(功能测试、性能测试 可写在1个测试文件里)

go test  #执行单元测试
go test -v  #打印执行的详细信息,即使测试成功(默认情况下测试成功是不打印结果的)
go test -v xxx #执行指定文件的单元测试(此处注意,go只会读取go/src下面的目录。所以写文件路径不需要加go/src)
go test -v xxx> test # 执行指定文件的单元测试并且将结果写入文档(文件名根据自己需要设置,文件内容=终端显示)
go test -v xxx -json  # 执行指定文件的单元测试并且将结果转化为json格式
go test -v xxx -json > test.json # 执行指定文件的单元测试并且将结果转化为json格式写入文档(文件名根据自己需要设置,文件内容=终端显示)
go test -bench=.  #执行性能测试
go test -bench=. -v #显示执行的详细信息

直接生成xml报告

go get -u github.com/jstemmer/go-junit-report  #安装报告模板插件
go test -v xx/xx | go-junit-report > test.xml  #测试指定文件,并直接生成xml报告

golang - waitgroup用法及使用要点

waitgroup在golang中,用于线程同步,指等待一个组,等待一个系列执行完成后,才会向下执行,可以解决一个 进程goroutine 等待多个该进程启动的子线程goroutine 都正常运行完成的场景,这个比较常见的场景就是例如 后端 main processer 启动了多个消费者worker干活,还有爬虫并发爬取数据,多线程下载等等,为了保证主进程在所有的子线程完成后再退出,这时就要用上waitgroup

waitgroup使用示例

package main

import (
    "fmt"
    "sync"
    "time"
)
func worker(idx int, out chan struct{}, wg *sync.WaitGroup) {
	 defer wg.Done()
        time.Sleep(1 * time.Second)
        fmt.Println(time.Now())
        fmt.Println(idx )
        <-out 
}
func main() {
    wg := new(sync.WaitGroup)
    in := make(chan struct{}, 20)
    for i := 0; i < 200; i++ {
        in <- struct{}{}
        wg.Add(1)
        go worker(i, in, wg)
    }
    wg.Wait()
}

image.png

waitgroup使用注意事项

Add一个负数

如果计数器的值小于0会直接panic

Add在Wait之后调用

比如一些子协程开头调用Add结束调用Wait,这些 Wait无法阻塞子协程。正确做法是在开启子协程之前先Add特定的值。

未置为0就重用

WaitGroup可以完成一次编排任务,计数值降为0后可以继续被其他任务所用,但是不要在还没使用完的时候就用于其他任务,这样由于带着计数值,很可能出问题。

复制waitgroup

WaitGroup有nocopy字段,不能被复制。也意味着WaitGroup不能作为函数的参数

waitgroup使用总结

WaitGroup是Golang应用开发过程中经常使用的并发控制技术,学习golang是我们必须要掌握和理解的机制之一,建议有时间了大家再进一步的研究一下WaitGroup的底层实现逻辑。

引用参考:

课外补充引用:

文章学习来源:

感谢以上作者的文章,今天的学习收获满满!!Thanks and HappyCoding!