I am trying to get test splitting to work. I am using Django with nosetest as the test runner. Using the default python setup suggested, I get the dreaded:
Error autodetecting timing type, falling back to weighting by name.
I have looked at the output format of junit.xml
generated by nose
and it looks like this:
<testsuite name="nosetests" tests="222" errors="0" failures="0" skip="0">
<testcase classname="module.tests.integration.api.v1.my_tests.TestGetSerialiserContext" name="my_test_one" time="2.000"/>
<testcase classname="module.tests.integration.api.v1.my_tests.TestGetSerialiserContext" name="my_test_two" time="0.517"/>
<testcase classname="module.tests.integration.api.v1.my_tests.TestGetSerialiserContext" name="my_test_three" time="6.142"/>
...
This seemed promising, and I altered my input so that the parameters passed to circle tests split
were in that exact format (using a python script to find the classnames of all my tests).
I changed my invocation to be like:
TESTFILES=$(python manage.py find_test_classes | circleci tests split --split-by=timings --timings-type=classname)
However now when I try running the pipeline I get output like the following:
No timing found for "module.tests.integration.api.v1.my_tests.TestGetSerialiserContext"
No timing found for "module.tests.integration.api.v1.my_tests.TestPostSerialiserContext"
No timing found for "module.tests.integration.api.v1.my_tests.TestPatchSerialiserContext"
etc. for every class.
I have extracted the test timings file (results.json
) from the pod and inspected it to see if I can find anything out there. But it looks like this:
{
"tests": [
{
"classname": "module.tests.integration.api.v1.my_tests.TestGetSerialiserContext",
"file": null,
"name": "my_test_one",
"result": "success",
"run_time": 7.015,
"message": null,
"source": "unknown",
"source_type": "unknown"
},
...
]
}
…which looks correct. What is going on, and how can I get my tests to split by timing properly?