<div dir="ltr"><div class="gmail_default" style="font-family:arial,sans-serif">I&#39;m using Ned Batchelder&#39;s coverage package to investigate spots in my code which aren&#39;t being exercised. Looking at the ,cover file for one module, I saw:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">&gt; def encode_oparg(tup):</font></div><div class="gmail_default" style=""><font face="monospace">&gt;     &quot;smash tuple back into oparg int&quot;</font></div><div class="gmail_default" style=""><font face="monospace">!     oparg = 0</font></div><div class="gmail_default" style=""><font face="monospace">!     for elt in tup:</font></div><div class="gmail_default" style=""><font face="monospace">!         oparg = oparg &lt;&lt; 8 | elt</font></div><div class="gmail_default" style=""><font face="monospace">!     return oparg</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Recognizing that my code doesn&#39;t normally use that function, I added an explicit example to my unit tests:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">from rattlesnake import instructions, opcodes, util</font></div><div class="gmail_default" style=""><font face="monospace">...</font></div><div class="gmail_default" style=""><font face="monospace">    def test_util_encode(self):</font></div><div class="gmail_default" style=""><font face="monospace">        self.assertEqual(util.encode_oparg((1, 24, 2)), 71682)</font></div><div class="gmail_default" style=""><font face="monospace">        self.assertEqual(util.encode_oparg(()), 0)</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">(Actually, the first assert was already there. I only added the second.) That changed nothing, which surprised me. </div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">I&#39;ve got a simple Makefile to drive the process:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">COVERAGE = $(HOME)/.local/bin/coverage</font></div><div class="gmail_default" style=""><font face="monospace">RATSRC = $(PWD)/Lib/rattlesnake</font></div><div class="gmail_default" style=""><font face="monospace">all : FORCE</font></div><div class="gmail_default" style=""><font face="monospace">        $(COVERAGE) erase</font></div><div class="gmail_default" style=""><font face="monospace">        $(COVERAGE) run -a --source=$(RATSRC) $(HOME)/tmp/junk.py</font></div><div class="gmail_default" style=""><font face="monospace">        $(COVERAGE) run -a --source=$(RATSRC) ./Tools/scripts/run_tests.py -v test_rattlesnake</font></div><div class="gmail_default" style=""><font face="monospace">        $(COVERAGE) annotate</font></div><div class="gmail_default" style=""><font face="monospace">        $(COVERAGE) report</font></div><div class="gmail_default" style=""><font face="monospace"><br></font></div><div class="gmail_default" style=""><font face="monospace">FORCE :</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">When I run make, this section of output corresponds to running the unit tests:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">/home/skip/.local/bin/coverage run -a --source=/home/skip/src/python/cpython/Lib/rattlesnake ./Tools/scripts/run_tests.py -v test_rattlesnake</font></div><div class="gmail_default" style=""><font face="monospace">/home/skip/src/python/cpython/python -u -W default -bb -E -m test -r -w -j 0 -u all,-largefile,-audio,-gui -v test_rattlesnake</font></div><div class="gmail_default" style=""><font face="monospace">== CPython 3.9.0a5+ (heads/register:25d05303a7, Apr 2 2020, 06:27:03) [GCC 9.2.1 20191008]</font></div><div class="gmail_default" style=""><font face="monospace">== Linux-5.3.0-42-generic-x86_64-with-glibc2.30 little-endian</font></div><div class="gmail_default" style=""><font face="monospace">== cwd: /home/skip/src/python/cpython/build/test_python_14692</font></div><div class="gmail_default" style=""><font face="monospace">== CPU count: 8</font></div><div class="gmail_default" style=""><font face="monospace">== encodings: locale=UTF-8, FS=utf-8</font></div><div class="gmail_default" style=""><font face="monospace">Using random seed 7332863</font></div><div class="gmail_default" style=""><font face="monospace">0:00:00 load avg: 5.25 Run tests in parallel using 10 child processes</font></div><div class="gmail_default" style=""><font face="monospace">0:00:00 load avg: 5.25 [1/1] test_rattlesnake passed</font></div><div class="gmail_default" style=""><font face="monospace">test_long_block_function (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_nop (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_simple_branch_function (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_src_dst (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_trivial_function (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_util_LineNumberDict (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_util_decode (test.test_rattlesnake.InstructionTest) ... ok</font></div><div class="gmail_default" style=""><font face="monospace">test_util_encode (test.test_rattlesnake.InstructionTest) ... ok</font></div></blockquote><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 the output of the report command:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default"><span style="font-family:monospace">Name                              Stmts   Miss  Cover</span><br></div><div class="gmail_default"><font face="monospace">-----------------------------------------------------</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/__init__.py           0      0   100%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/blocks.py            63      4    94%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/converter.py        271     11    96%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/decorators.py        42     42     0%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/instructions.py     145      3    98%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/opcodes.py          163      0   100%</font></div><div class="gmail_default"><font face="monospace">Lib/rattlesnake/util.py              38      7    82%</font></div><div class="gmail_default"><font face="monospace">-----------------------------------------------------</font></div><div class="gmail_default"><font face="monospace">TOTAL                               722     67    91%</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif"></div><div class="gmail_default" style="font-family:arial,sans-serif">OTOH, if I extract the calls to decode_oparg and encode_oparg into my junk.py script:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><font face="monospace">print(decode_oparg(0) == (0,))<br>print(decode_oparg(71682, False) == (0, 1, 24, 2))<br>print(encode_oparg((1, 24, 2)) == 71682)<br>print(encode_oparg(()) == 0)</font></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">reported coverage of .../util.py goes up significantly:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">Name                              Stmts   Miss  Cover</font></div><div class="gmail_default" style=""><font face="monospace">-----------------------------------------------------</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/__init__.py           0      0   100%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/blocks.py            63      4    94%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/converter.py        271     11    96%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/decorators.py        42     42     0%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/instructions.py     145      3    98%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/opcodes.py          163      0   100%</font></div><div class="gmail_default" style=""><font face="monospace">Lib/rattlesnake/util.py              38      2    95%</font></div><div class="gmail_default" style=""><font face="monospace">-----------------------------------------------------</font></div><div class="gmail_default" style=""><font face="monospace">TOTAL                               722     62    91%</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Note the execution of test_util_decode and test_util_encode. I think the unit test run should contribute to the overall coverage, but at least some of it appears not to for some reason. Is there something I&#39;m doing wrong in setting up or executing my coverage commands?</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Thx,</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Skip Montanaro</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div>