dsjhejw3232 2015-03-06 23:30
浏览 132
已采纳

如何在Go测试输出中确定行号?

Let's consider this simple testing code.

(Note: assertSomething is super simple here, but normally I'd write a more specialised helper for the task at hand that would look at multiple things and could report more than one type of error.)

package hello

import "testing"

func TestFoo(t *testing.T) {
    assertSomething(t, 2+2 == 4) // line 6
    assertSomething(t, 2+3 == 6) // line 7
}

func assertSomething(t *testing.T, expected bool) {
    if !expected {
        t.Error("Something's not right") // line 12
    }
}

When I run go test, I get the following:

--- FAIL: TestFoo (0.00s)
    hello.go:12: Something's not right
FAIL
exit status 1
FAIL    kos/hello   0.008s

I have two questions:

1) The error points to line 12 - why? How does t.Error find out which line it was called from?

2) In the helper, I'd like to specify that t.Error should look stack level higher to determine the line number to print, so that I would get a message like this:

--- FAIL: TestFoo (0.00s)
    hello.go:7: Something's not right

Python allows me to do this, for instance, in warnings.warn("message", stacklevel=2) - how would I implement the equivalent here?

  • 写回答

2条回答 默认 最新

  • drxrgundk062317205 2018-03-23 07:56
    关注

    Things have changed since go 1.9.

    Helper() method has been added to testing.T and testing.B. It's intended to be invoked from testing helpers such as assertSomething to indicate the function is a helper and we're not interested in line numbers coming from it.

    package main
    
    import "testing"
    
    func TestFoo(t *testing.T) {
        assertSomething(t, 2+2 == 4) // line 6
        assertSomething(t, 2+3 == 6) // line 7
    }
    
    func assertSomething(t *testing.T, expected bool) {
        if !expected {
            t.Helper()
            t.Error("Something's not right") // line 12
        }
    }
    

    The output contains correct line numbers:

    === RUN   TestFoo
    --- FAIL: TestFoo (0.00s)
        main.go:7: Something's not right
    FAIL
    

    You can also try it on Go Playground.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Oracle触发器记录修改前后的字段值
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器