当前位置: 首页 > 知识库问答 >
问题:

拉伸/证明/断言只是给堆栈跟踪,缺少实际的错误消息

楚和悌
2023-03-14

我有下面这个测试,我想转换成使用github。com/stretchr/authentic/assertimport,实现这一点的最佳实践是什么?现在的代码是:

func TestSdk(t *testing.T) {
    ctx := context.Background()

    sdk, err := NewSdk(ctx)
    if err != nil {
        t.Errorf("Unable to get VMware SDK: %v", err)
    }

    defer sdk.GovClient.Logout(ctx)
}

错误:FAIL |--FAIL:TestSdk(0.00s)| sdk_测试。go:48:无法获取VMware SDK:请设置环境变量:HCI_endpoint、HCI_用户名和HCI_密码|紧急:运行时错误:无效内存地址或零指针解引用[已恢复]|紧急:运行时错误:无效内存地址或零指针解引用|[信号SIGSEGV:分段冲突代码=0x1 addr=0x0 pc=0x151cc31]| goroutine 6[运行]:|测试。特鲁纳。func1(0xc00019a100)|/usr/local/ceral/go/1.11。1/libexec/src/testing/testing。go:792 0x387 |恐慌(0x1642c20,0x1f46a80)|/usr/local/Cell/go/1.11。1/libexec/src/runtime/panic。go:513 0x1b9 | github。com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo。TestSdk(0xc00019a100)|/Users/jonma/go/src/github。com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo/sdk_测试。go:51 0x121 |测试。tRunner(0xc00019a100,0x1825b48)|/usr/local/Cella/go/1.11。1/libexec/src/testing/testing。go:827 0xbf |由测试创建。(*T)。运行|/usr/local/cillar/go/1.11。1/libexec/src/testing/testing。go:878 0x353失败| github。com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo 0.019s

这就是我所改变的,这种方法的问题是,错误消息不显示只是一些长堆栈跟踪

func TestSdk(t *testing.T) {
    ctx := context.Background()

    sdk, err := NewSdk(ctx)

    assert.Errorf("Unable to get VMware SDK: %v", err)

    defer sdk.GovClient.Logout(ctx)
}

FAIL | --- FAIL: TestSdk(0.00s)|恐慌:运行时错误:无效的内存地址或空指针解引用[恢复]|恐慌:运行时错误:无效的内存地址或空指针解引用|[信号SIGSEGV:分割违规代码=0x1 addr=0x0 pc=0x151eecf]|goroutine 6[运行]:|test. tRunner.func1(0xc00019e100)| /usr/local/Cellar/go/1.11.1/libexec/src/testing/testing.go:7920x387|恐慌(0x1645200,0x1f4aab0)| /usr/local/Cellar/go/1.11.1/libexec/src/runtime/panic.go:5130x1b9|github.com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo.TestSdk(0xc00019e100)| /Users/jonma/go/src/github.com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo/sdk_test.go: 57 0x1ef|test. tRunner(0xc00019e100,0x1828420)| /usr/local/Cellar/go/1.11.1/libexec/src/testing/testing.go:8270xbf|通过测试创建。(*T).运行| /usr/local/Cellar/go/1.11.1/libexec/src/testing/testing.go:8780x353 FAIL|github.com/kubicorn/kubicorn/cloud/vmware/vmwareSdkGo0.034s

在这里,我丢失了调用的函数的实际错误消息。

共有2个答案

宗政昱
2023-03-14

您引用的错误消息不是来自您发布的代码段。但我确实看到了三个明显的问题:

  1. 证人断言的第一个论点应该是t,我想当你看到恐慌时,你可能会使用nil
  2. 您尚未通过中的测试错误,它应该是第二个参数,即使它也是字符串格式的第四个参数
  3. 您可能需要断言。无错误,出现错误时将失败

综上所述:

func TestSdk(t *testing.T) {
    ctx := context.Background()

    sdk, err := NewSdk(ctx)

    assert.NoErrorf(t, err, "Unable to get VMware SDK: %v", err)

    defer sdk.GovClient.Logout(ctx)
}

公良照
2023-03-14

而不是延迟sdk。政府客户。注销(ctx)trydefer func(){if(ctx!=nil){sdk.GovClient.Logout(ctx)}

第二次恐慌是因为错误的CT延期

(我前面没有vmwareSDK,关键是在尝试之前检查sdk.GovClient.Logout是否有有效参数)

 类似资料:
  • 我有一个带有的堆栈跟踪: [...]原因:ch.ethz.id.wai.lakshmi.engine.common.lakshmiException:处理用户事务时出错。在ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:79)在ch.ethz.id.wai

  • 在另一种情况下,经过去模糊处理后,我得到的不是正常的堆栈跟踪,而是如下所示: 是什么原因,有可能莫名其妙地从这得到一个正常的堆栈跟踪?

  • 当Xdebug被激活时,只要PHP决定显示通知,警告,错误等,就会显示堆栈跟踪。堆栈跟踪显示的信息以及显示方式可以根据您的需要进行配置。 Xdebug在错误情况下显示的堆栈跟踪信息量相当保守(如果display.errors 在php.ini中设置为On)。这是因为大量的信息会减慢脚本的执行速度和浏览器中堆栈跟踪本身的渲染速度。但是,可以使堆栈轨迹以不同的设置显示更详细的信息。 堆栈跟踪中的变量

  • 问题内容: 假设我有一些这样的代码: 万一我会得到这样的东西: 此堆栈跟踪完全合法,但有时这些错误消息可能无法阐明发生了什么,因此我想更深入地研究第三方库的源代码,以调查究竟是什么导致该错误被返回。但是,当我的代码如此恐慌时,无法获得返回此错误的实际位置。 需要更多说明:当我来自抛出异常的JVM世界时,我可以完全跟踪抛出异常的确切代码行,从而可以轻松找到问题的所在并查看出了什么问题。Go堆栈跟踪恰

  • 问题内容: 在Java中,如果一个方法抛出错误,则调用它的方法可以将其传递给下一个方法。 我正在迅速编写一个应用程序,并且希望做同样的事情。这可能吗?如果不可能,还有哪些其他可能的解决方案?我进行调用的原始函数具有此结构。 问题答案: 参考Swift- 错误处理文档 ,您应该: 1- 通过声明符合错误协议的 枚举 来创建自定义错误类型: 2- 声明为可抛出函数: 3- 声明为throwable函数

  • 问题内容: 我只想在程序中记录异常的前几行。我知道,我可以执行以下操作以仅打印stacktrace的前5行: 但我宁愿使用log4j(或更精确地说,是在log4j上使用slf4j)进行日志记录。有没有办法告诉log4j它应该只打印stacktrace的前5行? 问题答案: 您可以在log4j中使用EnhancedPatternLayout来格式化堆栈跟踪。 请参阅http://logging.ap