2017-01-19 20 views
2

У меня возникла проблема с проектированием модульных тестов черного ящика без избыточности.Стратегия единичных тестов: избыточность с использованием Black-box

Вот пример:

class A { 
    Float function operationA(int: aNumber){ 
     if(aNumber > 0){ 
      return aNumber * 10 + 5.2; 
     } 
     else if (aNumber < 0) { 
      return aNumber * 7 - 5.2; 
     } 
     else { 
      return aNumber * 78 + 9.3; 
     } 
    } 
} 

class B { 
    boolean status = true; 

    Float function opearationB(int: theNumber){ 
     if(status == true){ 
      return a.operationA(aNumber); 
     } 
    } 
} 

Для того, чтобы правильно протестировать A.operationA(), я должен был бы написать по крайней мере, три единичных испытаний (aNumber = 0, aNumber> 0 и aNumber < 0) ,

Теперь, скажем, я хочу проверить B.functionB, используя стратегию черного ящика, я должен заново написать аналогичные три модульных тестов (theNumber = 0, theNumber> 0 и theNumber < 0)? В этом случае мне пришлось бы создавать множество тестов каждый раз, когда я использую метод A.operationA ...

+0

Почему существует требование проверки черного ящика? – dm03514

+0

Испытаний для класса «A» было бы достаточно. 'class A' является зависимостью класса B. при тестировании B, класс A может быть изделен/подделан, чтобы проверить только дополнительные функциональные возможности B. Нет необходимости повторять те функции, которые уже были покрыты. – Nkosi

+0

@ dm03514 Использование стратегии «черного ящика» в этом случае позволит сбой модульных тестов при изменении операции А и возвращает результат, который изменит результат операции Б. Этого не может быть достигнуто, просто проверив, что операцияA вызывается в операцииB (стратегия белого ящика). –

ответ

2

Если ограничение черного ящика можно ослабить, вы можете удалить все дублирование. Мне очень нравятся определения Джей-Филдса для одиночных и общительных модульных тестов, explained here.

Должно быть тривиально проверять класс A в изоляции. У него нет побочных эффектов и нет соавторов. В идеале класс B также может быть протестирован изолированно (одиночный), где его соавтор, класс a, вычеркнут. Это не только позволяет изолировать класс B, он помогает контролировать каскадные сбои. Если класс B испытывается с классом реальной жизни, когда класс А изменяет это может привести к сбою в классе B.

В какой-то момент сотрудничества (коммуникабельный), вероятно, следует проверить, несколько способов может быть:

  • один socialable тест, который требует Ь через открытый интерфейс и запускает дело по умолчанию в классе A
  • тесты Повышение уровня, которые осуществляют определенную историю пользователя или путь внешнего потока, который запускает класса B в

Sorry Бесполезный Не отвечай свой страшный вопрос.