挑战:
Go 1.18 引入了泛型,但是如何有效地对泛型进行表测试当 T 无法实例化时的函数
问题陈述:
由于无法实例化 T 值,当前的测试方法需要重新声明每个函数的测试逻辑。
方法:
测试方法应侧重于重用常见的逻辑,同时考虑泛型函数的具体性质。
解决方案:
1.可重用的测试逻辑:
创建一个通用的测试函数,例如 runTestCase[T Item](tc testCase[T]),它封装了设置测试和验证结果等常见操作。
2。实例化注意事项:
泛型函数最终必须使用特定类型进行实例化。但是,没有必要测试每个可能的类型参数。
3.专注于类型特定的行为:
仅当特定类型的行为因运算符语义而不同时,才专注于测试特定类型的函数。例如,数字和字符串的运算符,或者数字和字符串的比较运算符。
示例:
此测试代码使用通用 runTestCase 函数来测试不同类型商店地图中的值的数量:
func TestStore(t *testing.T) { t.Run("ints", testInt) t.Run("strings", testString) } func testString(t *testing.T) { t.Parallel() tests := []testCase[string]{ { start: store[string]{}, key: 123, val: "test", expected: store[string]{123: "test"}, }, // ... } for _, tc := range tests { t.Run(tc.name, runTestCase(tc)) } } func testInt(t *testing.T) { t.Parallel() tests := []testCase[int]{ { start: store[int]{}, key: 123, val: 456, expected: store[int]{123: 456}, }, // ... } for _, tc := range tests { t.Run(tc.name, runTestCase(tc)) } }
以上是在不实例化类型参数的情况下,如何有效地对 Go 中的泛型函数进行表测试?的详细内容。更多信息请关注PHP中文网其他相关文章!