gpt4 book ai didi

testing - 如何测试 Golang channel /go-routines

转载 作者:IT王子 更新时间:2023-10-29 01:46:11 25 4
gpt4 key购买 nike

我有一个包含一个字节数据的类型,并使用一个 channel 将新数据发布到那里。其他代码可以使用 Read 函数读取最后写入的数据字节。

编辑:对于实际的可运行代码,请参阅 https://github.com/ariejan/i6502/pull/3特别是文件 acia6551.go 和 acia6551_test.go。测试结果可以在这里查看:https://travis-ci.org/ariejan/i6502/jobs/32862705

我有以下内容:

// Emulates a serial interface chip of some kind.
type Unit struct {
// Channel used for others to use, bytes written here will be placed in rxChar
Rx chan byte

// Internal store of the last byte written.
rxChar byte // Internal storage
}

// Used internally to read data store in rxChar
func (u *Unit) Read() byte {
return u.rxChar
}

// Create new Unit and go-routing to listen for Rx bytes
func NewUnit(rx chan byte) *Unit {
unit := &Unit{Rx: rx}

go func() {
for {
select {
case data := <-unit.Rx:
unit.rxData = data
fmt.Printf("Posted 0x%02X\n", data)
}
}
}()

return unit
}

我的测试是这样的:

func TestUnitRx(t *testing.T) {
rx := make(chan byte)
u := NewUnit(rx)

// Post a byte to the Rx channel
// This prints "Posted 0x42", as you'd expect
rx <- 0x42

// Using testing
// Should read last byte, 0x42 but fails.
fmt.Println("Reading value...")
assert.Equal(t, 0x42, u.Read())
}

起初我认为“读取值”发生在 go-routing 开始写入数据之前。但是“已发布”消息总是在“正在阅读”之前打印。

所以,还有两个问题:

  • 这是处理传入字节流的最佳方式吗(以 9600 波特 ;-))
  • 如果这是正确的方法,我该如何正确测试它或者我的代码有什么问题?

最佳答案

根据此处发布的内容猜测,您似乎无法保证访问存储数据时的操作顺序。您可以在 goroutine 之间共享的任何数据周围使用互斥锁。

此处更好的选择是使用长度为 1 的缓冲 channel 来写入、存储和读取字节。

-race 测试你的程序以使用竞争检测器总是一个好主意。

由于这看起来非常像“流”,您很可能需要一些缓冲,并查看一些示例,了解如何使用 io.Readerio.Writer经常使用接口(interface)。

关于testing - 如何测试 Golang channel /go-routines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com