Тестирование вещей, которые должны быть одинаковыми - PullRequest
1 голос
/ 11 ноября 2009

Например, метод Equals. a должно равняться b, а b должно равняться a. Можете ли вы сказать, что можно проверить это в одном тестовом примере, используя два утверждения, как показано ниже:

[Test]
public void Equals_TwoEqualObjects_ReturnsTrue()
{
    var a = new Something();
    var b = new Something();

    Assert.That(a.Equals(b), Is.True);
    Assert.That(b.Equals(a), Is.True);
}

Или вы думаете, что это нужно сделать в двух отдельных тестах, чтобы в тесте не было двух утверждений?

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

Ответы [ 5 ]

6 голосов
/ 11 ноября 2009

Я думаю, это абсолютно нормально, когда они проходят один тест.

Идея "один утверждать на тест" больше похожа на догму, чем на что-то полезное для меня. Будьте прагматичны в тестировании.

Да, тестируйте один функционал за тест, но не ограничивайте себя одним утверждением.

4 голосов
/ 11 ноября 2009

Я хочу сказать, что вы должны провести оба теста в одном месте. Недостаточно, чтобы один объект равнялся другому, а какой-то другой объект равнялся другому. Дело в том, что одни и те же два объекта равны друг другу одновременно.

Цель вашего теста (проверить, что равенство является коммутативным) намного яснее в случае двух утверждений.

2 голосов
/ 11 ноября 2009

Зависит.

Если вы делаете что-то сложное, когда наличие этой коммутативности является критической функцией и не представляет особой сложности, тогда наличие тестов, достаточно детализированных, чтобы отразить это, имеет смысл - это позволяет вам выявлять проблемы гораздо быстрее.

Во многих случаях это будет излишним. Тест должен иметь точку.

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

Итог: нет и не должно быть абсолютным правилом для этого. Но главное - держать тесты

  • Short
  • Полезно для изоляции вопросов
  • Полезно при документировании поведения
1 голос
/ 11 ноября 2009

Оба ваших утверждения проверяют одно и то же. Этот один объект типа равен другому объекту того же типа. Код Equals не имеет никакого способа определить, к каким локальным переменным он вызывается, а какие - к параметрам. Я думаю, что было бы достаточно иметь одно утверждение, которое говорит, что любой объект типа равен любому другому объекту этого типа. Если это так, то коммутативность верна.

1 голос
/ 11 ноября 2009

Я бы провел их в двух тестах, как если бы одна из ссылок была неправильно настроена, вы будете точно знать, какая из них, помните, юнит-тест проверяет наименьшую возможную единицу.

...