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

go - golang 测试参数化

go - golang 测试参数化

Go
拉丁的传说 2023-01-03 10:08:44
在 python 中我可以很容易地做到@pytest.mark.parametrize('input, expected', [(1, 2), [2, 3]])def test_tutu(input, expected):    assert input + 1 == expected我怎样才能在 golang 中做同样的事情?没有给自己写一个循环func tutu(a int) int {    return a + 1}func Test_tutu(t *testing.T) {    tests := []struct {        input    int        expected int    }{        {input: 1, expected: 2},        {input: 2, expected: 3},    }    for _, tt := range tests {        t.Run("", func(t *testing.T) {            assert.Equal(t, tutu(tt.input), tt.expected)        })    }}那么 golang 中的这个 python parametrize 相当于什么?def parametrize(all_args_name: str, all_values: List[Any], fn: Callable):    args_name = all_args_name.split(',')    for values in all_values:        args = {k: v for k, v in zip(args_name, values)}        fn(**args)
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

我找到了一种使用反射的方法


func parametrize[V any, T any](fn T, allValues [][]V) {

    v := reflect.ValueOf(fn)

    for _, a := range allValues {

        vargs := make([]reflect.Value, len(a))


        for i, b := range a {

            vargs[i] = reflect.ValueOf(b)

        }

        v.Call(vargs)

    }

}


func tutu(a int) int {

    return a + 1

}


func Test_tutu(t *testing.T) {

    testsArgs := [][]any{

        {t, 1, 2}, {t, 3, 4},

    }

    test := func(t *testing.T, input int, expected int) {

        assert.Equal(t, tutu(input), expected)

    }

    parametrize(test, testsArgs)

}


查看完整回答
反对 回复 2023-01-03
?
慕少森

TA贡献2019条经验 获得超9个赞

GO 拥有的最接近的东西是subtests,但你仍然需要编写for循环,就像你在第二个例子中所做的那样。



查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

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