Testing Basics
Table Tests
Table tests run the same check across a short list of input and expected values.
table test
A table test stores cases as data, then loops through each case with one shared check.
Table Tests
table_tests.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
func double(value int) int {
return value * 2
}
func main() {
var caseCount = 3
cases := []struct {
input int
expected int
}{
{1, 2},
{2, 4},
{3, 6},
{4, 8},
}
passed := 0
selected := cases[:caseCount]
for _, testCase := range selected {
actual := double(testCase.input)
if actual == testCase.expected {
passed++
}
}
allPassed := passed == len(selected)
fmt.Println("cases=", len(selected))
fmt.Println("passed=", passed)
fmt.Println("allPassed=", allPassed)
}
package main
import "fmt"
func double(value int) int {
return value * 2
}
func main() {
var caseCount = 2
cases := []struct {
input int
expected int
}{
{1, 2},
{2, 4},
{3, 6},
{4, 8},
}
passed := 0
selected := cases[:caseCount]
for _, testCase := range selected {
actual := double(testCase.input)
if actual == testCase.expected {
passed++
}
}
allPassed := passed == len(selected)
fmt.Println("cases=", len(selected))
fmt.Println("passed=", passed)
fmt.Println("allPassed=", allPassed)
}
package main
import "fmt"
func double(value int) int {
return value * 2
}
func main() {
var caseCount = 4
cases := []struct {
input int
expected int
}{
{1, 2},
{2, 4},
{3, 6},
{4, 8},
}
passed := 0
selected := cases[:caseCount]
for _, testCase := range selected {
actual := double(testCase.input)
if actual == testCase.expected {
passed++
}
}
allPassed := passed == len(selected)
fmt.Println("cases=", len(selected))
fmt.Println("passed=", passed)
fmt.Println("allPassed=", allPassed)
}
caseCount ← 3, cases ← []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}
9func main() {10 var caseCount→ 3 = 3 //@caseCount=2, 411 cases→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}} := []struct {12 input int13 expected int14 }{15 {1, 2},16 {2, 4},17 {3, 6},18 {4, 8},19 }2021 passed→ 0 := 022 selected→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}} := cases[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}[:caseCount3]23 for _, testCase := range selected {for _, testCase := range selected
pass 1 of 322selected := cases[:caseCount]23for _, testCasestruct { input int; expected int }{input:1, expected:2} := range selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}} {24 actual := double(testCase.input1)25 if actual == testCase.expected {All 3 passes — pass 1 is the card above pass testCasetestCase.input1 struct { input int; expected int }{input:1, expected:2} 1 2 struct { input int; expected int }{input:2, expected:4} 2 3 struct { input int; expected int }{input:3, expected:6} 3 func double(value int) int
pass 1 of 35func double(value1 int) int {6 return value1 * 27}All 3 passes — pass 1 is the card above pass value1 1 2 2 3 3 actual ← 2
23for _, testCase := range selected {24 actual→ 2 := double(testCase.input1)25 if actual == testCase.expected {passed ← 1
pass 1 of 324actual := double(testCase.input)25if actual2 == testCase.expected2 {26 passed→ 1++27}All 3 passes — pass 1 is the card above pass actualtestCase.expectedpassed1 2 2 0 → 1 2 4 4 1 → 2 3 6 6 2 → 3 actual ← 4
23for _, testCase := range selected {24 actual→ 4 := double(testCase.input2)25 if actual == testCase.expected {actual ← 6
23for _, testCase := range selected {24 actual→ 6 := double(testCase.input3)25 if actual == testCase.expected {allPassed ← true
30 allPassed→ true := passed3 == len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}})31 fmt.Println("cases=", len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}}))32 fmt.Println("passed=", passed3)33 fmt.Println("allPassed=", allPassedtrue)34}outputcases= 3 passed= 3 allPassed= true
caseCount ← 2, cases ← []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}
9func main() {10 var caseCount→ 2 = 211 cases→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}} := []struct {12 input int13 expected int14 }{15 {1, 2},16 {2, 4},17 {3, 6},18 {4, 8},19 }2021 passed→ 0 := 022 selected→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}} := cases[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}[:caseCount2]23 for _, testCase := range selected {for _, testCase := range selected
pass 1 of 222selected := cases[:caseCount]23for _, testCasestruct { input int; expected int }{input:1, expected:2} := range selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}} {24 actual := double(testCase.input1)25 if actual == testCase.expected {func double(value int) int
pass 1 of 25func double(value1 int) int {6 return value1 * 27}actual ← 2
23for _, testCase := range selected {24 actual→ 2 := double(testCase.input1)25 if actual == testCase.expected {passed ← 1
pass 1 of 224actual := double(testCase.input)25if actual2 == testCase.expected2 {26 passed→ 1++27}for _, testCase := range selected
pass 2 of 222selected := cases[:caseCount]23for _, testCasestruct { input int; expected int }{input:2, expected:4} := range selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}} {24 actual := double(testCase.input2)25 if actual == testCase.expected {func double(value int) int
pass 2 of 25func double(value2 int) int {6 return value2 * 27}actual ← 4
23for _, testCase := range selected {24 actual→ 4 := double(testCase.input2)25 if actual == testCase.expected {passed ← 2
pass 2 of 224actual := double(testCase.input)25if actual4 == testCase.expected4 {26 passed→ 2++27}allPassed ← true
30 allPassed→ true := passed2 == len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}})31 fmt.Println("cases=", len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}}))32 fmt.Println("passed=", passed2)33 fmt.Println("allPassed=", allPassedtrue)34}outputcases= 2 passed= 2 allPassed= true
caseCount ← 4, cases ← []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}
9func main() {10 var caseCount→ 4 = 411 cases→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}} := []struct {12 input int13 expected int14 }{15 {1, 2},16 {2, 4},17 {3, 6},18 {4, 8},19 }2021 passed→ 0 := 022 selected→ []struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}} := cases[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}[:caseCount4]23 for _, testCase := range selected {for _, testCase := range selected
pass 1 of 422selected := cases[:caseCount]23for _, testCasestruct { input int; expected int }{input:1, expected:2} := range selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}} {24 actual := double(testCase.input1)25 if actual == testCase.expected {All 4 passes — pass 1 is the card above pass testCasetestCase.input1 struct { input int; expected int }{input:1, expected:2} 1 2 struct { input int; expected int }{input:2, expected:4} 2 3 struct { input int; expected int }{input:3, expected:6} 3 4 struct { input int; expected int }{input:4, expected:8} 4 func double(value int) int
pass 1 of 45func double(value1 int) int {6 return value1 * 27}All 4 passes — pass 1 is the card above pass value1 1 2 2 3 3 4 4 actual ← 2
23for _, testCase := range selected {24 actual→ 2 := double(testCase.input1)25 if actual == testCase.expected {passed ← 1
pass 1 of 424actual := double(testCase.input)25if actual2 == testCase.expected2 {26 passed→ 1++27}All 4 passes — pass 1 is the card above pass actualtestCase.expectedpassed1 2 2 0 → 1 2 4 4 1 → 2 3 6 6 2 → 3 4 8 8 3 → 4 actual ← 4
23for _, testCase := range selected {24 actual→ 4 := double(testCase.input2)25 if actual == testCase.expected {actual ← 6
23for _, testCase := range selected {24 actual→ 6 := double(testCase.input3)25 if actual == testCase.expected {actual ← 8
23for _, testCase := range selected {24 actual→ 8 := double(testCase.input4)25 if actual == testCase.expected {allPassed ← true
30 allPassed→ true := passed4 == len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}})31 fmt.Println("cases=", len(selected[]struct { input int; expected int }{struct { input int; expected int }{input:1, expected:2}, struct { input int; expected int }{input:2, expected:4}, struct { input int; expected int }{input:3, expected:6}, struct { input int; expected int }{input:4, expected:8}}))32 fmt.Println("passed=", passed4)33 fmt.Println("allPassed=", allPassedtrue)34}outputcases= 4 passed= 4 allPassed= true
Loop Through Cases
- Each row stores one input and one expected result.
- The loop runs the same check for every selected row.
actualcomes from callingdouble.- Matching rows increase
passed. allPassedcompares passed rows with selected rows. | Case row | Check | | --- | --- | |{1, 2}|double(1) == 2| |{2, 4}|double(2) == 4| |{3, 6}|double(3) == 6|
Exercise: table_tests.go
Add table rows for a double helper and count how many selected cases pass