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



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



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



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



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



См. также:



587   4  

4 ответов:

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

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

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

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

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

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

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

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

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

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

Вы можете использовать VS2010 " просмотр иерархии вызовов "или ReSharpers"ReSharper -> Inspect -> Incoming calls". Вы даже можете экспортировать результат из ReSharper.
Если вы хотите использовать автоматизацию для достижения своей цели, то есть потому, что это не одноразовая вещь, а то, что вы хотите интегрировать в свой процесс сборки, я предлагаю вам построить свое собственное решение. Вы можете использовать отражение или моно.Сесил на сборках и пройдитесь по иерархии вызовов самостоятельно. Однако это может занять довольно много времени, потому что вам нужно будет создать полное дерево иерархии вызовов для всех ваших сборок. Другой возможностью было бы создание плагина Visual Studio или ReSharper, чтобы вы могли получить доступ к объектной модели, которую они создают из вашего исходного кода.
В принципе, я говорю следующее: Я не знаю ни одного существующего в настоящее время метода для достижения вашей цели с помощью автоматизации и написание собственного решения будет весело, но сложно и, возможно, отнимет много времени, как при разработке, так и при запуске.

Comments

    Ничего не найдено.