【问题标题】:TestNG: Pass parameter to DataProvider from MavenTestNG:从 Maven 将参数传递给 DataProvider
【发布时间】:2016-08-08 16:18:56
【问题描述】:

似乎我尝试了所有可能的方法来实现这一点,但没有运气。我在 DataProvider 中有一个复杂的代码(它确实以复杂的方式收集数据),我希望最终通过 CI 对其进行参数化。

这里的第一个问题是如何在DataProvider中甚至读取参数。

1 一种方法是通过这种方式从 testng.xml 中获取参数:

    String lolo = context.getCurrentXmlTest().getParameter("testcases");

但这并不能解决问题,因为.xml文件必须是静态的,我想从Maven传递参数给它。

2在我的情况下,另一种方法是从@Factory 读取参数:

    String testCaseDataFilename = (method.getAnnotation(Factory.class)).parameters()[0];

@Factory 在哪里:

    @Factory(dataProvider="dataProviderMethod", parameters = {"authentication-testcases.json"})

它也可以,但同样不能解决问题,因为现在必须在 java 测试文件中对参数进行硬编码,而我的 @Factory 为自己使用 @DataProvider,它无法从 Maven 隐式接收参数。

另外我还有其他的测试参数,都是Maven传过来的,但是只用在@Test测试中,不是DataProvider,@BeforeSuite成功接收到了。

我会尽量简化:

我叫maven

-Dtestname=signUp -Dmyparam=1 test

并且我希望我的 DataProvider 接收 Dmyparam 的这个值并使用它来收集数据。我所做的只是使用@BeforeSuite 接收这些数据并在全局范围内设置它,但问题是 DataProvider 被称为 before 数据设置。

【问题讨论】:

  • 你在工厂里试过System.getProperty("myparam")而不是param吗?
  • 看来您的问题已在此处得到解答:stackoverflow.com/questions/13245411/…
  • @JulienHerr 这条评论拯救了我的一天,它真的很管用,你可以将它作为 aswer 发布
  • @danmitch 不完全是,建议使用Parameters注解,但我不能这样做,因为我的DataProvider不能接受这些

标签: java maven testng testng-dataprovider


【解决方案1】:

-D 正在设置系统属性。

您可以通过 System.getProperty("MyParam") 在您的代码中获取它。

【讨论】:

    【解决方案2】:

    我所做的只是用@BeforeSuite 接收这些数据并在全局范围内设置它,但问题是DataProvider 在设置数据之前被调用。

    我无法确认。

    如果您能够在测试类中声明 DataProvider,您可以让 TestNG 将套件参数注入到 @BeforeSuite 方法中,然后将值存储为实例字段:

    public class Testcase3 {
    
        String foo;
        String bar;
        String baz;
    
        // Runs before the dataprovider
        @BeforeSuite
        // Injected from suite.xml and VM arguments
        @Parameters({"foo", "bar", "baz"})
        public void init(String foo, String bar, String baz) {
            this.foo = foo;
            this.bar = bar;
            this.baz = baz;
        }
    
        @DataProvider(name="foodp")
        public Object[][] foodp(){
            return new Object[][] {
                new String[] { "1: " + foo, "2: " + bar, "3: " + baz }
            };
        }
    
        // Injected from the data provider
        @Test(dataProvider="foodp")
        public void testFoo(String str1, String str2, String str3) {
            System.out.println("# test: str1=" + str1);
            System.out.println("# test: str2=" + str2);
            System.out.println("# test: str3=" + str3);
        }
    
    }
    

    有了这个suite.xml 和VM 参数-Dbaz=buzz

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="defaultsuite">
        <parameter name="foo" value="moo" />
        <parameter name="bar" value="far" />
        <test name="alltests">
            <classes>
                <class name="testng.tests.Testcase3"></class>
            </classes>
        </test>
    </suite>
    

    打印出来:

    # test: str1=1: moo
    # test: str2=2: far
    # test: str3=3: buzz
    

    您还可以让 TestNG 将参数注入工厂:

    public class TestFactory {
    
        @Factory
        @Parameters({"foo", "bar", "baz"})
        public Object[] createTestInstances(String foo, String bar, String baz) {
            Object[] testcases = new Object[1];
    
            testcases[0] = new Testcase4();
            ((Testcase4) testcases[0]).initDataProvider(foo, bar, baz);
    
            return testcases;
        }
    
    }
    

    您的测试可以通过这种方式接收数据:

    public class Testcase4 {
    
        String foo;
        String bar;
        String baz;
    
        public void initDataProvider(String foo, String bar, String baz) {
            this.foo = foo;
            this.bar = bar;
            this.baz = baz;
        }
    
        // ...
    }
    

    这至少从 TestNG 6.9.10 及更高版本开始有效。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多