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

Как да намеря всички модулни тестове, които могат пряко или косвено да извикат даден метод? Когато променя метод, искам да знам най-добрите тестове за изпълнение; трябва да има инструмент за това!

Тъй като имаме много интерфейси, аз се интересувам от всички модулни тестове, които извикват метод на интерфейс, когато има поне един път var на метода за имплантиране на клас, който имплементира интерфейса.

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

(Използваме nUnit в .net и имаме много бавни модулни тестове, ще минат много години, докато преработим всички наши модулни тестове, за да бъдат бързи)

Вижте също:


person Ian Ringrose    schedule 25.03.2011    source източник
comment
Знам, че това не е инструмент, но когато трябва да направя това, преименувам метода и се опитвам да компилирам, след което оставям програмата за отстраняване на грешки да ми каже какво се проваля. Това обаче работи за мен само когато съм във Visual Studio, така че полезността е ограничена до момента, когато активно отстранявате грешки, а не на сървър за изграждане.   -  person David    schedule 25.03.2011
comment
@David, това намира само директни обаждащи се.   -  person Ian Ringrose    schedule 25.03.2011
comment
На мен ми звучи като миризма. Единичните тестове се наричат ​​Unit, защото тестват една единица отделно от останалите. Така че като цяло трябва да имате клас, тестван по начин, при който никоя реализация на друг клас няма да повлияе на теста. Това също означава, че когато промените нещо в клас, трябва да стартирате само модулни тестове за този клас, защото другите тестове трябва да използват mocks вместо този клас.   -  person Snowbear    schedule 25.03.2011
comment
@Snowbear, съжалявам, че живея в реалния свят, работейки върху голяма стара кодова база в голям екип   -  person Ian Ringrose    schedule 25.03.2011
comment
Създадох инструмент, който прави това за Python: github.com/jbochi/bazinga   -  person jbochi    schedule 10.07.2011


Отговори (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

person Rob Fonseca-Ensor    schedule 25.03.2011

В най-общия случай, когато използвате делегати, ламбда изрази и т.н., имам интуицията, че този проблем е еквивалентен на проверка дали дадена програма ще завърши (Проблем със спиране), така че не бих се надявал да намеря разумен отговор.

Ако истинската ви цел е да можете бързо да тествате дали промяната ви е счупила нещо, бих препоръчал:

  • рефакторинг на вашите тестове
  • създаване на паралелна инфраструктура за изграждане с клъстер от машини за изграждане (по-лесно, отколкото си мислите с модерни инструменти като TeamCity)
person Grzenio    schedule 25.03.2011
comment
Проблемът със спирането може да бъде разрешен в много полезни случаи от реалния свят, просто се нуждае от 3 изхода, да|не|може би - фактът, че можем да докажем, че няма общо решение, не показва, че няма решение за много полезни случаи. - person Ian Ringrose; 25.03.2011
comment
А за случаите, в които отговорът е може би, можете консервативно (в зависимост от вашите нужди) да го настоявате да се третира като „да“ или като „не“. За покритие на теста, ако резултатът е може би този тест проверява този код, можете да го третирате като „да“, стартирайте теста отново. - person Ira Baxter; 25.03.2011

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

Това може да се изчисли статично, но е трудно и не знам никакви инструменти, които да го правят. По-лошото е, че ако разполагате с такъв инструмент, статичният анализ, за ​​да решите какво е засегнал тестът, всъщност може да отнеме повече време от простото изпълнение на самия тест, така че това не изглежда като привлекателна посока.

Това обаче може да се изчисли с помощта на инструмент за тестово покритие. За всеки отделен тест изпълнете този тест (предполагаме, че преминава) и съберете данните за покритието на теста. Сега имаме много двойки (t_i,c_i) за "тест i има покритие c".

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

Всъщност това, което искате в идеалния случай е, ако c_i споменава някакъв програмен елемент на F и този програмен елемент се е променил, трябва да стартирате t_i отново.

Нашите инструменти за SD тестово покритие предоставят тази възможност за Java и C# на ниво методи. Трябва да настроите някои скриптове, за да свържете действителния тест, както и да сте го пакетирали, със събраните вектори на тестово покритие. От практическа гледна точка това обикновено е доста лесно.

person Ira Baxter    schedule 25.03.2011
comment
Благодаря за чудесния отговор; Започнах да мисля в тази насока. Това същото ли е като това, което Visual Studio 2010 прави със своя анализ на въздействието на теста? За щастие нямаме много код, който се управлява от атрибут (и/или конфигурационен файл), така че е малко вероятно промяна в метод, който не се изпълнява от тест, да повлияе на резултата от теста. - person Ian Ringrose; 25.03.2011
comment
@Ian Ringrose: AFAIK, VS 2010 основно използва инструменти, както и нашият инструмент, за събиране на тези данни за покритие. Не знам как свързват тестовете с данните за тестовото покритие, нито разбирам нивото на програмния елемент, на което дава отговори; файл ли е? метод? изявление?. Нашите инструменти могат да направят това на ниво метод, защото те всъщност анализират текста и правят сравнение. - person Ira Baxter; 25.03.2011

Можете да използвате „Преглед на йерархията на повикванията“ на VS2010 или ReSharpers „ReSharper -> Проверка -> Входящи повиквания“. Можете дори да експортирате резултата от ReSharper.
Ако искате да използвате автоматизация, за да постигнете целта си, т.е. защото това не е еднократно нещо, а нещо, което искате да интегрирате в процеса на изграждане, предлагам да изградите вашето собствено решение. Можете да използвате Reflection или Mono.Cecil върху сглобките и да преминете сами в йерархията на повикванията. Това обаче може да отнеме доста време, тъй като ще трябва да създадете цялостно йерархично дърво на повикванията върху всичките си сборки. Друга възможност би била да създадете приставка за Visual Studio или ReSharper, така че да имате достъп до обектния модел, който те създават от вашия изходен код.
По принцип това, което казвам е: не знам за съществуващ в момента метод за постигане целта ви чрез автоматизация и писане на собствено решение ще бъде забавна, но трудна и евентуално отнемаща време, както при разработването, така и при изпълнението му.

person Daniel Hilgarth    schedule 25.03.2011
comment
Това справя ли се с обаждания, които могат да бъдат направени, като интерфейси и делегати и т.н.? Освен това как да го накарам да изведе във формат, който мога да предам в програма за тестване на единици? - person Ian Ringrose; 25.03.2011
comment
Хм, не съм сигурен, че се справя добре с тези случаи. Току-що го тествах в по-голям проект и изглежда странно. Както и да е, не можете да експортирате това дърво, така че може да не е толкова полезно за вас, ако искате да използвате известна автоматизация. - person Daniel Hilgarth; 25.03.2011