Регулярное выражение для соответствия TestMethods - PullRequest
0 голосов
/ 15 января 2019

Для нашего приложения у нас есть около 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 матча.

1 Ответ

0 голосов
/ 16 января 2019

Отличный вопрос!

Мне удалось сделать это следующим образом:

^[\t ]*\[TestMethod\][ \t\w\/äÄüÜöÖß]*(\n\[(?!TestCategory\(TestCategories\.GatedCheckin\)).+\][ \t\w\/äÄüÜöÖß]*)*\s+public

Я добавил в другое поле перехвата (и упростил остальную часть регулярного выражения), чтобы теперь он проверял наличиелюбое число других [] ПОСЛЕ первого [TestMethod], и будет принимать их тогда и только тогда, когда ни один из них не будет [TestCategory(TestCategories.GatedCheckin)].

Проверить это онлайн

* 1014Вот код C # для этого:
using System;
using System.Text.RegularExpressions;

namespace Programming {
    class Program {
        static void Main() {
            string content = "namespace MyNameSpace1\n{\n    [TestClass]\n    public class GetMapPathActionTests\n    {\n        [TestMethod] // 1\n        public void GetMapPath_with_All_Attibutes()\n        {\n            ...\n        }\n        [TestMethod] // 2\n        [ExpectedException(typeof(DBInstallInfoConverterCrossCheckerRequiredChildNotFoundException))]\n        public void GetMapPath_with_Empty_Input()\n        {\n           \n        }\n        [TestMethod] // 3\n        [ExpectedException(typeof(DBInstallInfoConverterCrossCheckerRequiredChildNotFoundException))]\n        public void GetMapPath_with_Empty_Output()\n        {\n            \n        }\n        [TestMethod] // 4\n        public void GetMapPath_with_Empty()\n        {\n            \n        }\n        [TestMethod] // 5\n        [ExpectedException(typeof(DBInstallInfoConverterCrossCheckerRequiredChildNotFoundException))]\n        public void GetMapPath_with_All_Attibutes_Empty()\n        {\n            \n        }\n    }\n}\n";
            Regex regex = new Regex(@"^[\t ]*\[TestMethod\][ \t\w\/äÄüÜöÖß]*(\s+\[(?!TestCategory\(TestCategories\.GatedCheckin\)).+\][ \t\w\/äÄüÜöÖß]*)?\s+public", RegexOptions.Multiline);
            MatchCollection matches = regex.Matches(content);

            foreach (Match match in matches) {
                foreach (Capture capture in match.Captures) {
                    Console.WriteLine(capture.Value);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...