微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以编写一个测试来测试记录的键的顺序

如何解决是否可以编写一个测试来测试记录的键的顺序

logrus 按字母顺序记录键,这是我想要和需要的,但我想编写一个测试以确保它没有改变,我尝试添加钩子,但我认为我无法访问完整日志使用我使用 fuzzyJoinFunction<-function(a){ a<-fuzzy_left_join(a,Experiment_List,by = c('Dev.Date.Time' = 'StartTime','Dev.Date.Time'= 'StopTime'),match_fun = c(`>=`,`<=`)) a } df<-rbindlist(mclapply(X=df,FUN=fuzzyJoinFunction,mc.cores=4)) 添加自定义上下文,我只能获取消息记录示例

WithFields

我想测试 func TestSomething(t*testing.T){ logger,hook := test.NewNullLogger() logger.WithField("correlationId","123").WithField("id","1").Info("hello") assert.Equal(t,1,len(hook.Entries)) assert.Equal(t,logrus.(Level,hook.LastEntry().Level) assert.Equal(t,"Hello",hook.LastEntry().Message) hook.Reset() assert.Nil(t,hook.LastEntry()) } 输出中出现在 message 之前

t

解决方法

Logrus 按字母顺序记录键

不,实际上并没有。 FieldMap 实际上只是一个标准的 go map(如您所见 here)。同一个文件显示了如何处理 fieldmap 的 JSON 编组。没有任何内容表明正在进行任何特定的键排序。

很可能,由于映射键是如何散列的,在您的特定情况下,在您的平台上,输出似乎是按字母顺序排列的,并且使用您的 logrus 和 go 编译器的特定版本。但是,不能保证情况会一直如此。如果您为不同的架构/操作系统(GOARCHGOOS)编译相同的代码,则输出可能不同。事情现在看起来是按字母顺序排列的,但这只是巧合。编写测试以确保您的运气没有耗尽并不是测试的重点。

根据定义,映射是无序的数据结构。如果您希望日志输出按字母顺序排列,那么您可以为 logrus 编写自己的格式化程序,遍历字段映射,将所有键(作为字符串)添加到一个切片中,对所述切片进行排序,然后遍历排序后的键以按字母顺序打印出键。再说一次,我真的很想知道你的用例是什么来证明这样的事情。


是的,仔细检查后,encoding/json 包似乎确实将地图编组为 JSON 对象,使用 keys being sorted

地图值编码为 JSON 对象。映射的键类型必须是字符串、整数类型或实现 encoding.TextMarshaler。通过应用以下规则对映射键进行排序并用作 JSON 对象键,受上文针对字符串值描述的 UTF-8 强制转换

那很好,如果标准库没有改变(或者你不决定将它换成一些行为不同的替代品),你应该很好。使用不同的格式化程序时也不能保证此行为。您一开始是要确保替换日志记录包不会破坏这种行为。在这种情况下,您正在测试错误的东西......它不是日志包本身,而是您正在使用的 json 编码包 (marshaller)。

您基本上是在寻找一种方法来测试是否有人将替代编组包插入到您正在使用的外部包中。如果下一个版本的 logrus 最终切换到包 like ffjson,您的测试将失败,尽管只是碰撞了您的日志包的版本,并且除此之外没有进行其他更改。单元测试并不是强制执行此操作的最佳方法。您可以维护自己的 logrus 包的分支,或者只是在 go.mod 文件中锁定一个已知好的版本,然后收工。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?