这是我参与「第五届青训营 」伴学笔记创作活动的第 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()
}
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!