Нос .tools.eq_ vs assertEqual

Проблема:

Мы долгое время использовали тестовый бегун nose.

Время от времени я вижу, что наши тесты имеют вызовы eq_():

eq_(actual, expected)

вместо обычного:

self.assertEqual(actual, expected)

Вопрос:

Есть ли какая-либо польза от использования nose.tools.eq_ в отличие от стандартной среды unittest assertEqual()? Действительно ли они эквивалентны?


Мысли:

Ну, для одного, eq_ короче, но его нужно импортировать из nose.tools, что делает тесты зависимыми от библиотеки тестового бегуна, что может затруднить переход на другой тестовый бегун, скажем, py.test. С другой стороны, мы также используем @istest, @nottest и @attr декораторы носа.

Ответ 1

Они не эквивалентны unittest.TestCase.assertEqual.

nose.tools.ok_ (expr, msg = None)

Сокращение для assert. Сохраняет 3 целых символа!

nose.tools.eq_ (a, b, msg = None)

Сокращенное выражение для 'assert a == b, "% r! =% r" % (a, b)

https://nose.readthedocs.org/en/latest/testing_tools.html#nose.tools.ok_

Эти документы, однако, вводят в заблуждение. Если вы проверите источник, вы увидите, что eq_ на самом деле:

def eq_(a, b, msg=None):
    if not a == b:
        raise AssertionError(msg or "%r != %r" % (a, b))

https://github.com/nose-devs/nose/blob/master/nose/tools/trivial.py#L25

Это довольно близко к основному случаю assertEqual:

def _baseAssertEqual(self, first, second, msg=None):
    """The default assertEqual implementation, not type specific."""
    if not first == second:
        standardMsg = '%s != %s' % _common_shorten_repr(first, second)
        msg = self._formatMessage(msg, standardMsg)
        raise self.failureException(msg)  # default: AssertionError

https://github.com/python/cpython/blob/9b5ef19c937bf9414e0239f82aceb78a26915215/Lib/unittest/case.py#L805

Однако, как намечено имя docstring и функции, assertEqual имеет потенциал специфичного для типа. Это то, что вы теряете с помощью eq_ (или assert a == b, если на то пошло). unittest.TestCase имеет специальные случаи для dict s, list s, tuple s, set s, frozenset и str s. В основном это облегчает более красивую печать сообщений об ошибках.

Но assertEqual является членом класса TestCase, поэтому его можно использовать только в TestCase s. nose.tools.eq_ может использоваться везде, как простой assert.