go 测试:可测试的示例折叠输出换行符,使其无法通过

fnatzsnv  于 4个月前  发布在  Go
关注(0)|答案(5)|浏览(40)

你正在使用的Go版本是(go version)?

$ go version
go version go1.20.2 darwin/amd64

⚠️这似乎也影响到了go1.19,但我相信在过去某个时候它是有效的

这个问题在最新版本的发布中是否重现?

是的

你正在使用什么操作系统和处理器架构(go env)?

❌不相关,这种情况在多个环境中都发生过,包括Go Playground中的Go 1.19和Go 1.20

你做了什么?

  1. 提供一个可测试的例子,该函数返回包含连续换行符的输出
  2. 由于testing解析器修改了Output注解,示例无法通过测试
最小示例

可在这里查看: https://go.dev/play/p/LFktKVr75lz
ExampleFoo函数返回包含连续换行符的数据:

Single newline:

Double newline:

Final text

ExampleFoo包含一个嵌入式Output:注解,具有相同的预期输出:

//Output:
	//Single newline:
	//
	//Double newline:
	//
	//
	//Final text

Outputstdout进行比较,删除前导和尾随空格
❌多个换行符被折叠成单个换行符,使测试失败-唯一的解决方案是修改被测试的函数(这不是一个选项)

你期望看到什么?

Output:应该原样解析,而不是被修改(除了修剪前导和尾随空格)

你看到了什么?

多个空行被折叠成一个空行

附加上下文

进行了一些调查,看看我能否找到根本原因,但目前还没有成功
目前怀疑它隐藏在testing包的某个地方,或者是ast解析单行注解链的意外副作用

a1o7rhls

a1o7rhls1#

可能的解决方案

  1. testing 库在 stdout 结果(也称为 got:)以及 Output: 注解(也称为 want:)中折叠换行符
  2. 找到换行符折叠的根本原因并恢复它
  3. 不确定何时开始出现这种情况,因此不确定更改可能产生的影响
    我猜测 (1) 对人们破坏性最小,但它仍然不是最优解 - 因为它没有技术上测试输出是否正确(在某些情况下,确保输出包含多个换行符非常重要,因此测试实际上并不是测试。虽然这显然应该由单元测试覆盖 - 但仍有一个正式化的测试场景忽略了输出的有效性,这是奇怪的)
bzzcjhmw

bzzcjhmw2#

2应该是前进的方向。也许它使用了新的结构化文档解析器,可以折叠换行符?

8dtrkrch

8dtrkrch4#

已记录的行为是“比较忽略前导和尾随空格”,因此折叠内部换行符似乎确实不正确。
然而,Output:解析至少需要考虑到不同平台上的不同行尾(\n\r\n)。
为了尽量减少现有示例中断的数量,我认为这应该在GODEBUG设置上进行限制(参见#56986)。

ekqde3dh

ekqde3dh5#

https://go.dev/cl/479119提到了这个问题:go/ast: allow Example output to not reduce empty lines

相关问题