mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 03:15:00 +00:00
test: Show the average time per test
Show the average duration of a test, so we can keep track of how it is trending. Report the suite with the longest average test to encourage people to improve it. Add a function to update the stats based on the results from a single suite and another to show the summary information. Make this optional, since sandbox's SPL tests do not have a timer driver and people may want to print results without times. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
5f6a59e03e
commit
b85df267e1
3 changed files with 43 additions and 3 deletions
|
@ -33,6 +33,8 @@ struct ut_stats {
|
||||||
* @cur: Statistics for the current run
|
* @cur: Statistics for the current run
|
||||||
* @total: Statistics for all test runs
|
* @total: Statistics for all test runs
|
||||||
* @run_count: Number of times ut_run_list() has been called
|
* @run_count: Number of times ut_run_list() has been called
|
||||||
|
* @worst: Sute which had the first per-text run time
|
||||||
|
* @worst_ms: Time taken by that test
|
||||||
* @start: Store the starting mallinfo when doing leak test
|
* @start: Store the starting mallinfo when doing leak test
|
||||||
* @of_live: true to use livetree if available, false to use flattree
|
* @of_live: true to use livetree if available, false to use flattree
|
||||||
* @of_root: Record of the livetree root node (used for setting up tests)
|
* @of_root: Record of the livetree root node (used for setting up tests)
|
||||||
|
@ -56,6 +58,8 @@ struct unit_test_state {
|
||||||
struct ut_stats cur;
|
struct ut_stats cur;
|
||||||
struct ut_stats total;
|
struct ut_stats total;
|
||||||
int run_count;
|
int run_count;
|
||||||
|
const struct suite *worst;
|
||||||
|
int worst_ms;
|
||||||
struct mallinfo start;
|
struct mallinfo start;
|
||||||
struct device_node *of_root;
|
struct device_node *of_root;
|
||||||
bool of_live;
|
bool of_live;
|
||||||
|
|
|
@ -192,6 +192,36 @@ static int run_suite(struct unit_test_state *uts, struct suite *ste,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void show_stats(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
if (uts->run_count < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ut_report(&uts->total, uts->run_count);
|
||||||
|
if (CONFIG_IS_ENABLED(UNIT_TEST_DURATION) &&
|
||||||
|
uts->total.test_count && uts->worst) {
|
||||||
|
ulong avg = uts->total.duration_ms / uts->total.test_count;
|
||||||
|
|
||||||
|
printf("Average test time: %ld ms, worst case '%s' took %d ms\n",
|
||||||
|
avg, uts->worst->name, uts->worst_ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_stats(struct unit_test_state *uts, const struct suite *ste)
|
||||||
|
{
|
||||||
|
if (CONFIG_IS_ENABLED(UNIT_TEST_DURATION) && uts->cur.test_count) {
|
||||||
|
ulong avg;
|
||||||
|
|
||||||
|
avg = uts->cur.duration_ms ?
|
||||||
|
uts->cur.duration_ms /
|
||||||
|
uts->cur.test_count : 0;
|
||||||
|
if (avg > uts->worst_ms) {
|
||||||
|
uts->worst_ms = avg;
|
||||||
|
uts->worst = ste;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int do_ut_all(struct unit_test_state *uts, struct cmd_tbl *cmdtp,
|
static int do_ut_all(struct unit_test_state *uts, struct cmd_tbl *cmdtp,
|
||||||
int flag, int argc, char *const argv[])
|
int flag, int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
|
@ -208,6 +238,7 @@ static int do_ut_all(struct unit_test_state *uts, struct cmd_tbl *cmdtp,
|
||||||
retval = run_suite(uts, ste, cmdtp, flag, 1, argv);
|
retval = run_suite(uts, ste, cmdtp, flag, 1, argv);
|
||||||
if (!any_fail)
|
if (!any_fail)
|
||||||
any_fail = retval;
|
any_fail = retval;
|
||||||
|
update_stats(uts, ste);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ut_report(&uts->total, uts->run_count);
|
ut_report(&uts->total, uts->run_count);
|
||||||
|
@ -306,6 +337,7 @@ static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||||
|
|
||||||
ret = run_suite(&uts, ste, cmdtp, flag, argc, argv);
|
ret = run_suite(&uts, ste, cmdtp, flag, argc, argv);
|
||||||
}
|
}
|
||||||
|
show_stats(&uts);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
ut_uninit_state(&uts);
|
ut_uninit_state(&uts);
|
||||||
|
|
|
@ -677,12 +677,16 @@ static int ut_run_tests(struct unit_test_state *uts, const char *prefix,
|
||||||
void ut_report(struct ut_stats *stats, int run_count)
|
void ut_report(struct ut_stats *stats, int run_count)
|
||||||
{
|
{
|
||||||
if (run_count > 1)
|
if (run_count > 1)
|
||||||
printf("Suites run: %d, total tests", run_count);
|
printf("Total tests");
|
||||||
else
|
else
|
||||||
printf("Tests");
|
printf("Tests");
|
||||||
printf(" run: %d, ", stats->test_count);
|
printf(" run: %d, ", stats->test_count);
|
||||||
if (stats)
|
if (stats && stats->test_count) {
|
||||||
printf("%ld ms, ", stats->duration_ms);
|
ulong dur = stats->duration_ms;
|
||||||
|
|
||||||
|
printf("%ld ms, average: %ld ms, ", dur,
|
||||||
|
dur ? dur / stats->test_count : 0);
|
||||||
|
}
|
||||||
if (stats->skip_count)
|
if (stats->skip_count)
|
||||||
printf("skipped: %d, ", stats->skip_count);
|
printf("skipped: %d, ", stats->skip_count);
|
||||||
printf("failures: %d\n", stats->fail_count);
|
printf("failures: %d\n", stats->fail_count);
|
||||||
|
|
Loading…
Add table
Reference in a new issue