文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何模拟 rand.Reader 的故障以进行测试?

2024-04-04 23:48

关注

知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何模拟 rand.Reader 的故障以进行测试?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我正在尝试为我的函数编写单元测试;请注意,它调用 rand.read (来自 crypto/rand 包),它依赖于 rand.reader

func GenerateBytes(length int) ([]byte, error) {
    bytes := make([]byte, length)
    if _, err := rand.Read(bytes); err != nil {
        return nil, err
    }
    return bytes, nil
}

我能够为快乐路径编写测试,但无法测试 rand.read 返回错误的情况...有没有办法模拟 rand.read 的失败?


正确答案


您到底想检查什么?那么,如果 rand.read 返回非零错误,那么 generatebytes 也会返回非零错误吗?您只是想使覆盖率高于某个任意阈值,还是这样的检查对您来说实际上很重要?对于前一种情况,请重新考虑。

在后一种情况下,请注意直接依赖像 rand.Reader 这样的包级单例会使测试变得困难。提高可测试性需要一些额外的(但不是禁止性的)努力。

一种可能的方法

值得庆幸的是,已经有一个 rand.reader 满足的便捷接口:io.Reader。不过,如果没有这样的接口可用,也没什么大不了的;您可以声明您自己的定制。这就是 go 接口隐式满足感的伟大之处!

选择一种将 io.reader 传递到 generatebytes 的方法。最惯用的方法是声明 generatebytes,不是作为顶级函数,而是作为某些自定义结构类型(下面名为 sourceofrandomness)的方法,该类型具有(可能是匿名的)io.reader 字段:

type sourceofrandomness struct {
    reader io.reader
}

这样做可以让您选择在自定义类型实例化时注入哪个 io.reader 实现器。 generatebytes 然后可以通过其接收器访问它所需的 io.reader

func (sor *sourceofrandomness) generatebytes(length int) ([]byte, error) {
    bytes := make([]byte, length)
    if _, err := sor.reader.read(bytes); err != nil {
        return nil, err
    }
    return bytes, nil
}

然后,在生产代码中,您可以使用实际的 rand.reader 初始化 sourceofrandomness 值:

sor := sourceofrandomness{reader: rand.reader}
sor.generatebytes(42)

对于您想要的特定测试用例,您可以简单地利用(如 his comment 中的 mh-cbon 中提到的)iotest.ErrReader,它返回一个 io.reader,其 read 方法无条件失败:

import (
  "crypto/rand"
  "testing/iotest"
)

func TestGenerateBytesFails(t *testing.T) {
  // Arrange
  sor := SourceOfRandomness{
    Reader: iotest.ErrReader(errors.New("oops"))
  }
  const dummyLength = 42
  // Act
  _, err := sor.GenerateBytes(dummyLength)
  // Assert
  if err != nil {
    t.Error("want non-nil error; got nil error")
  }
}

本篇关于《如何模拟 rand.Reader 的故障以进行测试?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯