Загружать или не загружать данные для юнит-тестов из внешних файлов

17

При модульном тестировании я часто задумываюсь над тем, сколько данных я передаю, и ожидаю возврата от тестируемых модулей, я должен включить их в настоящие тестовые файлы.

Компромисс, с которым я постоянно борюсь:

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

Является ли один из них анти-паттерном?

DudeOnRock
источник
Какие типы данных?
Джон Рейд
@JonReid: в основном текст.
DudeOnRock

Ответы:

11

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

--- Более подробный ответ ---

Исходя из моего опыта, я думаю, что это сильно зависит от цели вашего теста. Вот эмпирическое правило, которое я использовал в прошлом, и оно помогло мне решить:

Вы на самом деле тестируете небольшой блок кода? (Истинный юнит тест)

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

Если нет, то вы, вероятно, на самом деле тестируете саму систему. В этих случаях я часто загружаю данные из внешнего источника по следующим причинам:

  1. Этот тест не для ясности кода для программистов (хотя это все еще важно - кто-то должен это поддерживать), а для прохождения достаточного количества различных типов данных через весь блок системы, чтобы быть уверенным, что он работает.
  2. Часто я пишу код для загрузки и использования тестовых данных, но сами данные создаются кем-то другим (обычно в моем случае сотрудником QA). Эти люди обычно не программисты, поэтому я не могу ожидать, что они будут редактировать код.

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

nadrees
источник
9

Я не вижу компромисса здесь. Исходный код должен описывать алгоритмы или, по крайней мере, бизнес-логику, а не большие объемы данных. Если вы пишете преобразование Фурье, вы хотите убедиться, что синусоидальный тон правильно сопоставлен с одним пиком, смешанный звук - с большим количеством пиков и т. Д., Но для этого вполне достаточно передать файл, названный sinus.wavв процедуру, и убедиться, что выходная структура - это то, что вы ожидаете.

Конечно, технически у вас нет немедленной гарантии, которая sinus.wavдействительно содержит синусоидальный тонус, но, как вы сказали, перечисление 100 000 значений амплитуды в источнике на самом деле не дает вам этого - на самом деле, это хуже , потому что вы может, по крайней мере, воспроизвести внешний файл с помощью аудиопроигрывателя, чтобы проверить, в то время как значения данных, скрытые в исходном коде, по существу невозможно сделать с чем-либо

Килиан Фот
источник