在 python 中我可以很容易地做到@pytest.mark.parametrize('input, expected', [(1, 2), [2, 3]])def test_tutu(input, expected): assert input + 1 == expected我怎樣才能在 golang 中做同樣的事情?沒有給自己寫一個循環(huán)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)
}
- 2 回答
- 0 關注
- 134 瀏覽
添加回答
舉報
0/150
提交
取消