<div><spanclass="k">Test time</span><spanclass="v">{{ self.time(r.time_ms) }}{% if let Some(d) = self.time_delta() %} <small>{{ d }}</small>{% endif %}</span></div>
29
{% if let Some(t) = first_ms %}<div><spanclass="k">Reporting since</span><spanclass="v small"><timetitle="{{ t|when_i }}">{{ t|ago_i }}</time></span></div>{% endif %}
{% if let Some(p) = previous %}<li>Against <ahref="{{ repo.url }}/tests?report={{ p.id }}">run #{{ p.run_number }}</a>: {{ broke.len() }} newly failing, {{ fixed.len() }} fixed{% if added > 0 %}, {{ added }} new tests{% endif %}</li>{% else %}<li>The first report of job {{ r.job }} here</li>{% endif %}
38
</ul>
39
{% if !broke.is_empty() %}<h3>Newly failing</h3>
40
<ulclass="t-list">{% for c in broke %}<li><spanclass="cov-poor">✕</span><code>{{ c.title }}</code></li>{% endfor %}</ul>{% endif %}
41
{% if !fixed.is_empty() %}<h3>Fixed</h3>
42
<ulclass="t-list">{% for c in fixed %}<li><spanclass="cov-good">✓</span><code>{{ c.title }}</code></li>{% endfor %}</ul>{% endif %}
43
</section>
44
<sectionclass="panel cov-card">
45
<h2>Flaky <smallclass="mute">failed and passed in the last {{ flaky_runs }} runs</small></h2>
46
{% if flaky.is_empty() %}<pclass="mute small">None: every test kept its result.</p>{% else %}
47
<tableclass="cov-moved">{% for f in flaky %}<tr><td><code>{{ f.title() }}</code></td><tdclass="num"><spanclass="cov-poor">{{ f.failed }} ✕</span><spanclass="cov-good">{{ f.passed }} ✓</span></td></tr>{% endfor %}</table>{% endif %}
48
</section>
49
</div>
50
51
{% if !failures.is_empty() %}<sectionclass="panel">
52
<h2>Failures <smallclass="mute">{{ r.broken() }} in run #{{ r.run_number }}{% if r.broken() > failures.len() as i64 %}, the first {{ failures.len() }} shown{% endif %}</small></h2>
53
<divclass="flow-tests">{% for f in failures %}<detailsclass="tests-failure">
<p>No test report for <strong>{{ bookmark }}</strong> yet.</p>
91
<p>Give a job in <code>.flow/pipeline.kdl</code> an artifact named <code>junit</code> holding a JUnit XML report, kept with <code>when "always"</code> so a failing run still sends it. For pytest:</p>
92
<pre>job "test" {
93
sandbox "python"
94
exec "pytest" "--junitxml=/src/out/junit.xml"
95
output {
96
artifact "junit" {
97
path "/src/out/junit.xml"
98
when "always"
99
}
100
}
101
}</pre>
102
<pclass="small mute">cargo-nextest (a <code>junit</code> profile), Jest's junit reporter and gotestsum write JUnit XML too.</p>