Testng: メソッドレベルでパラメータをサポートしますか?

作成日 2015年10月12日  ·  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

セドリック

2015年10月12日月曜日の午後9時3分、 JayVemnotifications @ github.comは次のように書いています。

@cbeust https://github.com/cbeust、@DataProvider課題
testng.xmlから定義できないということですか? これを通過する理由
パラメータは、メソッドのデータがデータベースから取得され、これが
パラメータは主キーです。 このキーを使用して、データをフェッチし、作成します
リフレクションを使用した実行時のメソッドのデータオブジェクト。 つまり、要するに、
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.
    }
}

calculateBenefitsメソッドに送信されるEmployeeパラメーターは、データベースから作成する必要があります。 どうすればこれを達成できますか? 主キーを渡したいのですが、calculateBenefitsメソッド内で、この主キーを読み取り、dbからデータをフェッチして、そのテスト実行用の従業員オブジェクトを作成します。 私はそれが複雑に聞こえることを知っています。 これが私が探しているものだと思います-

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(Employee employee)があるとします。 このメソッドが4回呼び出されるように、ただし毎回異なるEmployeeを使用してxmlを作成する必要があります。 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に感謝します。testcontextを備えたdataproviderは、そうなるように聞こえると思います。 これを試してみます。 迅速な回答ありがとうございます!

このページは役に立ちましたか?
0 / 5 - 0 評価