开发者

Python doctest: result with multiple lines

I can't get a doctest to work with a result which contains multiple lines and may contain empty lines at the beginning. This is probably caused by indentation and parsing issues. I've figured out some solutions:

  • Write the desired result to a file, and doctest the comparison between the result and the file contents.
  • Compare a hash of the result to a known hash. The main disadvantage of this approach is that the reader of the doctest learns very little about the desired result.
  • Find a way to make doctest work with multi line results.
  • Use unittest instead of doctest.

Any ideas?

Code:

    >>> data_lists=[ {"Average execution" : [1, 2, 3, 2, 3]},
    ...                              {"Top execution"     : [3, 4, 5, 7, 8, 11, 6]},
    ...                              {"Current execution" : [1, 2, 1, 2, 1, 5]}       ]
    >>> c=Chart(data_lists,
    ...         ("Large<br>rooster", "Rsync rooster", "Pool<br>Chicken", "Disease"),
    ...         width=700, height=300)
    >>> print c.html.strip()
    <div id="placeholder3" style="width:700px;height:300px"></div>

    <script id="source" language="javascr开发者_StackOverflowipt" type="text/javascript">
    $(function () {

    var d0 = [[0, 1], [4, 2], [8, 3], [12, 2], [16, 3]];
    var d1 = [[1, 3], [5, 4], [9, 5], [13, 7], [17, 8], [21, 11], [25, 6]];
    var d2 = [[2, 1], [6, 2], [10, 1], [14, 2], [18, 1], [22, 5]];

        $.plot($("#placeholder3"), [

        {   label: "Average execution",  data: d0,   bars: { show: true }  },
        {   label: "Top execution",  data: d1,   bars: { show: true }  },
        {   label: "Current execution",  data: d2,   bars: { show: true }  }

        ],
        {
            xaxis: { ticks: [[1.5, "Large<br>rooster"], [5.5, "Rsync<br>rooster"], [9.5, "Pool<br>Chicken"], [13.5, "Disease"]] }
        }
        );
    });
    </script>

Error:

**********************************************************************
File "HTML.py", line 28, in __main__.Chart.__init__
Failed example:
    print c.html.strip()
Expected:
    <div id="placeholder3" style="width:700px;height:300px"></div>
Got:
    <div id="placeholder3" style="width:700px;height:300px"></div>
    <BLANKLINE>
        <script id="source" language="javascript" type="text/javascript">
        $(function () {
    <BLANKLINE>
        var d0 = [[0, 1], [4, 2], [8, 3], [12, 2], [16, 3]];
        var d1 = [[1, 3], [5, 4], [9, 5], [13, 7], [17, 8], [21, 11], [25, 6]];
        var d2 = [[2, 1], [6, 2], [10, 1], [14, 2], [18, 1], [22, 5]];
    <BLANKLINE>
            $.plot($("#placeholder3"), [
    <BLANKLINE>
            {   label: "Average execution",  data: d0,   bars: { show: true }  },
            {   label: "Top execution",  data: d1,   bars: { show: true }  },
            {   label: "Current execution",  data: d2,   bars: { show: true }  }
    <BLANKLINE>
            ],
            {
                xaxis: { ticks: [[1.5, "Large<br>rooster"], [5.5, "Rsync rooster"], [9.5, "Pool<br>Chicken"], [13.5, "Disease"]] }
            }
            );
        });
        </script>
**********************************************************************
1 items had failures:
   1 of   3 in __main__.Chart.

__init__
***Test Failed*** 1 failures.


Put <BLANKLINE> in the expected output just like it shows in the error message. Then the test should work just fine. The expected input terminates at the first whitespace only line which is why you have to mark it specially:

>>> data_lists=[ {"Average execution" : [1, 2, 3, 2, 3]},
...                              {"Top execution"     : [3, 4, 5, 7, 8, 11, 6]},
...                              {"Current execution" : [1, 2, 1, 2, 1, 5]}       ]
>>> c=Chart(data_lists,
...         ("Large<br>rooster", "Rsync rooster", "Pool<br>Chicken", "Disease"),
...         width=700, height=300)
>>> print c.html.strip()
<div id="placeholder3" style="width:700px;height:300px"></div>
<BLANKLINE>
<script id="source" language="javascript" type="text/javascript">
$(function () {
<BLANKLINE>
var d0 = [[0, 1], [4, 2], [8, 3], [12, 2], [16, 3]];
var d1 = [[1, 3], [5, 4], [9, 5], [13, 7], [17, 8], [21, 11], [25, 6]];
var d2 = [[2, 1], [6, 2], [10, 1], [14, 2], [18, 1], [22, 5]];
<BLANKLINE>
    $.plot($("#placeholder3"), [
<BLANKLINE>
    {   label: "Average execution",  data: d0,   bars: { show: true }  },
    {   label: "Top execution",  data: d1,   bars: { show: true }  },
    {   label: "Current execution",  data: d2,   bars: { show: true }  }
<BLANKLINE>
    ],
    {
        xaxis: { ticks: [[1.5, "Large<br>rooster"], [5.5, "Rsync<br>rooster"], [9.5, "Pool<br>Chicken"], [13.5, "Disease"]] }
    }
    );
});
</script>

See the doctest documentation which explains this: http://docs.python.org/library/doctest.html#how-are-docstring-examples-recognized


Use <BLANKLINE> for indicating blank lines in output, just like the failure output says ;-)


Besides using <BLANKLINE> as suggested in the other answers, this option can be useful:

>>> print c.html.strip()  # doctest: +NORMALIZE_WHITESPACE

Especially if the expected output contains \r (carriage return) characters, in which case <BLANKLINE> won't match without NORMALIZE_WHITESPACE set.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜