Допустим, я пытаюсь протестировать простой класс Set
public IntSet : IEnumerable<int>
{
Add(int i) {...}
//IEnumerable implementation...
}
И предположим, что я пытаюсь проверить, что в наборе не может быть повторяющихся значений.Мой первый вариант - вставить некоторые образцы данных в набор и проверить их на наличие дубликатов, используя мои знания данных, которые я использовал, например:
//OPTION 1
void InsertDuplicateValues_OnlyOneInstancePerValueShouldBeInTheSet()
{
var set = new IntSet();
//3 will be added 3 times
var values = new List<int> {1, 2, 3, 3, 3, 4, 5};
foreach (int i in values)
set.Add(i);
//I know 3 is the only candidate to appear multiple times
int counter = 0;
foreach (int i in set)
if (i == 3) counter++;
Assert.AreEqual(1, counter);
}
Мой второй вариант - это общий тест на мое состояние:
//OPTION 2
void InsertDuplicateValues_OnlyOneInstancePerValueShouldBeInTheSet()
{
var set = new IntSet();
//The following could even be a list of random numbers with a duplicate
var values = new List<int> { 1, 2, 3, 3, 3, 4, 5};
foreach (int i in values)
set.Add(i);
//I am not using my prior knowledge of the sample data
//the following line would work for any data
CollectionAssert.AreEquivalent(new HashSet<int>(values), set);
}
Конечно, в этом примере мне удобно иметь реализацию набора для проверки, а также код для сравнения коллекций (CollectionAssert).Но что, если у меня тоже не было?Этот код определенно будет сложнее, чем в предыдущем варианте!И это ситуация, когда вы тестируете свою собственную бизнес-логику в реальной жизни.
Конечно, тестирование на ожидаемые условия обычно охватывает больше случаев - но это становится очень похоже на повторную реализацию логики (что утомительно и бесполезно - вы не можете использовать один и тот же код для проверки самого себя!).По сути, я спрашиваю, должны ли мои тесты выглядеть как «вставить 1, 2, 3, затем проверить что-то около 3» или «вставить 1, 2, 3 и проверить что-то в целом»
РЕДАКТИРОВАТЬ - Чтобы помочь мнеПоймите, пожалуйста, укажите в своем ответе, предпочитаете ли вы ВАРИАНТ 1 или ВАРИАНТ 2 (или ни того, ни другого, либо это зависит от конкретного случая и т. д.).Просто чтобы прояснить, довольно ясно, что в в этом случае (IntSet
) вариант 2 лучше во всех аспектах.Однако мой вопрос относится к случаям, когда у вас нет альтернативной реализации для проверки, поэтому код в варианте 2 будет определенно более сложным, чем вариант 1.