Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: third_party/coverage-3.6/doc/branch.rst

Issue 14988009: First cut of testing infrastructure for recipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: nitfixen Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/coverage-3.6/doc/api.rst ('k') | third_party/coverage-3.6/doc/changes.rst » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/coverage-3.6/doc/branch.rst
diff --git a/third_party/coverage-3.6/doc/branch.rst b/third_party/coverage-3.6/doc/branch.rst
new file mode 100644
index 0000000000000000000000000000000000000000..13b9dc6de6ec2948df4a22b45e57bc517630954a
--- /dev/null
+++ b/third_party/coverage-3.6/doc/branch.rst
@@ -0,0 +1,120 @@
+.. _branch:
+
+===========================
+Branch coverage measurement
+===========================
+
+:history: 20091127T201300, new for version 3.2
+:history: 20100725T211700, updated for 3.4.
+:history: 20110604T181700, updated for 3.5.
+:history: 20111214T181800, Fix a bug that Guido pointed out.
+
+.. highlight:: python
+ :linenothreshold: 5
+
+
+In addition to the usual statement coverage, Coverage.py also supports branch
+coverage measurement. Where a line in your program could jump to more than one
+next line, coverage.py tracks which of those destinations are actually visited,
+and flags lines that haven't visited all of their possible destinations.
+
+For example::
+
+ def my_partial_fn(x): # line 1
+ if x: # 2
+ y = 10 # 3
+ return y # 4
+
+ my_partial_fn(1)
+
+In this code, line 2 is an ``if`` statement which can go next to either line 3
+or line 4. Statement coverage would show all lines of the function as executed.
+But the if was never evaluated as false, so line 2 never jumps to line 4.
+
+Branch coverage will flag this code as not fully covered because of the missing
+jump from line 2 to line 4. This is known as a partial branch.
+
+
+How to measure branch coverage
+------------------------------
+
+To measure branch coverage, run coverage.py with the ``--branch`` flag::
+
+ coverage run --branch myprog.py
+
+When you report on the results with ``coverage report`` or ``coverage html``,
+the percentage of branch possibilities taken will be included in the percentage
+covered total for each file. The coverage percentage for a file is the actual
+executions divided by the execution opportunities. Each line in the file is an
+execution opportunity, as is each branch destination.
+
+The HTML report gives information about which lines had missing branches. Lines
+that were missing some branches are shown in yellow, with an annotation at the
+far right showing branch destination line numbers that were not exercised.
+
+The XML report produced by ``coverage xml`` also includes branch information,
+including separate statement and branch coverage percentages.
+
+
+How it works
+------------
+
+When measuring branches, coverage.py collects pairs of line numbers, a source
+and destination for each transition from one line to another. Static analysis
+of the compiled bytecode provides a list of possible transitions. Comparing
+the measured to the possible indicates missing branches.
+
+The idea of tracking how lines follow each other was from `Titus Brown`__.
+Thanks, Titus!
+
+__ http://ivory.idyll.org/blog
+
+
+Excluding code
+--------------
+
+If you have :ref:`excluded code <excluding>`, a condtional will not be
+counted as a branch if one of its choices is excluded::
+
+ def only_one_choice(x):
+ if x:
+ blah1()
+ blah2()
+ else: # pragma: no cover
+ # x is always true.
+ blah3()
+
+Because the ``else`` clause is excluded, the ``if`` only has one possible
+next line, so it isn't considered a branch at all.
+
+
+Structurally partial branches
+-----------------------------
+
+Sometimes branching constructs are used in unusual ways that don't actually
+branch. For example::
+
+ while True:
+ if cond:
+ break
+ do_something()
+
+Here the while loop will never exit normally, so it doesn't take both of its
+"possible" branches. For some of these constructs, such as "while True:" and
+"if 0:", coverage.py understands what is going on. In these cases, the line
+will not be marked as a partial branch.
+
+But there are many ways in your own code to write intentionally partial
+branches, and you don't want coverage.py pestering you about them. You can
+tell coverage.py that you don't want them flagged by marking them with a
+pragma::
+
+ i = 0
+ while i < 999999999: # pragma: no branch
+ if eventually():
+ break
+
+Here the while loop will never complete because the break will always be taken
+at some point. Coverage.py can't work that out on its own, but the
+"no branch" pragma indicates that the branch is known to be partial, and
+the line is not flagged.
« no previous file with comments | « third_party/coverage-3.6/doc/api.rst ('k') | third_party/coverage-3.6/doc/changes.rst » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698