Как мне найти все модульные тесты, которые могут прямо или косвенно вызывать данный метод? (.сеть) - PullRequest
3 голосов
/ 25 марта 2011

Как мне найти все модульные тесты, которые могут прямо или косвенно вызывать данный метод?Когда я меняю метод, я хочу знать лучшие тесты для запуска;для этого должен быть инструмент!

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

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

(Мы используем nUnit в .net и проводим множество медленных юнит-тестов, пройдет много лет, пока мы не проведем рефакторинг всех наших юнит-тестов, чтобы они были быстрыми)

см. Также:

Ответы [ 4 ]

3 голосов
/ 25 марта 2011

Visual Studio 2010 имеет эту особенность: http://blogs.msdn.com/b/phuene/archive/2009/12/07/test-impact-analysis-in-visual-studio-2010.aspx

Поскольку вы используете nunit, вы можете попробовать эту технику для запуска MSTest: http://msdn.microsoft.com/en-gb/magazine/cc163643.aspx#S4

1 голос
/ 25 марта 2011

Вам нужна связь между каждым тестом и кодом, который он выполняет.

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

Однако этоможет быть рассчитан с использованием инструмента покрытия теста.Для каждого отдельного теста запустите этот тест (мы предполагаем, что он пройден) и соберите данные покрытия теста.Теперь у нас есть много пар (t_i, c_i) для «test i, у которого есть покрытие c».

Когда изменяется кодовая база, можно обратиться к наборам покрытия тестовых данных.Простая проверка: если для любого (t_i, c_i), если c_i упоминает файл F и F изменился, вам нужно снова запустить t_i.Учитывая данные тестового покрытия практически в любом представлении, это довольно легко обнаружить в резюме.Учитывая, что большинство инструментов покрытия тестами конкретно не говорят вам, как они хранят данные покрытия тестов, это сложнее, чем кажется на практике.

На самом деле, в идеале вы хотите, чтобы c_i упоминал какой-либо программный элемент Fи этот программный элемент изменился, вам нужно снова запустить t_i.

Наши инструменты для тестирования SD SD предоставляют эту возможность для Java и C # на уровне методов.Вам необходимо настроить некоторые сценарии, чтобы связать реальный тест, как бы вы его ни упаковывали, с собранными векторами покрытия тестами.С практической точки зрения это довольно просто.

1 голос
/ 25 марта 2011

В самом общем случае, когда вы используете делегаты, лямбда-выражения и т. Д., У меня есть интуиция, что эта проблема эквивалентна проверке, завершится ли данная программа ( Проблема останова ), поэтомуЯ бы не надеялся найти разумный ответ.

Если ваша настоящая цель заключается в том, чтобы иметь возможность быстро протестировать, если ваши изменения что-то сломали, я бы рекомендовал:

  • рефакторинг ваших тестов
  • настройка инфраструктуры параллельной сборки с кластером машин сборки (проще, чем вы думаете, с помощью современных инструментов, таких как TeamCity)
0 голосов
/ 25 марта 2011

Вы можете использовать VS2010 «Просмотр иерархии вызовов» или ReSharpers «ReSharper -> Проверка -> Входящие вызовы». Вы даже можете экспортировать результат из ReSharper.
Если вы хотите использовать автоматизацию для достижения своей цели, т. Е. Потому что это не разовая вещь, а то, что вы хотите интегрировать в процесс сборки, я предлагаю вам создать собственное решение. Вы можете использовать Reflection или Mono.Cecil в сборках и самостоятельно выполнять иерархию вызовов. Однако это может занять довольно много времени, поскольку вам нужно будет создать полное дерево иерархии вызовов для всех ваших сборок. Другой возможностью будет создание плагина Visual Studio или ReSharper, чтобы вы могли получить доступ к объектной модели, которую они создают, из вашего исходного кода.
По сути, я говорю следующее: я не знаю ни одного существующего в настоящее время метода для достижения вашей цели с помощью автоматизации, и написание собственного решения будет забавным, но сложным и, возможно, трудоемким процессом при его разработке или запуске.

...