【问题标题】:Using an assertion library with GoDog test framework使用带有 GoDog 测试框架的断言库
【发布时间】:2020-07-25 14:27:33
【问题描述】:

我使用Cucumber GoDog 作为 gRPC 微服务测试的 BDD 测试框架。 GoDog 不附带任何断言助手或实用程序。

这里有没有人有采用任何现有断言库的经验,例如使用 GoDog 的 Testify/GoMega

据我所知,GoDog 不能在 go test 之上工作,这就是为什么我认为采用任何像我提到的基于 go test 的断言库都具有挑战性。但是我仍然想在这里查看是否有人有这样做的经验。

【问题讨论】:

  • 它确实与 go test github.com/cucumber/godog/blob/master/…集成了
  • 投反对票的人,请注意解释为什么投反对票?
  • @M.P.Korstanje 是否可以使用像 Testify/GoMega 这样的库?我是golang的初学者,我不确定。您有任何关于如何将这些断言库与 GoDog 一起使用的示例吗?

标签: go testing cucumber assertion


【解决方案1】:

很抱歉看到您仍在处理此问题。

正如我们之前所说的,一种方法可以通过我之前发送给您的the link 使其工作,但它不一定是您在 Slack 中提到的对初学者友好的设置。也许这是我们的贡献者将来可以研究的东西,只是目前还没有设置,而且由于我们主要是志愿者,因此为新功能设置时间表可能很困难。

我目前的建议是通过 if 语句进行断言。如果您不希望它们特别出现在您的测试代码中,那么您可以制作一个快速包装函数并以这种方式调用它们。

【讨论】:

    【解决方案2】:

    这是使用 Testify 的基本概念验证:

    package bdd
    import (
        "fmt"
        "github.com/cucumber/godog"
        "github.com/stretchr/testify/assert"
    )
    type scenario struct{}
    func (_ *scenario) assert(a assertion, expected, actual interface{}, msgAndArgs ...interface{}) error {
        var t asserter
        a(&t, expected, actual, msgAndArgs...)
        return t.err
    }
    func (sc *scenario) forcedFailure() error {
        return sc.assert(assert.Equal, 1, 2)
    }
    type assertion func(t assert.TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool
    type asserter struct {
        err error
    }
    func (a *asserter) Errorf(format string, args ...interface{}) {
        a.err = fmt.Errorf(format, args...)
    }
    func FeatureContext(s *godog.Suite) {
        var sc scenario
        s.Step("^forced failure$", sc.forcedFailure)
    }
    
    Feature: forced failure
      Scenario: fail
        Then forced failure
    

    这里的关键是实现Testify的assert.TestingT接口。

    【讨论】:

    • 我喜欢这个想法,但我更愿意坚持使用 asserter 实例直接传递给 testify 断言方法:assert.Contains(&t, lastOutput, text); return t.err
    【解决方案3】:

    这是 GoMega 的概念证明:

    在运行任何测试之前注册 GoMega Fail Handler,让 GoMega 简单地对错误消息感到恐慌。

    gomega.RegisterFailHandler(func(message string, _ ...int) {
        panic(message)
    })
    

    定义一个步骤失败处理程序以从任何失败中恢复。

    func failHandler(err *error) {
        if r := recover(); r != nil {
            *err = fmt.Errorf("%s", r)
        }
    }
    

    现在在每个步骤定义的开头延迟运行failHandler,如下所示:

    func shouldBeBar(foo string) (err error) {
        defer failHandler(&err)
    
        Expect(foo).Should(Equal("bar"))
    
        return err
    }
    

    现在,如果/当我们的第一个 GoMega 断言失败时,step 函数将运行 failHandler 并返回 GoMega 失败消息(如果有)。注意我们使用命名结果参数来返回错误,见How to return a value in a Go function that panics?

    【讨论】:

    • 这一个补充了testify one by snargleplax 作为这个问题的好答案,除了接受的一个。这些很简单,您可以如何在提到的两个库 Testify/Gomega 中实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多