run.json in split format
= Summary =
The run.json file has data about a particular test run. It has information
about the test, including the results for the test.
|
{{TableOfContents}}
= Summary =
The run.json file has data about a particular test run. It has information
about the test, including the results for the test.
|
The format of portions of this file was inspired by the KernelCI API. See https://api.kernelci.org/schema-test-case.html
|
The format of portions of this file was inspired by the KernelCI API. See https://api.kernelci.org/schema-test-case.html
|
The results are included in an array of test_set objects, which can contain
arrays of test_case objects, which themselves may contain measurement objects.
|
The results are included in an array of test_set objects, which can contain
arrays of test_case objects, which themselves may contain measurement objects.
|
|
== field details ==
* '''duration''' - the amount of time, in milliseconds, that the test took to execute
* if the test included a build, this time is included in this number
* '''metadata''' - various fields that are specific to Fuego
* '''attachments''' - a list of the files that are available for this test - usually logs and such
* '''batch_id''' - a string indicating the batch of tests this test was run in (if applicable)
* '''board''' - the board the test was executed on
* '''build_number''' - the Jenkins build number
* '''compiled_on''' - indicates the location where the test was compiled
* '''fuego_core_version''' - version of the fuego core system
* '''fuego_version''' - version of the fuego container system
* '''host_name''' - the host. If not configured, it may be 'local_host'
* '''job_name''' - the Jenkins job name for this test run
* '''keep_log''' - indicates whether the log is kept (???)
* '''kernel_version''' - the version of the kernel running on the board
* '''reboot''' - indicates whether a reboot was requested for this test run
* '''rebuild''' - indicates whether it was requested to rebuild the source for this run
* '''start_time''' - time when this test run was started (in seconds since Jan 1, 1970)
* '''target_postcleanup''' - indicates whether cleanup of test materials on the board was requested for after test execution
* '''target_precleanup''' - indicates whether cleanup of test materials on the board was requested for before test execution
* '''test_plan''' - test plan being executed for this test run. May be 'None' if test was not executed in the context of a larger plan
* '''test_spec''' - test spec used for this run
* '''testsuite_version''' - version of the source program used for this run
* FIXTHIS - testsuite_version is not calculated properly yet
* '''timestamp''' - time when this test run was started (in ISO 8601 format)
* '''toolchain''' - the toolchains (or PLATFORM) used to build the test program
* '''workspace''' - a directory on the host where test materials were extracted and built, for this test.
* This is the parent directory used, and not the specific directory used for this test.
|
- name - the name of the test
* status - the test result as a string. This can be one of:
* PASS
* FAIL
* ERROR
* SKIP
* test_sets - list of test_set objects, containing test results
* test_cases - list of test_case objects, containing test results
* each test_case object has:
* name - the test case name
* status - the result for that test case
* measurements - list of measurement objects, containing test results
* for each measurement, the following attributes may be present:
* name - the measure name
* status - the pass/fail result for that test case
* measure - the numeric result for that test case
|
* '''name''' - the name of the test
* '''status''' - the test result as a string. This can be one of:
* PASS
* FAIL
* ERROR
* SKIP
* '''test_sets''' - list of test_set objects, containing test results
* '''test_cases''' - list of test_case objects, containing test results
* each test_case object has:
* '''name''' - the test case name
* '''status''' - the result for that test case
* '''measurements''' - list of measurement objects, containing test results
* for each measurement, the following attributes may be present:
* '''name''' - the measure name
* '''status''' - the pass/fail result for that test case
* '''measure''' - the numeric result for that test case
|
|
= Examples =
Here are some sample run.json files, from Fuego 1.2
|
|
== Functional test results ==
This was generated using 'ftc run-test -b docker -t Functional.hello_world'
|
This example only has a single test_case.
|
This example only has a single test_case.
|
|
{{{#!YellowBox
{
"duration_ms": 1245,
"metadata": {
"attachments": [
{
"name": "devlog",
"path": "devlog.txt"
},
{
"name": "devlog",
"path": "devlog.txt"
},
{
"name": "syslog.before",
"path": "syslog.before.txt"
},
{
"name": "syslog.after",
"path": "syslog.after.txt"
},
{
"name": "testlog",
"path": "testlog.txt"
},
{
"name": "consolelog",
"path": "consolelog.txt"
},
{
"name": "test_spec",
"path": "spec.json"
}
],
"board": "docker",
"build_number": "3",
"compiled_on": "docker",
"fuego_core_version": "v1.1-805adb0",
"fuego_version": "v1.1-5ad677b",
"host_name": "fake_host",
"job_name": "docker.default.Functional.hello_world",
"keep_log": true,
"kernel_version": "3.19.0-47-generic",
"reboot": "false",
"rebuild": "false",
"start_time": "1509662455755",
"target_postcleanup": true,
"target_precleanup": "true",
"test_plan": "None",
"test_spec": "default",
"testsuite_version": "v1.1-805adb0",
"timestamp": "2017-11-02T22:40:55+0000",
"toolchain": "x86_64",
"workspace": "/fuego-rw/buildzone"
},
"name": "Functional.hello_world",
"schema_version": "1.0",
"status": "PASS",
"test_sets": [
{
"name": "default",
"status": "PASS",
"test_cases": [
{
"name": "hello_world",
"status": "PASS"
}
]
}
]
}
}}}
|
|
== Benchmark results ==
Here is the run.json file for a run of the test 'Benchmark.netperf' on the board 'ren1' (which is a Renesas board in my lab).
|
|
{{{#!YellowBox
{
"duration_ms": 33915,
"metadata": {
"attachments": [
{
"name": "devlog",
"path": "devlog.txt"
},
{
"name": "devlog",
"path": "devlog.txt"
},
{
"name": "syslog.before",
"path": "syslog.before.txt"
},
{
"name": "syslog.after",
"path": "syslog.after.txt"
},
{
"name": "testlog",
"path": "testlog.txt"
},
{
"name": "consolelog",
"path": "consolelog.txt"
},
{
"name": "test_spec",
"path": "spec.json"
}
],
"board": "ren1",
"build_number": "3",
"compiled_on": "docker",
"fuego_core_version": "v1.2.0",
"fuego_version": "v1.2.0",
"host_name": "local_host",
"job_name": "ren1.default.Benchmark.netperf",
"keep_log": true,
"kernel_version": "4.9.0-yocto-standard",
"reboot": "false",
"rebuild": "false",
"start_time": "1509669904085",
"target_postcleanup": true,
"target_precleanup": "true",
"test_plan": "None",
"test_spec": "default",
"testsuite_version": "v1.1-805adb0",
"timestamp": "2017-11-03T00:45:04+0000",
"toolchain": "poky-aarch64",
"workspace": "/fuego-rw/buildzone"
},
"name": "Benchmark.netperf",
"schema_version": "1.0",
"status": "PASS",
"test_sets": [
{
"name": "default",
"status": "PASS",
"test_cases": [
{
"measurements": [
{
"measure": 928.51,
"name": "net",
"status": "PASS"
},
{
"measure": 59.43,
"name": "cpu",
"status": "PASS"
}
],
"name": "MIGRATED_TCP_STREAM",
"status": "PASS"
},
{
"measurements": [
{
"measure": 934.1,
"name": "net",
"status": "PASS"
},
{
"measure": 56.61,
"name": "cpu",
"status": "PASS"
}
],
"name": "MIGRATED_TCP_MAERTS",
"status": "PASS"
}
]
}
]
}
}}}
|
|
= Ideas =
Some changes to the fields might be useful:
* We don't have anything that records the 'cause', from Jenkins
* this is supposed to indicate what triggered the test
* the Jenkins strings are somewhat indecipherable:
* Here is a Jenkins cause: <hudson.model.Cause_-UserIdCause/><int>1</int>
* it might be worthwhile to add some fields from the board or target:
* architecture
* transport - not sure about this one
* distrib
* file system
* if we add monitors or side-processes (stressors), it would be good to add information about those as well
|
|
== use of flat data ==
Parsing the tree-structured data has turned out to be a real pain,
and it might be better to do most of the work in a flat format. The charting
code uses a mixture of both structured (nested objects) and flat testcase
names, and I think there's a lot of duplicate code lying around that handles
the conversion back and forth, that could probably be coalesced into a
single set of library routines.
|
|