2017-02-10 3 views
1

Мне нужно найти и заменить теги testNG с тестом, а также добавить новую аннотацию «disabledTests» к тому же тесту.Отрицательный lookahead для выражения, который также включен в поиск

Вот набор входных данных:

@Test(groups={"endtoend"}, enabled = false) 
    @Test(enabled = false, groups={"endtoend"}) 
    @Test(groups = {"integration"}, enabled = false) laksdflas 
    @Test(groups={"integration","honor"}, enabled = false) 
    @Test(enabled=false){} 
    @Test(groups={"integration","honor"}, enabled = true) 
    @Test(groups={"integration"}) 

Использование Notepad ++ здесь находка регулярное выражение:

((\(|enabled\s*=\s*false).*(groups\s*=\s*)(\{"|")(.*)("\}|").*(enabled\s*=\s*false|)\)|\(enabled\s*=\s*false\)) 

Вот заменить регулярное выражение:

\(enabled=true, groups={"disabledtests","\5"}\) 

Вот выход с использованием вышеупомянутых поисковых и замещающих регулярных выражений:

@Test(enabled=true, groups={"disabledtests","endtoend"}) 
@Test(enabled=true, groups={"disabledtests","endtoend"}) 
@Test(enabled=true, groups={"disabledtests","integration"}) laksdflas 
@Test(enabled=true, groups={"disabledtests","integration","honor"}) 
@Test(enabled=true, groups={"disabledtests",""}){} 
@Test(enabled=true, groups={"disabledtests","integration","honor"}) 
@Test(enabled=true, groups={"disabledtests","integration"}) 

Необязательная аннотация в пятом примере не является проблемой. Проблема касается последних две строк заменяются:

@Test(groups={"integration","honor"}, enabled = true) 
@Test(groups={"integration"}) 

Обратите внимание на входных данных, установленные эти тесты не имеет «Enabled = ложный» тега. Мне нужно, чтобы мое выражение regex исключало эти случаи, что означает, что эти строки не должны возвращаться в поиске.

Следует ли использовать отрицательные образы для этих случаев? Если да, могу ли я иметь какие-то намеки?

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

Вот желаемый результат:

@Test(enabled=true, groups={"disabledtests","endtoend"}) 
@Test(enabled=true, groups={"disabledtests","endtoend"}) 
@Test(enabled=true, groups={"disabledtests","integration"}) laksdflas 
@Test(enabled=true, groups={"disabledtests","integration","honor"}) 
@Test(enabled=true, groups={"disabledtests",""}){} 
@Test(groups={"integration","honor"}, enabled = true) 
@Test(groups={"integration"}) 
+0

Для обновления вложенных структурированных данных, вы можете рассмотреть вопрос о создании простого синтаксического анализа. В любом случае, можете ли вы изменить свой вопрос, чтобы четко показать текущий вход и какой желаемый результат вы хотите? –

+1

Хорошо, я отредактировал вопрос. – PadawanLearner

ответ

1

Добавление (?=.*enabled\s*=\s*false) в своем регулярном выражении (после (), кажется, работает. После первого ( это выглядит в текущей строке, чтобы проверить, содержит ли строка какую-либо форму «enabled = false» перед продолжением.

((?=.*enabled\s*=\s*false)(\(|enabled\s*=\s*false).*(groups\s*=\s*)(\{"|")(.*)("\}|").*(enabled\s*=\s*false|)\)|\(enabled\s*=\s*false\))

1

TestNG способ сделать то, что вы хотите, без модификации кода, является использование IAnnotationTransformer:

public class MyAnnotationTransformer implements IAnnotationTransformer { 

    @Override 
    public void transform(ITest annotation, Class<?> testClass, 
     Constructor testConstructor, Method testMethod) { 

     if (annotation.getEnabled() = false) { 
      annotation.setEnabled(true); 
      String[] groups = annotation.getGroups(); 
      String[] newGroups = new String[groups.length + 1]; 
      newGroups[0] = "disabledtests"; 
      // copy groups into newGroups 
      annotation.setGroups(newGroups); 
     } 
    } 
} 
Смежные вопросы