Як встановити self.maxDiff в носі, щоб отримати повний вивід різниці?


78

При використанні nose 1.2.1 з Python 3.3.0, я іноді отримую повідомлення про помилку, подібне до наступного

======================================================================
FAIL: maxdiff2.test_equal
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/Users/loic/cmrsj/Calculus_II/scrap/maxdiff2.py", line 32, in test_equal
    assert_equal(str1, str2)
AssertionError: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a
diam lectus.\n [truncated]... != 'Suspendisse lectus leo, consectetur in tempor sit
amet, placerat quis neque.\nE [truncated]...
Diff is 1780 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.064s

FAILED (failures=1)

У багатьох ситуаціях, щоб зрозуміти, в чому насправді помилка, мені потрібно переглянути повний вихідний результат. Однак я не уявляю, як це встановити self.maxDiff. Погуглити на ніс і maxDiff не допомагає. З тією ж версією носа на Python 2.7.1 на екран друкується повна різниця.

Ось простий скрипт, який генерує помилку вище при запуску з nosetests-3.3:

from nose.tools import assert_equal

def test_equal():
    str1 = """\
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus.
Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec
consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero
egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem
lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida
lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.
Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim
sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in
urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam
pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris
vitae nisi at sem facilisis semper ac in est."""

    str2 = """\
Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque.
Etiam luctus porttitor lorem, sed suscipit est rutrum non. Curabitur lobortis
nisl a enim congue semper. Aenean commodo ultrices imperdiet. Vestibulum ut
justo vel sapien venenatis tincidunt. Phasellus eget dolor sit amet ipsum
dapibus condimentum vitae quis lectus. Aliquam ut massa in turpis dapibus
convallis. Praesent elit lacus, vestibulum at malesuada et, ornare et est. Ut
augue nunc, sodales ut euismod non, adipiscing vitae orci. Mauris ut placerat
justo. Mauris in ultricies enim. Quisque nec est eleifend nulla ultrices
egestas quis ut quam. Donec sollicitudin lectus a mauris pulvinar id aliquam
urna cursus. Cras quis ligula sem, vel elementum mi. Phasellus non ullamcorper
urna."""

    assert_equal(str1, str2)

Відповіді:


23

У мене була та сама проблема в Python 3 (з прочитання інших відповідей тут), і використання im_classне спрацювало. Фрагмент нижче працює в Python 3 (пор. Як знайти екземпляр зв’язаного методу в Python? ):

assert_equal.__self__.maxDiff = None

Як коментував @Louis, функції зручності - це прив'язані методи в Dummyекземплярі. Всі вони, здається, знаходяться в одному екземплярі, тому зміна цього, наприклад assert_equal, змінить це assert_dict_equalі так далі. З документації Python , __self__доступний з Python 2.6 і далі.


109

Ви можете встановити maxDiffв None.

Але вам доведеться фактично використовувати a unittest.TestCaseдля тестів, щоб це працювало. Це має спрацювати.

class MyTest(unittest.TestCase):

    maxDiff = None

    def test_diff(self):
          <your test here>

4
Я спробував це, і це не вирішує проблему. Інші варіанти теж не працюють (покласти self.maxDiff = Noneв __init__або в setUpМогло бути несумісність між носом і UnitTest.?
. Лоїк Сеген-C

Деякі подробиці: Я обмотав тестову функцію в unittest.TestCaseкласі , і я замінив ніс - й assert_equalз self.assertEqual. Потім, встановлення maxDiff=Noneв тілі класу дає правильний результат, якщо тест запускається з unittest. Однак це все ще не дає рішення при використанні носа. Це ця помилка в носі?
Loïc Séguin-C.

@ LoïcSéguin-C. Цілком може бути. Я б запропонував вам надіслати лист до списку розсилки (я припускаю, що він є) і запитати.
Леннарт Регебро

1
Для всіх, хто читає цю тему, ця відповідь спрацювала для мене. Я бачу, що автор використовує nose.tools замість unittest безпосередньо, тому, можливо, саме тому у них це не спрацювало.
keithhackbarth

1
Мені здається, це більш правильна відповідь, і вона була мертва.
Kees Briggs

29

Це працює в python 2.7:

    from unittest import TestCase
    TestCase.maxDiff = None

Він встановить за замовчуванням maxDiff для всіх екземплярів TestCase, включаючи той, до якого приєднані assert_equals та друзі.


4
Класно. Якщо ви також хочете побачити всі рядки в AssertionError, що передує різниці, ви можете збільшити максимальну довжину, виконавши:import unittest; unittest.util._MAX_LENGTH=1000
jdhildeb

4

Ось у вас це (що мені сказав Google):

# http://pdf2djvu.googlecode.com/hg/tests/common.py
try:
    from nose.tools import assert_multi_line_equal
except ImportError:
    assert_multi_line_equal = assert_equal
else:
    assert_multi_line_equal.im_class.maxDiff = None

Це не працює для Python 3, оскільки незв’язані методи були видалені, тому im_classатрибут не існує.
Loïc Séguin-C.

@ Loïc Те, що ви говорите про Python 3, є правильним, але я вважаю, що це не стосується nose.tools. Я дивлюся на nose/tools/trivial.pyфайл nose 1.3.0 і бачу, що спосіб створення assert_*функцій здійснюється шляхом вилучення їх з екземпляра фіктивного класу (що походить від unittest.TestCase). Тож вони не є необмеженими. (Судячи з журналу git для носа, так було принаймні два роки.)
Луї

2

У python 2.7.3, nose 1.3.0, для мене працює наступне:

assert_equal.im_class.maxDiff = None
assert_equal(huge_thing, other_huge_thing)

0

Для тих, хто використовує базову unittestбібліотеку. Приблизно так само, як ви можете досягти цього maxDiffполя:

import unittest

class Test_Something(unittest.TestCase):  
    def test_first_test(self):
        huge_custom_object = CustomObject()
        expected_object = CustomObject(customVars)

        self.assertEqual.__self__.maxDiff = None
        self.assertEqual(huge_custom_object , expected_object )

if __name__ == '__main__':
    unittest.main()

-1

Нещодавно я зіткнувся з цією проблемою .... Я змушував рядок типу MS закінчуватися ....

MSstr="""hi\r
there\r"""
expected="""hi
there"""

self.assertEqual(MSsrt, expected) 

Це розбилося з жахливими помилками, які використовують інші.

У PyCharm сказали, що файли ідентичні !!

Я видалив \ r - більше аварій не буде, і тести тепер проходять.

Сподіваюся, це економить комусь 2 години, які мені це коштували.


У цьому немає нульового пояснення. Нічого про подібність до питання ОП. Я бачу, у вас є символ повернення каретки, але ви нічого не пояснюєте, чому б ви використовували їх таким чином і чому ви очікуєте, що це буде те саме. Також чітке його видалення додасть ті самі результати.
MattSom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.