Как бы вы протестировали что-то, что фильтрует сложные объекты?
У меня есть постоянный объект с 7 соответствующими полями.
Поля могут содержать количество значений, перечисленных здесь:
Field # of Possible Values
1 5
2 20
3 2
4 2
5 19
6 2
7 8
Что является потенциалом для 121600 уникальных объектов.
Тестируемый код представляет собой ряд фильтров, которые захватывают определенное количество этих объектов на основе значений их полей, а затем помещают их в корзину для использования другой системой. Депонирование бункера тривиально, проверено и работает правильно... просто фильтрация не работает. Кажется, что существует множество крайних случаев, которые не покрываются, и многие объекты помещаются в корзину, когда их вообще не нужно выбирать, или наоборот.
Всего существует 9 фильтров, которые работают в цепочке ответственности, каждый из которых помещает объекты в корзину до тех пор, пока корзина не заполнится, и в этот момент цепочка выходит. Последний фильтр в цепочке - это просто "фильтр", который отправляет электронное письмо администратору, отмечая, что объекты заканчивают работу (т. Е. Если цепочка достигла этого фильтра, то корзина не заполнена, и что-то нужно смотреть)
Итак, моя проблема заключается в следующем: как мне проверить эти фильтры? Я мог бы создать один из каждого уникального типа объекта, используя серию операторов for:
public void FixtureSetup()
{
for(each possible value for field 1)
{
for(each possible value for field 2)
{
// ... continue with 5 more for statements
// Create Object with each value
}
}
}
Но попытка вручную выяснить, какие объекты должны быть должным образом отфильтрованы из результирующей коллекции (даже коллекции отфильтрованных объектов), будет ужасно трудной (и, если возможно, я бы легко это сделал, когда впервые написал фильтры).
Я знаю, что требования виноваты, потому что они говорят что-то вроде:
filter 1 gets
- field 1: values 1/2/3
- field 2: values 2/3/4
- etc.
но результаты показывают так много крайних случаев, что каждый раз, когда я изменяю его, чтобы включить этот конкретный случай, что-то еще ломается (и у меня нет регрессионных тестов, чтобы убедиться, что это не так), и трудно определить, где в цепочке конкретная проблема произошла.
edit> Я пытаюсь проверить фильтры отдельно, однако предположим следующее:
фильтр 1 захватывает 500 из 121600 возможных объектов (в соответствии с критериями фильтра). Я обнаружил, что, скажем, 100 (полное предположение) из тех предметов, которые захвачены, не должно быть - и по разным причинам. Чтобы узнать, мне нужно было бы пройти через каждого из них с пользователем (ами) другой системы, чтобы узнать, верен ли набор результатов каждого фильтра. Противоположность этому также сохраняется в моей голове... как насчет всего объекта, который должен был быть схвачен, но не был.
Я начинаю думать, что это может быть проблемой при сборе требований, а не при тестировании.
2 ответа
Похоже, у вас нет четкой спецификации. Если у вас нет четкой спецификации, то как вы можете узнать, работает ли код в соответствии со спецификацией?
Сделать шаг назад. Начните с написания одного предложения спецификации:
Компонент FrobFilter принимает последовательность Frobs и помещает каждую из них в правильный FrobBin, пока одна корзина не заполнится.
Хорошо, теперь у вас есть спецификация. Это еще не тестируемая или реализуемая спецификация. Почему бы и нет? Две причины.
Причина первая: последствия отсутствия заполнения FrobBin до того, как закончится последовательность Frob, не определены.
Причина вторая: "правильно" не указано.
Теперь напишите спецификацию, состоящую из одного предложения, которая касается каждой проблемы.
Если последовательность заканчивается до того, как какой-либо контейнер заполнится, администратор получает уведомление.
Правильный контейнер для Frob, такой, что Blargh - это Gnusto, всегда является FrotzBin.
Хорошо, теперь у вас есть еще две проблемы. Как администратор уведомляется? И что произойдет, если Blargh Frob's не Gnusto?
Просто продолжайте разбивать его по одному предложению за раз, пока не получите полную и точную спецификацию. Затем вы обнаружите, что ваша спецификация, программа, которая ее реализует, и тестовые примеры выглядят удивительно похожими друг на друга. И это потрясающая ситуация.
Похоже, вы должны тестировать каждый из этих фильтров в отдельности, с фиктивным фильтром "под" каждым из них, к которому вы будете прикованы.
Надеемся, что каждый из фильтров прост и может быть протестирован просто.
После этого у меня будет несколько интеграционных тестов, когда все будет готово.