为了账号安全,请及时绑定邮箱和手机立即绑定

如何测试 Golang 通道/go-routines

如何测试 Golang 通道/go-routines

Go
牧羊人nacy 2021-08-10 16:06:19
我有一个包含一个字节数据的类型,并使用一个通道在那里发布新数据。其他代码可以使用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 rxCharfunc (u *Unit) Read() byte {  return u.rxChar}// Create new Unit and go-routing to listen for Rx bytesfunc 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()) }起初,我认为“读取值”发生在路由开始写入数据之前。但是“已发布”消息总是在“阅读”之前打印。所以,还有两个问题:这是处理传入字节流的最佳方法吗(9600 波特;-))如果这是正确的方法,我该如何正确测试它或者我的代码有什么问题?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

由片猜不透张贴在这里,它并不像你有什么保证操作的顺序访问存储的数据时。您可以使用周围够程之间共享数据的任何一个互斥体。

这里一个更好的选择是使用长度为1的缓冲通道写,存储和读出的字节数。

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

由于这看起来很“流”一样,你很可能也是需要一些缓冲,来看看如何在一些例子io.Readerio.Writer接口经常被使用。


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信