Да, вы можете иметь петли в модульном тесте, но с осторожностью. Как упомянул Алекс Йорк, циклы приемлемы, если вы тестируете one вещь; то есть одно ожидание.
Если вы используете циклы, я рекомендую вам сделать две вещи:
- Как упоминалось выше, тестируйте непустой набор итераций. Итерация по пустому набору - ложное срабатывание Ложноположительные результаты являются бичом всех автоматических тестирований, потому что никто не проверяет дважды зеленый результат.
- Включите описание теста, которое описывает текущую итерацию. Как минимум, включите индекс итерации.
Вот пример из моего тестирования свойства объекта «Больше, чем».
[Test]
public void TestCompare_XtoY_GreaterThan()
{
int numObjects = mOrderedList.Count;
for (int i = 1; i < numObjects; ++i)
{
for (int j = 0; j < i; ++j)
{
string testDescription = string.Format("{0} is greater than {1} which implies\n {2}\n is greater than\n {3}"
, i, j
, mOrderedList[i], mOrderedList[j]
);
Assert.IsTrue(0 < mOrderedList[i].CompareTo(mOrderedList[j]), testDescription);
Assert.IsTrue(0 < mOrderedList[i].Compare(mOrderedList[i], mOrderedList[j]), testDescription);
Assert.IsTrue(0 < mOrderedList[j].Compare(mOrderedList[i], mOrderedList[j]), testDescription);
Assert.Greater(mOrderedList[i], mOrderedList[j], testDescription);
}
}
}
Я проверяю, что мой упорядоченный список не пуст в настройках теста, используя:
[SetUp]
public void GeneralTestSetup()
{
// verify the iterated sources are not empty
string testDescription = string.Format("The ordered list of objects must have at least 3 elements, but instead has only {0}.", mOrderedList.Count);
Assert.IsTrue(2 < mOrderedList.Count, testDescription);
}
У меня есть несколько подтверждений даже внутри моего цикла, но все подтверждения проверяют единственное ожидание:
if i > j then mOrderedList[i] > mOrderedList[j]
Описание теста на уровне итерации таково, что вы получаете Сбои, такие как:
10 is greater than 9 which implies
TestActionMethodInfo: [Actions.File, Version=1.0.446.0, File, VerifyReadOnly]
is greater than
TestActionMethodInfo: [Actions.File, Version=1.0.446.0, File, Write]
Expected: True
But was: False
вместо просто:
Expected: True
But was: False
Вопрос / обсуждение моего кода выше:
Я проверяю одну вещь?
Я утверждаю о 4 различных методах сравнения внутри объекта, которые можно рассматривать как тестирование 4 вещей, а не одного. Счетчик больше, чем больше, чем больше, и что все методы, которые делают эту оценку, должны быть согласованными.