为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕运维8079593 2021-06-23 17:58:36
我习惯于测试驱动我的代码。现在我是 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")}那么它会不会是去的方式来做到这一点?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

有可以与股票测试框架集成的外部包。


我很久以前写的其中一个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.TestFoo


all_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,管理,测试本身。引导它很有趣。


查看完整回答
反对 回复 2021-06-28
?
湖上湖

TA贡献2003条经验 获得超2个赞

我不鼓励以您似乎想要的方式编写测试。整个 stdlib 使用您所说的“详细”方式并非偶然。

不可否认,这更多的线路,但这种方法有几个优点。

如果你阅读了为什么 Go 没有断言?并且s/error handling/test failure reporting/g你可以得到的为什么转到测试几个“断言”包不是一个好主意,用图片,

再一次,证明是 stdlib 的庞大代码库。


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信