Доктест Python: результат с несколькими строками

Я не могу заставить doctest работать с результатом, который содержит несколько строк и может содержать пустые строки в начале. Вероятно, это вызвано проблемами с отступами и синтаксическим анализом. Я нашел несколько решений:

  • Запишите желаемый результат в файл и doctest сравните результат с содержимым файла.
  • Сравните хэш результата с известным хешем. Основным недостатком этого подхода является то, что читатель doctest очень мало узнает о желаемом результате.
  • Найдите способ заставить doctest работать с многострочными результатами.
  • Используйте unittest вместо doctest.

Любые идеи?

Код:

    >>> 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="javascript" 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>

Ошибка:

**********************************************************************
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.

person Adam Matan    schedule 08.02.2011    source источник


Ответы (3)


Поместите <BLANKLINE> в ожидаемый результат, как показано в сообщении об ошибке. Тогда тест должен работать нормально. Ожидаемый ввод заканчивается на первой строке только с пробелами, поэтому вы должны специально пометить ее:

>>> 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>

См. документацию doctest, в которой это объясняется: http://docs.python.org/library/doctest.html#how-are-docstring-examples-recognized

person Duncan    schedule 08.02.2011
comment
+1 ACC работает, но все еще много ошибок, вызванных несоответствием отступов. Возможно, doctest — не лучший инструмент для работы. - person Adam Matan; 08.02.2011

Используйте <BLANKLINE> для указания пустых строк в выводе, точно так же, как вывод ошибки говорит ;-)

person Community    schedule 08.02.2011

Помимо использования <BLANKLINE>, как это предлагается в других ответах, эта опция может быть полезна:

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

Особенно, если ожидаемый вывод содержит символы \r (возврат каретки), и в этом случае <BLANKLINE> не будет соответствовать без установленного NORMALIZE_WHITESPACE.

person jcomeau_ictx    schedule 14.07.2021