2009-06-03 2 views
4

В утверждении утверждается, что «одно утверждение на испытание». Это не хорошо, чтобы написать утверждение, как показано ниже:Как применить «одно утверждение к испытанию» для условия отношения ИЛИ

Assert((foo != null) && (bar != null)); 

Чем лучше chocie является:

Assert(foo != null); 
    Assert(bar != null); 

Вопрос заключается в том, что если утверждение:

Assert((foo == null) || (foo.length == 0)); 

Отношения OR вместо И.

Есть ли способ сделать «Одно утверждение за тест», сохраняя логику?

ответ

1

Конечно: один тест обеспечивает нулевое утверждение foo, гарантирует, что ненулевой foo с длиной 0 также терпит неудачу (и другие проверяют случаи [s], где foo не является нулевым. и имеет длину! = 0). Как это работает, чем проверка И?

Edit: псевдокод в соответствии с просьбой ...:

should_assert(themethod(foo=null)) 
    fakefoo = fakewhatever(length=0) 
    should_assert(themethod(foo=fakefoo)) 
    ...rest of tests w/foo not null, w/length != 0 

например, в Python UnitTest ж/стоп-псевдокоде mock, это может быть:

self.assertRaises(AssertionError, theobj.themethod, null) 
    fakefoo = mock.makeObj(length=0) 
    self.assertRaises(AssertionError, theobj.themethod, fakefoo)) 
    ...rest of tests w/foo not null, w/length != 0 
+0

Не могли бы вы написать для него псевдокод? –

+0

уверен, позвольте мне отредактировать мой ответ, чтобы накрыть это. –

+0

Я не знаком с python. Но я все еще смущен. Могу ли я перевести его ниже? Assert (foo == null); Assert (foo.length == 0); Это выглядит не так. –

4

Идея руководящего заключается в том, что вы проверяете только одну логическую вещь (которая может сводиться к , несколько утверждений) в одном тесте. Поэтому, если тест не удался, вы знаете точную причину его отказа и можете быстро войти в конкретный блок кода. Чтобы взять пример из this page, если следующий тест не удался, я знаю, что что-то не так с тем, как страна извлекается/определяется в типе «Адрес».

public void testCountry() throws Exception { 
     assertEquals("COUNTRY", anAddress.getCountry()); 
    } 

Сравните это с версией теста с кратному Утверждает, он может потерпеть неудачу по многим причинам (и если вы не используете полезные сообщения утверждают,), вы должны были бы отладки тест (Тьфу!).

Мне нужно будет увидеть ваш полный тест. Из того, что он видит, кажется, что вы проверяете коллекцию для чего-то не найденного сценария. В этом случае рекомендуется вернуть пустую коллекцию, чтобы клиенты не проверяли значение null. Поскольку ваш тест также является клиентом, жизнь также упрощается: Assert.AreEqual (0, foo.length)

+1

Хороший ответ! Единица испытания тест тестирование ** один ** unit в ** один ** положение дел. – guerda

4

Проблема не может быть в утверждении, но в части Arrange or Act части теста: когда вы выполняете единичный тест, вы вызываете [маленькую] часть кода в управляемой среде . То есть вы должны знать, как будет себя вести тестируемое программное обеспечение, и, следовательно, знать, вернет ли он нулевой указатель или пустую строку. Каждый тест должен иметь один ожидаемый результат.

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

Или, вы можете создать функцию для проверки пустых строк, которые будут также проверить, если указатель строки не равно нулю:

Assert(is_empty_string(foo)); 

Ваш язык строка класс может предоставить этот метод.

Смежные вопросы