Good discussion on testing this morning. I have a concrete example I’d like to workshop. Here are some tests I wrote yesterday for set functions:
@Test
def testSetFunctions() {
val a = MakeArray(Seq(I32(1), I32(3), I32(7)), TArray(TInt32()))
val s = ToSet(a)
val t = ToSet(MakeArray(Seq(I32(3), I32(8)), TArray(TInt32())))
assertEvalsTo(s, Set(1, 3, 7))
assertEvalsTo(invoke("toSet", a), Set(1, 3, 7))
assertEvalsTo(invoke("contains", s, I32(3)), true)
assertEvalsTo(invoke("contains", s, I32(4)), false)
...
assertEvalsTo(invoke("union", s, t), Set(1, 3, 7, 8))
assertEvalsTo(invoke("intersection", s, t), Set(3))
}
Here is what it looks like with “one condition per test”. To share the common setup, I broke out the test into its own test class.
class TestSetFunctions {
val a = MakeArray(Seq(I32(1), I32(3), I32(7)), TArray(TInt32()))
val s = ToSet(a)
val t = ToSet(MakeArray(Seq(I32(3), I32(8)), TArray(TInt32())))
@Test def testToSet() {
assertEvalsTo(s, Set(1, 3, 7))
assertEvalsTo(invoke("toSet", a), Set(1, 3, 7))
}
@Test def testContains() {
assertEvalsTo(invoke("contains", s, I32(3)), true)
assertEvalsTo(invoke("contains", s, I32(4)), false)
}
...
@Test def testUnion() {
assertEvalsTo(invoke("union", s, t), Set(1, 3, 7, 8))
}
@Test def testIntersection() {
assertEvalsTo(invoke("intersection", s, t), Set(3))
}
}
Which do we prefer? This still feels like a lot of boilerplate to me.