Polish test result running and reporting (#738)

Changes:
* Move class `TestResults` to package `org.pkl.core`, because it is a public class (it's the result of `Evaluator#evaluateTest`)
* Change examples to treat individual examples as assertions in the same test. Previously, they were considered different tests with an incrementing number. This better aligns with how facts are treated.
* Change `TestResults` to be a record, and introduce builders.
* Remove "module" test result section (it is not really a section).
* Add javadoc to `TestResults`
* Formatting fix: prefix ✍️ emoji just like we do the  and  emojis 
* Consider writing examples as failures, not successes. `pkl test` will exit with code 10 if the only failing tests are due to writing examples.
This commit is contained in:
Daniel Chao
2024-10-28 21:05:13 -07:00
committed by GitHub
parent 666f8c3939
commit acd2222534
15 changed files with 851 additions and 708 deletions
@@ -112,34 +112,33 @@ class TestsTest : AbstractTest() {
assertThat(output.trimStart())
.startsWith(
"""
> Task :evalTestGatherImports
> Task :evalTestGatherImports
> Task :evalTest FAILED
pkl: TRACE: 8 = 8 (file:///file, line x)
module test
facts
✅ sum numbers
✅ divide numbers
❌ fail
4 == 9 (file:///file, line x)
"foo" == "bar" (file:///file, line x)
examples
✅ user 0
user 1 #0
❌ user 1 #1
(file:///file, line x)
Expected: (file:///file, line x)
new {
name = "Parrot"
age = 35
}
Actual: (file:///file, line x)
new {
name = "Welma"
age = 35
}
❌ 66.7% tests pass [2/6 failed], 66.7% asserts pass [3/9 failed]
"""
> Task :evalTest FAILED
pkl: TRACE: 8 = 8 (file:///file, line x)
module test
facts
✅ sum numbers
✅ divide numbers
❌ fail
4 == 9 (file:///file, line x)
"foo" == "bar" (file:///file, line x)
examples
✅ user 0
user 1
#1 (file:///file, line x):
Expected: (file:///file, line x)
new {
name = "Parrot"
age = 35
}
Actual: (file:///file, line x)
new {
name = "Welma"
age = 35
}
❌ 60.0% tests pass [2/5 failed], 66.7% asserts pass [3/9 failed]
"""
.trimIndent()
)
}
@@ -151,10 +150,10 @@ class TestsTest : AbstractTest() {
writeBuildFile("overwrite = true")
val output = runTask("evalTest").output
val output = runTask("evalTest", expectFailure = true).output
assertThat(output).contains("user 0 ✍️")
assertThat(output).contains("user 1 ✍️")
assertThat(output).contains("✍️ user 0")
assertThat(output).contains("✍️ user 1")
}
@Test
@@ -183,36 +182,36 @@ class TestsTest : AbstractTest() {
assertThat(output.trimStart())
.startsWith(
"""
> Task :evalTestGatherImports
> Task :evalTestGatherImports
> Task :evalTest FAILED
module test
facts
✅ should pass
❌ error
–– Pkl Error ––
exception
9 | throw("exception")
^^^^^^^^^^^^^^^^^^
at test#facts["error"][#1] (file:///file, line x)
examples
✅ user 0
❌ user 1
#1 (file:///file, line x):
Expected: (file:///file, line x)
new {
name = "Parrot"
age = 35
}
Actual: (file:///file, line x)
new {
name = "Welma"
age = 35
}
❌ 50.0% tests pass [2/4 failed], 66.7% asserts pass [2/6 failed]
> Task :evalTest FAILED
module test
facts
✅ should pass
❌ error
–– Pkl Error ––
exception
9 | throw("exception")
^^^^^^^^^^^^^^^^^^
at test#facts["error"][#1] (file:///file, line x)
examples
✅ user 0
✅ user 1 #0
❌ user 1 #1
(file:///file, line x)
Expected: (file:///file, line x)
new {
name = "Parrot"
age = 35
}
Actual: (file:///file, line x)
new {
name = "Welma"
age = 35
}
❌ 60.0% tests pass [2/5 failed], 66.7% asserts pass [2/6 failed]
"""
"""
.trimIndent()
)
}
@@ -232,34 +231,33 @@ class TestsTest : AbstractTest() {
assertThat(report)
.isEqualTo(
"""
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="test" tests="6" failures="2">
<testcase classname="test.facts" name="sum numbers"></testcase>
<testcase classname="test.facts" name="divide numbers"></testcase>
<testcase classname="test.facts" name="fail">
<failure message="Fact Failure">4 == 9 (file:///file, line x)</failure>
<failure message="Fact Failure">&quot;foo&quot; == &quot;bar&quot; (file:///file, line x)</failure>
</testcase>
<testcase classname="test.examples" name="user 0"></testcase>
<testcase classname="test.examples" name="user 1 #0"></testcase>
<testcase classname="test.examples" name="user 1 #1">
<failure message="Example Failure">(file:///file, line x)
Expected: (file:///file, line x)
new {
name = &quot;Parrot&quot;
age = 35
}
Actual: (file:///file, line x)
new {
name = &quot;Welma&quot;
age = 35
}</failure>
</testcase>
<system-err><![CDATA[8 = 8
]]></system-err>
</testsuite>
"""
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="test" tests="5" failures="2">
<testcase classname="test.facts" name="sum numbers"></testcase>
<testcase classname="test.facts" name="divide numbers"></testcase>
<testcase classname="test.facts" name="fail">
<failure message="Fact Failure">4 == 9 (file:///file, line x)</failure>
<failure message="Fact Failure">&quot;foo&quot; == &quot;bar&quot; (file:///file, line x)</failure>
</testcase>
<testcase classname="test.examples" name="user 0"></testcase>
<testcase classname="test.examples" name="user 1">
<failure message="Example Failure">#1 (file:///file, line x):
Expected: (file:///file, line x)
new {
name = &quot;Parrot&quot;
age = 35
}
Actual: (file:///file, line x)
new {
name = &quot;Welma&quot;
age = 35
}</failure>
</testcase>
<system-err><![CDATA[8 = 8
]]></system-err>
</testsuite>
"""
.trimIndent()
)
}
@@ -289,36 +287,35 @@ class TestsTest : AbstractTest() {
assertThat(report)
.isEqualTo(
"""
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="test" tests="5" failures="2">
<testcase classname="test.facts" name="should pass"></testcase>
<testcase classname="test.facts" name="error">
<error message="exception">–– Pkl Error ––
exception
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="test" tests="4" failures="2">
<testcase classname="test.facts" name="should pass"></testcase>
<testcase classname="test.facts" name="error">
<error message="exception">–– Pkl Error ––
exception
9 | throw(&quot;exception&quot;)
^^^^^^^^^^^^^^^^^^
at test#facts[&quot;error&quot;][#1] (file:///file, line x)
</error>
</testcase>
<testcase classname="test.examples" name="user 0"></testcase>
<testcase classname="test.examples" name="user 1">
<failure message="Example Failure">#1 (file:///file, line x):
Expected: (file:///file, line x)
new {
name = &quot;Parrot&quot;
age = 35
}
Actual: (file:///file, line x)
new {
name = &quot;Welma&quot;
age = 35
}</failure>
</testcase>
</testsuite>
9 | throw(&quot;exception&quot;)
^^^^^^^^^^^^^^^^^^
at test#facts[&quot;error&quot;][#1] (file:///file, line x)
</error>
</testcase>
<testcase classname="test.examples" name="user 0"></testcase>
<testcase classname="test.examples" name="user 1 #0"></testcase>
<testcase classname="test.examples" name="user 1 #1">
<failure message="Example Failure">(file:///file, line x)
Expected: (file:///file, line x)
new {
name = &quot;Parrot&quot;
age = 35
}
Actual: (file:///file, line x)
new {
name = &quot;Welma&quot;
age = 35
}</failure>
</testcase>
</testsuite>
"""
"""
.trimIndent()
)
}