当前位置: 首页 > 面试题库 >

如何测试包含log.Fatal()的Go函数

韩瀚
2023-03-14
问题内容

说,我有以下代码打印一些日志消息。我将如何测试已记录正确的消息?由于log.Fatal通话os.Exit(1)失败,测试失败。

package main

import (
    "log"
)

func hello() {
    log.Print("Hello!")
}

func goodbye() {
    log.Fatal("Goodbye!")
}

func init() {
    log.SetFlags(0)
}

func main() {
    hello()
    goodbye()
}

以下是假设检验:

package main

import (
    "bytes"
    "log"
    "testing"
)


func TestHello(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    hello()

    wantMsg := "Hello!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

func TestGoodby(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    goodbye()

    wantMsg := "Goodbye!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

问题答案:

这类似于“ 如何os.Exit()在Go中测试场景”:您需要实现自己的记录器,默认情况下,该记录器重定向到log.xxx(),但在测试时为您提供了将函数替换为log.Fatalf()您自己的记录器(不会调用os.Exit(1))的机会。

我在测试os.Exit()电话中也做了同样的事情exit/exit.go

exiter = New(func(int) {})
exiter.Exit(3)
So(exiter.Status(), ShouldEqual, 3)

(在这里,我的“退出”功能是一个空的,什么也不做)



 类似资料:
  • 问题内容: 我正在Go中运行一个带有打印内容的语句的测试(即用于测试的调试),但是它不打印任何内容。 当我对此文件运行go test时,输出为: 据我所知,真正使其打印的唯一方法是通过t.Error()进行打印,如下所示: 哪个输出: 我已经用Google搜索并浏览了手册,但没有找到任何东西。 问题答案: 结构和都具有和方法,这听起来似乎是您想要的。和分别类似于和。 在此处查看更多详细信息:htt

  • 我在Go中运行一个测试,用一个语句打印一些东西(例如,用于测试的调试),但是它没有打印任何东西。 当我对此文件运行go测试时,输出如下: 据我所知,真正让它打印出来的唯一方法是通过t.Error()打印出来,如下所示: 其输出如下: 我用谷歌搜索并查看了手册,但没有找到任何东西。

  • Django提供了一组小工具,在写测试时派上用场。 测试客户端 测试客户端是一个Python类,作为一个虚拟的Web浏览器,允许您测试您的视图,并与您的Django供电的应用程序以编程方式交互。 你可以用测试客户端做的一些事情是: 模拟对URL的GET和POST请求,并观察响应 - 从低级HTTP(结果头和状态代码)到页面内容的一切。 查看重定向链(如果有),并在每个步骤中检查网址和状态代码。 测

  • 我想知道哪种方法是测试不返回任何函数(只更改一个字段值)并包含异步调用的最佳方法。 这是我要测试的AngularJS控制器,我调用的服务返回一个promise(总是返回{name:"John"}): 如果sayHello函数不包含异步调用,这将是规范,但它总是失败,因为scope.greeting总是空的。 我将如何使用此规范来处理异步调用?我真的不明白如何以及在哪里使用Jasmine 2.0的“

  • 如何检查数组中的所有元素是否相同? 这是我想到的唯一解决办法。我想知道有没有有效的?

  • 问题内容: 我有一个Java课。如何检查该类是否包含JUnit4测试的方法?我是否必须使用反射对所有方法进行迭代,还是JUnit4提供这种检查? 编辑: 由于注释不能包含代码,因此我根据以下答案放置了代码: 问题答案: 使用内置的JUnit 4类 org.junit.runners.model.FrameworkMethod 来检查方法。