Testng: поддерживающие параметры на уровне метода?

Созданный на 12 окт. 2015  ·  12Комментарии  ·  Источник: cbeust/testng

Можно ли поддерживать специальные параметры на уровне метода?
Например,

<test name="Regression1">
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod" param1="121" param2="1212"  />
      </methods>
    </class>
  </classes>
</test>

Я пытаюсь добиться этого, изменив код testng - я был бы признателен за любое руководство/начало для этого.

Самый полезный комментарий

На самом деле параметры на уровне метода существуют. Вот пример:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

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

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

Все 12 Комментарий

Нет, для этого следует использовать @DataProvider .

@cbeust , проблема с @DataProvider том, что его нельзя определить из testng.xml? Причина передачи этого параметра заключается в том, что данные для метода поступают из базы данных, а этот параметр является первичным ключом. Я хочу использовать этот ключ, извлекать данные, создавать объект данных для метода во время выполнения с использованием отражения. Короче говоря, даже если я использую DataProvider, я должен передать ему значение во время выполнения, чтобы указать, какой набор строк он должен выбрать из базы данных. Обратите внимание, что это для сценария с программным использованием testng.

Вы можете определить ограниченное количество параметров в вашем testng.xml :

http://testng.org/doc/documentation-main.html#parameters-testng-xml

Седрик

В понедельник, 12 октября 2015 г., в 21:03, [email protected] написал:

@cbeust https://github.com/cbeust , проблема с @DataProvider заключается в следующем.
что его нельзя определить из testng.xml? Причина прохождения этого
параметр, заключается в том, что данные для метода поступают из базы данных, и это
параметр является первичным ключом. Я хочу использовать этот ключ, получить данные, создать
dataobject для метода во время выполнения с использованием отражения. Короче, даже
если я использую DataProvider, я должен передать ему значение во время выполнения, чтобы
указать, какой набор строк он должен выбрать из базы данных. Обратите внимание, это
предназначен для сценария с программным использованием testng.


Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/cbeust/testng/issues/823#issuecomment-147592710 .

@cbeust Разве эти параметры не на уровне набора? Что если я хочу создать сложный тип данных на уровне метода. Например, рассмотрим этот код...

public class EmployeeBenefitsCalculator {

    <strong i="7">@Test</strong>
    public void calculateBenefits(Employee employee) {
        //do something with employee here.
    }
}

Параметр Employee, отправляемый в метод calculateBenefits, должен быть создан из базы данных. Как бы я этого добился? Я хотел бы передать первичный ключ и внутри метода calculateBenefits я хочу прочитать этот первичный ключ, извлечь данные из базы данных и создать объект сотрудника для этого тестового запуска. Я знаю, это звучит сложно. Я думаю, это то, что я ищу -

public class EmployeeBenefitsCalculator {

    <strong i="11">@Test</strong>
    public void calculateBenefits(Employee employee) {
        employee = DataStore.fetch("id_from_testng_xml");
    }
}

Как предоставить параметры поставщику данных для теста во время выполнения? Насколько легко изменить это поведение, изменив исходный код testng?

Вы можете смешивать поставщика данных + параметры. Ваш поставщик данных возьмет первичный ключ из параметра и создаст ваш объект Employee + передаст любые другие атрибуты. Затем ваш тестовый метод будет использовать поставщик данных и его атрибуты.
Легкий! ;)

@juherr Не могли бы вы привести пример того, как я могу иметь несколько параметров на уровне метода, каждый из которых передается поставщику данных?

@juherr Чтобы упростить мой вопрос, я программно создаю testng.xml. Теперь предположим, что у меня есть метод modifyEmployee(сотрудник-сотрудник). Мне нужно создать xml таким образом, чтобы этот метод вызывался 4 раза, но каждый раз с другим сотрудником. Я бы знал первичный ключ каждого из этих сотрудников во время создания testng.xml. Итак, каков наилучший способ добиться того, что я пытаюсь сделать?

Я предположил, что @DataProvider может работать с @Parameters, но я не уверен (надо проверить однажды).
Кстати, если я понимаю, что вы хотите, вы можете просто попробовать параметры на уровне теста (параметры на уровне метода не существуют):

<suite>
<test name="Regression1">
<parameter name="param1" value="121" />
<parameter name="param2" value="1212" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>

<test name="Regression2">
<parameter name="param1" value="454" />
<parameter name="param2" value="4545" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>
<suite>

Вы должны задать свой вопрос на Staskoverflow или в списке рассылки, если хотите больше идей ;)

На самом деле параметры на уровне метода существуют. Вот пример:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

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

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

:+1: Полезно знать! Я никогда не видел его раньше.

@JayVem Я закрываю проблему, поскольку она уже существует.

другой подход заключается в использовании поставщика данных, который извлекает ключи из testng.xml. См. пример:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <parameter name="keys" value="key1,key2,key3,key4" />
            <class name="testng.ex2.TestParams" />
        </classes>
    </test>
</suite>
package testng.ex2;

import java.util.Arrays;
import java.util.List;

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

public class TestParams {

    @Test(dataProvider = "dp")
    public void m1(Employee e) throws Exception {
        System.out.println("name: " + e.getName() + ", age: " + e.getAge());
    }

    @DataProvider(name = "dp")
    @Parameters("keys")
    public Object[][] createData(ITestContext ctx) {
        String keysString = ctx.getCurrentXmlTest().getLocalParameters().get("keys");
        List<String> keys = Arrays.asList(keysString.split(","));

        Object[][] result = new Object[keys.size()][1];
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            result[i] = new Object[] { new Employee(key) };
        }
        return result;
    }
}

package testng.ex2;

public class Employee {

    private final String name;
    private final int age;

    public Employee(String key) {
        // use 'key' to lookup employee in database
        name = key + "_name"; // dummy value
        age = 41; // dummy value
    }

    String getName() {
        return name;
    }

    int getAge() {
        return age;
    }
}

Спасибо @drapostolos , я думаю, что поставщик данных с тестовым контекстом подойдет. Я попробую это. Большое спасибо за быстрый ответ!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги