2009-09-15 6 views
7

Так у меня есть класс, который выглядит примерно следующим образом:Как я могу выполнить тестирование перегруженных функций?

public class MyClass 
{ 

    DatabaseDependency _depend; 

    public MyClass(DatabaseDependency depend) 
    { 
     _depend = depend; 
    } 

    public string DoSomething(DBParameter database) 
    { 
     var result = _depend.GetResults(database, ...); 
     string response = String.Empty;   

     // some logic to process the result 

     return response; 
    } 

} 

Где DbParameter простой класс, значение, которое содержит свойства, такие как сервер, DbName, DBTYPE и т.д.

Теперь я хочу добавить перегрузка в DoSomething, чтобы он принимал строку подключения вместо параметра DBParameter (предположим, что DatabaseDependency уже имеет перегрузку GetResults, которая принимает строку соединения).

Мой вопрос: У меня есть несколько модульных тестов, которые описывают различные логические пути, используемые для обработки результата из DatabaseDependency.GetResults. Когда я добавляю перегрузку в DoSomething, я бы по существу реорганизовал код, чтобы эта логика была повторно использована обеими перегрузками (т. Е., Вероятно, перевести его в частный метод). Каков правильный способ тестирования модуля? Нужно ли мне иметь столько же модулей для проверки всех логических путей для новой перегрузки, которую я добавляю?

ответ

5

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

Однако это ломается, если вы реорганизуете базовые перегруженные методы, чтобы не происходило делегирование. В этом случае я бы чувствовал себя более уверенно, реплицируя все тесты для обоих методов.

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

1

Да, реорганизуйте общую обработку в частный метод - я предполагаю, что вы это сделаете в любом случае, независимо от требований к тестированию, дублирующий код плохой. Интересно, как думать о тестировании заставляет нас поступать правильно.

Затем у вас есть несколько простых тестов для каждого переуплотненного пути инициации.

5

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

Однако, если имеет смысл реализовать функциональность, чтобы один метод просто вызывал другого, вы могли бы сделать этот другой метод виртуальным. Это позволит вам создать тестовый подкласс, где вы просто убедитесь, что виртуальный метод вызывается другим методом с правильными значениями.

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

0

Зависит от того, выполняете ли вы тестирование с помощью черного ящика или белого ящика, а также если вы используете обе версии метода.

Если вы предполагаете, что вы просто проверяете реализацию, тогда просто проверка «основной» версии будет в порядке. Если вы думаете по сценарию автора теста, который знает только о представленном API (javadocs или аналогичном), тогда вам нужно протестировать только на основе API, что подразумевает полное тестирование обоих методов.

Если вы используете только один метод, то осудите другое и создайте условный тест версии, который терпит неудачу, когда устаревший метод все еще существует в некоторой предопределенной версии. IE: обеспечить, чтобы устаревший метод был удален в какой-то момент.

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