2018-06-08

Как получить список шагов внутри теста без выполнения самих шагов?

Дано:
Авто-тесты(Джава + ТестНГ + Аллюр).
Шаги (@Step) - ничего не возвращают, все войд.
Среди тестов встречаются параметризированные.

Странная задача:
а. Сами тесты (шаги) не выполнять;
б. Получить список всех тестов;
в. Для каждого теста - получить список шагов вместе с параметрами.

Не менее странное влобное решение:
1. Использовать аспекты;
2. Вешать  @Around на ("anyMethod() && withStepAnnotation()");
3. Использовать org.aspectj.lang.reflect для вытаскивания аннотаций и названий/значений параметров;
4. Внутри совета @Around - вытягивать нужную информацию, а сам аллюровский шаг не запускать, возвращать налл.

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.testng.ITestResult;
import org.testng.Reporter;
import ru.yandex.qatools.allure.annotations.Step;
...
@Pointcut("@annotation(ru.yandex.qatools.allure.annotations.Step)")
public void withStepAnnotation() {}

@Pointcut("execution( (..))")
public void anyMethod() {}
...
@Around("anyMethod() && withStepAnnotation()")
public Object logTestStepDataAndSkipExecution(ProceedingJoinPoint point) throws Throwable {
    if (isDryRun) {
        MethodSignature methodSignature = MethodSignature.class.cast(point.getSignature());

        String paramNamesAndValues = getParamNamesAndValues(point, methodSignature);
        
        Util.addStepDescriptionEntry(createTitle(point) + " | " + paramNamesAndValues);

        return null;
    } else {
        return point.proceed();
    }
}
...
private String getParamNamesAndValues(JoinPoint point, MethodSignature methodSignature) {
    String[] paramNames = methodSignature.getParameterNames();
    Object[] paramValues = point.getArgs();
    StringBuilder sb = new StringBuilder();
    for (int i=0; i< paramNames.length; i++) {
        sb.append(paramNames[i]).append("=").append(paramValues[i]).append(" | ");
    }
    return sb.toString();
}


Ссылки:
Основная доля вдохновения почерпнута из https://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html
А в целом - https://duckduckgo.com/?q=Java+AspectJ+examples&t=ffab&ia=web

Комментариев нет:

Отправить комментарий