TestNG // Можно ли динамически прокинуть значение для параметра ?

Всем привет.

Возник такой вопрос:
допустим имеется такая структура теста из TestNG:

<suite name="TEST suite" configfailurepolicy="continue">
    <test name="ABC test name">
        <parameter name="PARAM" value="PARAM_VAL"/>
        <classes>
            <class name="className1"/>
            <class name="className2"/>
            <class name="className3"/>
        </classes>
    </test>
</suite>

Могу ли я динамически прокинуть из теста в рантайме value для параметра этого теста ?
Т.е. в каком-то из классов className1,2,3 подставить в эту xml-ку для параметра PARAM своё значение value ?

То что вы хотите сделать, это грязный хак. Вы либо используете просто параметры, либо создайте переменную и её используйте.
Но я сделал, стреляйте себе в ногу:

        for (Field ff:this.getClass().getFields()){
            if (ff.getName().contains("user3_pass")){ // здесь мы ищем наш parameter name
                ff.setAccessible(true);
                ff.set(this, "new password from test"); // здесь задаём новое value
            }
        }

Такой результат:

А где у вас аннотация @Parameters ?

Что-то не работает:

package tests.ts;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.lang.reflect.Field;

public class Test1
{
    @Test(priority = 1)
    @Parameters("PARAM")
    public void t1(String PARAM) throws IllegalAccessException
    {
        System.out.println("PARAM before = " + PARAM);

        for (Field ff:this.getClass().getFields())
        {
            if (ff.getName().contains("PARAM"))
            {
                ff.setAccessible(true);
                ff.set(this, "DYNAMIC_PARAM");
            }
        }

        System.out.println("PARAM after = " + PARAM);
    }

    @Test(priority = 2)
    public void t2()
    {

    }
}

Всё еще актуально.

  • опишите пожалуйста
    1 . юз кейс когда информация не была известна до но стала известна во время теста
  1. почему вдруг не подходят другие методы передачи переменных через свойства какого нибудь класса (по простому или с геттерами сеттерами и проч наворотами) или через внешний файл

Помню, нужно было для чего-то. Сейчас не могу уже точно вспомнить для чего, но:
представим что у нас есть 2 теста идентичных, которым подсовываем параметр PARM.
Логично, что для второго теста нужно значение параметра поменять, иначе второй будет выполнен так же как и первый. Вот вам и юзкейс.
Сейчас не говорим про DataProvider, т.к. он действует в пределах кода, а не в пределах xml-ки.

    iTestContext.getSuite().getXmlSuite().setParameters() попробуйте вот так

Только не забывайте что раз измените то все последующие тесты будут гнаться уже с новым значением

1 лайк

@Vladislav_Sobol
Ух ты !
Спасибо. Это именно то что нужно. Заработало.

public class TestA
{
    @Test
    @Parameters("PARAM")
    public void testA(String PARAM, ITestContext context)
    {
        System.out.println("PARAM before = " + PARAM);

        Map<String, String> params = new HashMap<>();

        params.put("PARAM", "AlteredVal123");

        context.getSuite().getXmlSuite().setParameters(params);

        System.out.println("PARAM after in TestA: " + context.getSuite().getXmlSuite().getParameter("PARAM"));
    }
}
@Test
    public void testB(ITestContext context)
    {
        System.out.println("PARAM in TestB: " + context.getSuite().getXmlSuite().getParameter("PARAM"));
    }

Вывод:

PARAM before = PARAM_VAL
PARAM after in TestA: AlteredVal123
PARAM in TestB: AlteredVal123

Но тогда это мало отличается от того, как если бы у нас имелась отдельная мапка для параметров и мы бы ее дергали из разных тестов.
Потому что, если переписать на:

public class TestB
{
    @Test
    @Parameters("PARAM")
    public void testB(String PARAM, ITestContext context)
    {
        System.out.println("PARAM in TestB: " + PARAM);
        System.out.println("PARAM in TestB: " + context.getSuite().getXmlSuite().getParameter("PARAM"));
    }
}

То получим всё равно:

PARAM before = PARAM_VAL
PARAM after in TestA: AlteredVal123
PARAM in TestB: PARAM_VAL
PARAM in TestB: AlteredVal123

То есть в первой строке PARAM всё равно остается PARAM_VAL, не изменившись.
Понимаете, к чему я клоню ? :slight_smile:

Можно во внешнем файле дата провайдер - возьмите к примеру мой же проект