2015-05-17 2 views
1

Я ищу, чтобы лучше понять, я должен проверять функции, которые имеют много подстановок или подфункций.Как я должен выполнять функции тестирования с множеством подфункций?

Скажем, у меня есть функции

// Modify the state of class somehow 
public void DoSomething(){ 
    DoSomethingA(); 
    DoSomethingB(); 
    DoSomethingC(); 
} 

Каждая функция здесь является публичной. Каждая подфункция имеет 2 пути. Поэтому, чтобы проверить каждый путь для DoSomething(), у меня было бы 2 * 2 * 2 = 8 тестов. Написав 8 тестов для DoSomething(), я также косвенно проверил подфункции.

Так что я должен тестировать это так или вместо этого писать блок-тесты для каждой из подфункций, а затем записывать только один тестовый пример, который измеряет конечное состояние класса после DoSomething() и игнорирует все возможные пути? Всего 2 + 2 + 2 + 1 = 7 тестов. Но неужели плохо, что тестовый случай DoSomething() будет зависеть от других единичных тестов, чтобы иметь полный охват?

+0

Проверьте результаты каждого метода. Вам нужно только проверить, что DoSomething вызывает другие методы, потому что это все, что он делает. – artm

+0

@artm Я вижу, но разве это не делает тест менее надежным? Если я когда-либо решил изменить DoSomething(), тест будет разорван. Но я полагаю, что это будет легкий тест, который изменится, поскольку он настолько прост. – roverred

+0

Вы должны * не * проверить, что DoSomething() вызывает другие методы * точно *, потому что изменение в том, как DoSomething() внутренне работает, нарушит его тест. Проверка черного ящика FTW. Тестирование с помощью белого ящика (с помощью mocks и т. Д.) Полезно только при тестировании вещей, которые не возвращают результаты, и поэтому по своей природе единственное, что можно проверить, это то, что они называют и как они это называют. –

ответ

2

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

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

Не зная специфику вашего дела, я бы сказал, что в целом, тот факт, что DoSomething() работы путем вызова DoSomethingA(), а затем DoSomethingB(), а затем DoSomethingC() - это деталь реализации, о которой лучше всего не знать ваш тест на «черный ящик». Таким образом, я бы определенно не тест, который DoSomething() вызывает DoSomethingA(), DoSomethingB() и DoSomethingC(), я бы только тест, чтобы убедиться, что она возвращает правильные результаты, и используя знания, что он на самом деле вызывать эти три функции в качестве я бы точно выполнил те 7 тестов, которые вы планировали использовать.

С другой стороны, следует отметить, что если DoSomethingA() и DoSomethingB() и DoSomethingC() являются также общественные функции, то вы должны также испытание их по отдельности тоже.

0

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

У вас есть метод, который вставляет пользователь БД и способ, как это:

void InsertUser(User user){ 

var exists = SomeExternal.UserExists(user); 

if(exists) 
throw new Exception("bla bla bla"); 

//Insert codes here 
} 

Если вы хотите протестировать функцию InsertUser, вы должны издеваться внешними/суб/вложенных методы и поведение теста функции InsertUser.
Этот пример создает два теста:
1 - «Когда пользователь существует, то должны выбросить исключение»
2 - «Когда пользователь не существует, то необходимо вставить пользователя»

1

Определенно проверить каждый субфункцию отдельно (потому что они общественности) , Это поможет вам найти проблему, если всплывет.

Если DoSomething использует только другие функции, я бы не стал писать дополнительные тесты для него. Если у него есть какая-то другая логика, я бы ее протестировал, но все функции внутри работают правильно (если они находятся в другом классе, их издеваются).

Точка - это поиск функции, которая не покрывается другими испытаниями и тестированием.

Смежные вопросы