Skip to content

Commit 1aa41e1

Browse files
Mal Millermmiller-max
Mal Miller
authored andcommitted
Make ReportingTestSet behaviour consistent
1 parent b5080ac commit 1aa41e1

10 files changed

+96
-29
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "TestReports"
22
uuid = "dcd651b4-b50a-5b6b-8f22-87e9f253a252"
3-
version = "0.3.3"
3+
version = "0.4.0"
44

55
[deps]
66
EzXML = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"

bin/reporttests.jl

-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ ts = @testset ReportingTestSet "" begin
1111
include($(repr(testfilename)))
1212
end
1313
14-
display_reporting_testset(ts)
15-
1614
open("testlog.xml","w") do fh
1715
print(fh, report(ts))
1816
end

src/TestReports.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ using EzXML
77
import Test: AbstractTestSet, DefaultTestSet, record, finish, get_testset_depth, get_testset
88
import Test: Result, Fail, Broken, Pass, Error, scrub_backtrace
99

10-
export ReportingTestSet, any_problems, report, display_reporting_testset,
11-
recordproperty
10+
export ReportingTestSet, any_problems, report, recordproperty
1211

1312
include("./testsets.jl")
1413
include("to_xml.jl")

src/runner.jl

-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ function gen_runner_code(testfilename, logfilename, testreportsdir, test_args)
1616
include($(repr(testfilename)))
1717
end
1818
19-
display_reporting_testset(ts)
20-
2119
write($(repr(logfilename)), report(ts))
2220
any_problems(ts) && exit(TestReports.TESTS_FAILED)
2321
"""

src/testsets.jl

+24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
1+
"""
2+
ReportingTestSet
3+
4+
Custom `AbstractTestSet` type designed to be used by `TestReports.jl` for
5+
creation of JUnit XMLs.
6+
7+
Does not throw an error when a test fails or has an error. Upon `finish`ing,
8+
a `ReportingTestSet` will display the default test output, and then flatten
9+
to a structure that is suitable for report generation.
10+
11+
It is designed to be wrapped around a package's `runtests.jl` file and this
12+
is assumed when both the test results are displayed and when the `TestSet` is
13+
flatted upon `finish`. See `bin/reporttests.jl` for an example of this use.
14+
`ReportingTestSet`s are not designed to be used directly in a package's tests,
15+
and this is not recommended or supported.
116
17+
A `ReportingTestSet` has the `description` and `results` fields as per a
18+
`DefaultTestSet`, and has an additional `properties` field which is used
19+
to record properties to be inserted into the report.
20+
21+
See also: [`flatten_results!`](@ref), [`recordproperty`](@ref), [`report`](@ref)
22+
"""
223
mutable struct ReportingTestSet <: AbstractTestSet
324
description::String
425
results::Vector
@@ -19,6 +40,9 @@ function finish(ts::ReportingTestSet)
1940
return ts
2041
end
2142

43+
# Display before flattening to match Pkg.test output
44+
display_reporting_testset(ts)
45+
2246
# We are the top level, lets do this
2347
flatten_results!(ts)
2448
end

src/to_xml.jl

+15
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ That is, the results of the top level `TestSet` must all be `AbstractTestSet`s,
120120
and the results of those `TestSet`s must all be `Results`.
121121
"""
122122
function report(ts::AbstractTestSet)
123+
check_ts_structure(ts)
123124
total_ntests = 0
124125
total_nfails = 0
125126
total_nerrors = 0
@@ -142,6 +143,20 @@ function report(ts::AbstractTestSet)
142143
xdoc
143144
end
144145

146+
"""
147+
check_ts_structure(ts::AbstractTestSet)
148+
149+
Throws an exception if `ts` does not have the right structure for `report`.
150+
151+
See also: [`report`](@ref)
152+
"""
153+
function check_ts_structure(ts::AbstractTestSet)
154+
!all(isa.(ts.results, AbstractTestSet)) && throw(ArgumentError("Results of ts must all be AbstractTestSets. See documentation for `report`."))
155+
for result in ts.results
156+
!all(isa.(result.results, Result)) && throw(ArgumentError("Results of each AbstractTestSet in ts.results must all be Results. See documentation for `report`."))
157+
end
158+
end
159+
145160
"""
146161
to_xml(ts::AbstractTestSet)
147162

test/recordproperty.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ end
8787
TestReports.test(pkg)
8888
end
8989
logfile = joinpath(@__DIR__, "testlog.xml")
90-
@test_reference "references/test_with_properties.txt" open(f->read(f, String), logfile) |> clean_report
90+
@test_reference "references/test_with_properties.txt" open(f->read(f, String), logfile) |> clean_output
9191
end
9292

9393
# Test for warning when ID set twice

test/runtests.jl

+31-2
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,18 @@ include("testsets.jl")
1212
include("recordproperty.jl")
1313

1414
@testset "SingleNest" begin
15-
@test_reference "references/singlenest.txt" read(`$(Base.julia_cmd()) -e "using Test; using TestReports; (@testset ReportingTestSet \"blah\" begin @testset \"a\" begin @test 1 ==1 end end) |> report |> print"`, String) |> clean_report
15+
@test_reference "references/singlenest.txt" read(`$(Base.julia_cmd()) -e "using Test; using TestReports; (@testset ReportingTestSet \"blah\" begin @testset \"a\" begin @test 1 ==1 end end) |> report |> print"`, String) |> clean_output
1616
end
1717

1818
@testset "Complex Example" begin
19-
@test_reference "references/complexexample.txt" read(`$(Base.julia_cmd()) $(@__DIR__)/example.jl`, String) |> clean_report
19+
@test_reference "references/complexexample.txt" read(`$(Base.julia_cmd()) $(@__DIR__)/example.jl`, String) |> clean_output
2020
end
2121

2222
@testset "Chained failing test - Issue #25" begin
2323
ts = @testset ReportingTestSet begin
24+
ts = @testset ReportingTestSet begin
2425
@test 1==1 && 1==0
26+
end
2527
end
2628
@test report(ts) isa Any # Would fail before #25
2729
end
@@ -180,5 +182,32 @@ end
180182
rm(new_path, recursive=true)
181183
end
182184

185+
@testset "record - check_ts_structure" begin
186+
# No top level testset
187+
ts = @testset NoFlattenReportingTestSet begin
188+
@test true
189+
end
190+
@test_throws ArgumentError TestReports.check_ts_structure(ts)
191+
192+
# Not flattened
193+
ts = @testset NoFlattenReportingTestSet begin
194+
@testset NoFlattenReportingTestSet begin
195+
@test true
196+
@testset NoFlattenReportingTestSet begin
197+
@test true
198+
end
199+
end
200+
end
201+
@test_throws ArgumentError TestReports.check_ts_structure(ts)
202+
203+
# Correct structure
204+
ts = @testset NoFlattenReportingTestSet begin
205+
@testset NoFlattenReportingTestSet begin
206+
@test true
207+
end
208+
end
209+
@test TestReports.check_ts_structure(ts) isa Any # Doesn't error
210+
end
211+
183212
# clean up locally cached registry
184213
rm(joinpath(@__DIR__, "registries"); force=true, recursive=true)

test/testsets.jl

+1-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,7 @@
11
using Test
2-
import Test: finish, record, AbstractTestSet, Result, get_testset_depth, get_testset,
3-
Pass, Fail, Broken, Error
2+
import Test: AbstractTestSet, Result, Pass, Fail, Broken, Error
43
using TestReports
54

6-
mutable struct NoFlattenReportingTestSet <: AbstractTestSet
7-
description::AbstractString
8-
results::Vector
9-
end
10-
NoFlattenReportingTestSet(desc) = NoFlattenReportingTestSet(desc, [])
11-
record(ts::NoFlattenReportingTestSet, t) = (push!(ts.results, t); t)
12-
function finish(ts::NoFlattenReportingTestSet)
13-
if get_testset_depth() != 0
14-
# Attach this test set to the parent test set
15-
parent_ts = get_testset()
16-
record(parent_ts, ts)
17-
return ts
18-
end
19-
return ts
20-
end
21-
225
@testset "handle_top_level_results!" begin
236
# Simple top level resuls
247
ts = @testset NoFlattenReportingTestSet "" begin

test/utils.jl

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Pkg, Test, LibGit2
2+
import Test: finish, record, AbstractTestSet, get_testset_depth, get_testset
23

34
# Strip the filenames from the string, so that the reference strings work on different computers
45
strip_filepaths(str) = replace(str, r" at .*\d+$"m => "")
@@ -12,7 +13,10 @@ replace_Int32s(str) = replace(str, "Int32" => "Int64")
1213
# remove stacktraces so reference strings work for different Julia versions
1314
remove_stacktraces(str) = replace(str, r"(Stacktrace:)[^<]*" => "")
1415

15-
const clean_report = replace_Int32s replace_windows_filepaths strip_filepaths remove_stacktraces
16+
# remove test output - remove everything before "<?xml version"
17+
remove_test_output(str) = replace(str, r"^[\S\s]*(?=(<\?xml version))" => "")
18+
19+
const clean_output = replace_Int32s replace_windows_filepaths strip_filepaths remove_stacktraces remove_test_output
1620

1721
"""
1822
`copy_test_package` copied from [`Pkg.jl/test/utils.jl`](https://github.com/JuliaLang/Pkg.jl/blob/v1.4.2/test/utils.jl#L209).
@@ -146,3 +150,20 @@ function test_active_package_expected_fail(pkg::String)
146150
@test_throws TestReports.PkgTestError TestReports.test(pkg)
147151
end
148152
end
153+
154+
# Test TestSets
155+
mutable struct NoFlattenReportingTestSet <: AbstractTestSet
156+
description::AbstractString
157+
results::Vector
158+
end
159+
NoFlattenReportingTestSet(desc) = NoFlattenReportingTestSet(desc, [])
160+
record(ts::NoFlattenReportingTestSet, t) = (push!(ts.results, t); t)
161+
function finish(ts::NoFlattenReportingTestSet)
162+
if get_testset_depth() != 0
163+
# Attach this test set to the parent test set
164+
parent_ts = get_testset()
165+
record(parent_ts, ts)
166+
return ts
167+
end
168+
return ts
169+
end

0 commit comments

Comments
 (0)