1

我刚开始使用 Go。我正在编写单元测试,我希望能够使用表格进行测试,其中要与实际结果进行比较的结果有时应该或不应该相等。

例如,这是我目前拥有的代码:

package main

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

func TestFunc(t *testing.T) {
    tables := []struct {
        input               string
        comparisonResult    string
        shouldBeEqual       bool
    }{
        {
            "some irrelevant input",
            "some result",
            true,
        },
        {
            "some other irrelevant input",
            "some other result",
            false,
        },
    }

    for _, table := range tables {
        actualResult := sampleFunc(table.input)
        if table.shouldBeEqual {
            assert.Equal(t, table.expectedResult, actualResult)
        } else {
            assert.NotEqual(t, table.expectedResult, actualResult)
        }
    }
}

现在,这还不错,但如果最后一位可以更改为像这样更清晰的东西以获得更好的可读性,那就更好了:

for _, table := range tables {
    actualResult := sampleFunc(table.input)
    assert.EqualOrNotEqual(t, table.comparisonResult, actualResult, table.shouldBeEqual)
}

因此,如果 和 相等,则第一个测试应该通过table.comparisonResult,如果两者actualResult相等,则第二个测试应该通过。

我浏览了testify/assert文档,我认为我没有找到类似于EqualOrNotEqual我上面编写的假函数的函数,但也许我不小心跳过了一些东西,或者我没有某种 Go 特殊语法'不知道这可能有助于我实现这一目标。

注意:我很清楚我可以为此编写自己的函数。我问的原因是因为如果这是一个完善的模式,那么包/库通常将其作为内置函数包含在文档中,有时可能没有记录/埋在文档中。如果没有,也许我不应该这样做是有原因的,或者也许有更好的方法。开始使用一门新语言一开始是非常费力的,尤其是因为你必须学习所有新的习语和怪癖以及做事的正确方法。

4

2 回答 2

2

由于它只是为了便于阅读,并且由于该函数似乎不存在,因此您可以将工作代码复制粘贴到单独的函数中:

func equalOrNotEqual(t TestingT, expected, actual interface{}, shouldBeEqual bool) {
    if shouldBeEqual {
        assert.Equal(t, expected, actual)
    } else {
        assert.NotEqual(t, expected, actual)
    }
}

和:

for _, table := range tables {
    actualResult := sampleFunc(table.input)
    equalOrNotEqual(t, table.comparisonResult, actualResult, table.shouldBeEqual)
}
于 2017-05-10T16:18:08.007 回答
0

Golang 确实有一个功能方面,尽管它比 Python 或 JavaScript 更严格。

如果您知道它们的签名,则可以允许您的结构表保存函数。然后你摆脱if了测试中的逻辑:

func TestFunc(t *testing.T) {
    tables := []struct {
        input            string
        comparisonResult string
        assert           func(assert.TestingT, interface{}, interface{}, ...interface{}) bool
    }{
        {
            input:            "some irrelevant input",
            comparisonResult: "some result",
            assert:           assert.Equal,
        },
        {
            input:            "some other irrelevant input",
            comparisonResult: "some other result",
            assert:           assert.NotEqual,
        },
    }

    for _, table := range tables {
        actualResult := sampleFunc(table.input)
        table.assert(t, table.comparisonResult, actualResult)
    }
}
于 2017-11-27T01:25:46.317 回答