<div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Is your run_tests.py executing &#39;python ... -m test ...&#39; in a subprocess?<br>
<br>
Have you done the necessary groundwork to enable multi-process coverage<br>
tracking?  I think not -- I don&#39;t see &#39;-p&#39; passed to &#39;coverage run&#39;, nor<br>
a &#39;coverage combine&#39; command in your Makefile.<br>
<br>
Do check the documentation:<br>
- <a href="https://coverage.readthedocs.io/en/latest/subprocess.html" rel="noreferrer" target="_blank">https://coverage.readthedocs.io/en/latest/subprocess.html</a> (which<br>
  page surprises me by not mentioning &#39;coverage combine&#39;, TBH)<br>
- <a href="https://coverage.readthedocs.io/en/latest/cmd.html#combining-data-files" rel="noreferrer" target="_blank">https://coverage.readthedocs.io/en/latest/cmd.html#combining-data-files</a></blockquote><div><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Thanks for your help, Marius. I&#39;m still stuck, however. I read the docs, replaced -a with -p and created a sitecustomize.py file in my checkout&#39;s Lib directory. Despite exiting with a zero status, this command:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">~/.local/bin/coverage run -p --source=${PWD}/Lib/rattlesnake ./Tools/scripts/run_tests.py test_rattlesnake</div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">produces no .coverage.HOSTNAME.PID.RANDOM file. This however does:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">~/.local/bin/coverage run -p --source=${PWD}/Lib/rattlesnake $(HOME)/tmp/junk.py</div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">The lack of any coverage data from running the unit test would seem to be at the root of my problem.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Here&#39;s my sitecustomize.py file:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">import coverage</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">print(&quot;&gt;&gt; coverage.process_startup()&quot;)</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">coverage.process_startup()</div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">and when executed, you can see the print() call produces the expected output. Alas, while every Python process clearly executed coverage.process_startup() and the overall test run exited with zero status, no .coverage.* files were produced.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">% /home/skip/.local/bin/coverage run -p --source=/home/skip/src/python/cpython/Lib/rattlesnake ./Tools/scripts/run_tests.py test_rattlesnake</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">&gt;&gt; coverage.process_startup()</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">/home/skip/src/python/cpython/python -u -W default -bb -E -m test -r -w -j 0 -u all,-largefile,-audio,-gui test_rattlesnake</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">&gt;&gt; coverage.process_startup()</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Using random seed 3070170</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0:00:00 load avg: 3.15 Run tests in parallel using 10 child processes</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0:00:00 load avg: 3.15 [1/1] test_rattlesnake passed</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">&gt;&gt; coverage.process_startup()</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">== Tests result: SUCCESS ==</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">1 test OK.</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Total duration: 462 ms</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tests result: SUCCESS</div></div><div class="gmail_quote">(python38) cpython% echo $?<br>0<br>(python38) cpython% find . -name &#39;.coverage*&#39; | wc -l<br>0<br><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Explicitly executing the Python process which runs the test_rattlesnake unit test produces no output despite successful exit status:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">(python38) cpython% /home/skip/src/python/cpython/python -u -W default -bb -E -m test -r -w -j 0 -u all,-largefile,-audio,-gui test_rattlesnake</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">&gt;&gt; coverage.process_startup()</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Using random seed 9943159</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0:00:00 load avg: 3.92 Run tests in parallel using 10 child processes</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0:00:00 load avg: 3.92 [1/1] test_rattlesnake passed</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">&gt;&gt; coverage.process_startup()</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">== Tests result: SUCCESS ==</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">1 test OK.</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Total duration: 467 ms</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tests result: SUCCESS</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">(python38) cpython% echo $?</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">(python38) cpython% find . -name &#39;.coverage*&#39; | wc -l</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">0</div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">I added --debug=trace to the coverage run command line. When processing the junk.py source file it lists the Lib/rattlesnake files I want traced, but not when processing the test_rattlesnake unit test:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">(python38) cpython% make -f Makefile.coverage 2&gt;&amp;1 | egrep &#39;coverage run|Tracing&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">/home/skip/.local/bin/coverage run -p --debug=trace --source=/home/skip/src/python/cpython/Lib/rattlesnake /home/skip/tmp/junk.py</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/__init__.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/converter.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/opcodes.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/blocks.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/instructions.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">Tracing &#39;/home/skip/src/python/cpython/Lib/rattlesnake/util.py&#39;</div></div><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif">/home/skip/.local/bin/coverage run -p --debug=trace --source=/home/skip/src/python/cpython/Lib/rattlesnake ./Tools/scripts/run_tests.py test_rattlesnake</div></div></blockquote><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">It does tell me about a bunch of other files it won&#39;t be tracing, but doesn&#39;t mention my Lib/rattlesnake files at all.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">If my reading of the documentation is correct, I am now doing what I need to do, but for whatever reason coverage is ignoring the files I explicitly want traced, so I get very incomplete coverage results. Any further insight you have would be appreciated.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Skip</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div></div>