使用 Table-driven 可以快速、无痛写出高质量单测。表驱动法(Table-Driven Approach)这个概念,并不是 Golang 或者测试领域独有的;它是个编程模式,属于数据驱动编程的一种。表驱动法的核心在于:把易变的数据部分,从稳定的处理数据的流程里分离,放进表里;而不是直接混杂在 if-else / switch-case 的多个分支里。
- 写得快:人类只需准备数据,无需构造流程。
- 可读性强:将数据构造成表,结构更清晰,一行一行的数据变化对比分明。
- 子测试用例互相独立:每条数据是表里的一行,被流程模板构造成一个独立的子测试用例。
- 可调试性强:因为每行数据被构造成子测试用例,可以单独跑、单独调试。
- 可扩展/可维护性强:改一个子测试用例,就是改表里的一行数据。
对比机制
低质量单测之平铺多个 test case
低质量单测之平铺多个 subtest
实际上,从 Go 1.7 开始,一个 test case 里可以有多个子测试(subtest)
高质量单测之 table-driven
要生成 table-driven 单测模板非常简单,只需在 GoLand 里右键方法名 > Generate
GoLand 会自动生成如下模板,而我们只需填充红框部分,也即最核心的,用于驱动单测的数据表:
不难看出,这个模板在例子二的基础上,继续削减重复代码,不再平铺 subtest,而是将公共流程放入一个循环,用数据表中的多行数据驱动循环遍历,并为每行数据构造一个 subtest 跑一遍。所以,人类只需在上图的红框里,以表的形式填充数据,这个 test case 就写好了:
每行数据被 t.Run 构造出了一个独立的 subtest,能被单独 run/debug。