Является ли модульное тестирование угловых компонентов действительно модульным тестированием? - PullRequest
1 голос
/ 11 июля 2019

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

Согласно документации Angular по тестированию, вы должны высмеивать все, что предоставляется с помощью внедрения зависимостей. Все идет нормально. Но затем, как показано в приведенном ниже коде, вы можете просто импортировать другие необходимые модули, компоненты, директивы, каналы через общий или функциональный модуль.

Это действительно модульное тестирование? Если тестируемая целевая система является компонентом, разве это не тестирование всего модуля?

Или это просто уступка, что было бы почти невозможно высмеять все требования в реальном приложении?

beforeEach(async(() => {
  const routerSpy = createRouterSpy();

  TestBed.configureTestingModule({
    imports:      [ SharedModule ],
    declarations: [ HeroDetailComponent ],
    providers: [
      { provide: ActivatedRoute, useValue: activatedRoute },
      { provide: HeroService,    useClass: TestHeroService },
      { provide: Router,         useValue: routerSpy},
    ]
  })
  .compileComponents();
}));

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Это действительно модульное тестирование?Если тестируемая целевая система является компонентом, разве это не тестирование всего модуля?

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

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

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

Или это просто уступка, что было бы почти невозможно высмеять все требования вреальное приложение?

Удачи в попытке протестировать систему после того, как она будет построена.

Если вы хотите создать что-то, что можно протестировать, то сначала напишите тесты.

https://en.wikipedia.org/wiki/Test-driven_development

Чистые компоненты

Чистый компонент является компонентом без внешних зависимостей, не изменяет внешнее состояние и генерирует равный выход для тех же входов.Компонент, имеющий пользовательскую форму, не может быть pure так же, как new Date() не чист.

Фреймворки модульного тестирования понимают эти real-world проблемы и предлагать решения, такие как издевательство, шпионаж и т. д., чтобы позволить тестировщику покрыть нечистый исходный код тестами, которые проверяют ожидания в pure повторяемым способом.

Это все, что вы можете сделать, но это все еще модульное тестирование, и вот что важно.

1 голос
/ 18 июля 2019

Вы пишете

. Основная задача - проверить изолированную систему

Да - и нет.Юнит-тестирование предназначено для выявления ошибок, которые можно найти в изолированном программном обеспечении.Это не означает, что вы на самом деле должны изолировать код во время тестирования.Другими словами, вам не обязательно издеваться над всеми зависимостями.Например, если в вашем коде используется функция sin(), это также зависимость от другой части кода, но такая зависимость, как правило, не вредит вашей способности правильно протестировать код.

Общее правило:, что издевательство должно быть сделано по причине.Уважительные причины:

  • Вы не можете легко заставить зависимый компонент (DOC) вести себя так, как задумано для ваших тестов.
  • Вызывает ли DOC какое-либо недерминистское поведение(дата / время, случайность, сетевые подключения)?
  • Тестовая настройка слишком сложна и / или требует интенсивного обслуживания (например, необходимость во внешних файлах)
  • Исходный DOC создает проблемы с переносимостью для вашегокод теста.
  • Вызывает ли использование оригинального DOC неприемлемо длительное время сборки / выполнения?
  • Имеет ли проблемы со стабильностью (зрелостью) DOC, которые делают тесты ненадежными, или, что еще хуже, DOC недаже доступны еще?

Как вы можете легко видеть, использование функции sin() обычно не подпадает под причины, перечисленные выше.Вам придется судить, относится ли это также к вашему сценарию.

Тем не менее, один из выводов вышеизложенного состоит в том, что вы также можете проводить модульное тестирование, если вы не высмеиваете все зависимости.Но что же тогда является отличительным свойством юнит-тестирования?То, что отличает юнит-тесты от, например, интеграционных тестов, - это цель, которую вы преследуете с помощью соответствующего теста.

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

1 голос
/ 11 июля 2019

(в значительной степени основанный на мнениях, поэтому не стесняйтесь не соглашаться) Это не совсем характерно для angular, например, если вы тестируете юнит-функцию Python, использующую numpy, вы все равно импортируете numpy в UT. Таким образом, здесь вы можете импортировать компоненты материала для примера, и вы не можете по-настоящему насмехаться над ними (и даже если бы вы могли, это не очень хорошая идея, вы хотите убедиться, что вы используете их правильно). По сути, я бы сказал, что в модульном тестировании вы высмеиваете / заглушаете ваши другие функции (здесь насмехается над heroService) и http запрашивает ответы, но вы можете только предполагать, что внешняя библиотека работает так, как задумано, поэтому вы все равно импортируете и используете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...