单元测试 - 记录然后失败?

我习惯于测试驱动我的代码。现在我是 Go 的新手,我正在努力尽快把它做好。我正在使用标准库中的测试包,这似乎已经足够好了。(我也喜欢它不是另一个外部依赖项。我们目前总体上有 2 个依赖项 - 与任何 Java 或 Ruby 项目相比......)无论如何 - 它看起来像 golang 中的断言如下所示:


func TestSomething(t *testing.T) {

  something := false

  if something {

    t.Log("Oh noes - something is false")

    t.Fail()      

  }

}

我觉得这很冗长,并希望在一行上完成:


Assert( something, "Oh noes - something is false" )

或类似的东西。我希望我在这里错过了一些明显的东西。在 go 中执行此操作的最佳/惯用方法是什么?


更新:只是为了澄清。如果我要做这样的事情:


func AssertTrue(t *testing.T, value bool, message string) {

  if value {

    t.Log(message)

    t.Fail()

  }

}

然后像这样写我的测试


func TestSomething(t *testing.T) {

  something := false

  AssertTrue(t, something, "Oh noes - something is false")

}

那么它会不会是去的方式来做到这一点?


慕运维8079593
浏览 176回答 3
3回答

aluckdog

有可以与股票测试框架集成的外部包。我很久以前写的其中一个gocheck旨在对这种用例进行排序。有了它,测试用例看起来像这样,例如:func (s *Suite) TestFoo(c *gocheck.C) {    // If this succeeds the world is doomed.    c.Assert("line 1\nline 2", gocheck.Equals, "line 3")}您会像往常一样运行它,使用go test,并且该检查中的失败将报告为:----------------------------------------------------------------------FAIL: foo_test.go:34: Suite.TestFooall_test.go:34:    // If this succeeds the world is doomed.    c.Assert("line 1\nline 2", gocheck.Equals, "line 3")... obtained string = "" +...     "line 1\n" +...     "line 2"... expected string = "line 3"请注意代码正上方的注释是如何包含在报告的失败中的。还有许多其他常用功能,例如套件和特定于测试的设置和拆除例程,等等。请查看网页了解更多详情。它维护得很好,因为我和其他人在许多活跃的项目中使用它,所以请随时加入,或跟进并查看更适合您口味的其他类似项目。对于gocheck使用的例子,请看看包装,如氧化镁,goyaml,goamz,管,VCLOCK,朱朱(大规模的代码库),LPAD,gozk,goetveld,墓等。此外gocheck,管理,测试本身。引导它很有趣。

湖上湖

我不鼓励以您似乎想要的方式编写测试。整个 stdlib 使用您所说的“详细”方式并非偶然。不可否认,这是更多的线路,但这种方法有几个优点。如果你阅读了为什么 Go 没有断言?并且s/error handling/test failure reporting/g你可以得到的为什么转到测试几个“断言”包不是一个好主意,用图片,再一次,证明是 stdlib 的庞大代码库。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go