Для нашего приложения у нас есть около 4000 юнит-тестов, которые будут автоматически выполнены, если мы зарегистрируем ваш код в tfs.
Мы сильно изменились в нашем Построении-Определении, поэтому теперь требуется, чтобы все юнит-тесты имели атрибут [TestCategory(TestCategories.GatedCheckin)]
для выполнения в gated-checkin.
К сожалению, только 700 юниттестов из 4000 уже имеют этот атрибут. Теперь я должен добавить атрибут к остальным юнит-тестам.
Для этого я написал небольшое расширение VisualStudio, где я могу открыть исходный файл и найти следующее регулярное выражение:
^([\t]|[ ])*\[TestMethod\]([\t]|[ ]|[\w\/äÄüÜöÖß])*([\r\n]+)([\t]|[ ])*public
Это регулярное выражение прекрасно работает для модульных тестов, таких как:
[TestMethod]
public void PathIsValidTest1()
{...}
или
[TestMethod] // another test
public void Calculator_Add_3_And_3_Equals_6_Test()
{...}
Но для юнит-теста, который также содержит другой атрибут, такой как:
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void ThrowOnInputTooLongTest2()
{...}
регулярное выражение не работает.
Как я могу изменить регулярное выражение, чтобы оно соответствовало всем юнит-тестам с атрибутом [TestMethod]
, а не с [TestCategory(TestCategories.GatedCheckin)]
Я думал о негативном взгляде с ?!
, но я не получил его на работу.
Есть идеи?
Я изменил решение, предоставленное Addison, чтобы оно выглядело так:
^[\t ]*\[TestMethod\][ \t\w\/äÄüÜöÖß]*(\n([ \t]*)\[(?!TestCategory\(TestCategories\.GatedCheckin\)).+\][ \t\w\/äÄüÜöÖß]*)?\s+public
Если я использую это в regex101, он просто отлично работает, как вы можете видеть здесь
Но если я использую это регулярное выражение в c # с:
string content = File.ReadAllText(file);
Regex regex = new Regex(pattern, RegexOptions.Multiline);
int matchCount = regex.Matches(content).Count;
У меня только 2 матча.