如何从Surefire Maven插件传递参数到guicified TestNG测试?

时间:2011-06-08 14:39:43

标签: maven-2 testng guice maven-surefire-plugin

我正在使用Maven + Surefire + TestNG + Guice(最新的稳定版)

我有“大”测试需要Guice运行。 基本上我是这样做的:

@Test(groups = "large")
@Guice(modules = FooLargeTest.Module.class)
public class FooLargeTest {
  public static class Module extends AbstractModule {
    public void configure() {
      bindConstant().annotatedWith(FooPort.class).to(5000);
      // ... some other test bindings
    }
  }
  @Inject Provider<Foo> fooProvider;
  @Test
  public void testFoo() {
    Foo foo = fooProvider.get() // here injection of port is done
                                // it could not be passed to constructor
    // ... actual test of foo
  }
}

问题是FooPort被硬编码为5000。它是Maven属性,因此第一次尝试使用下一个Surefire配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <suiteXmlFiles>
        <suiteXmlFile>testng.xml</suiteXmlFile>
      </suiteXmlFiles>
      <systemPropertyVariables>
        <fooPort>${foo.port}</fooPort>
      </systemPropertyVariables>
    </configuration>
 </plugin>

在那个请求之后它就像System.getProperty("fooPort")。不幸的是,文档说,这只适用于JUnit测试。至少我在测试调试期间看不到这个系统变量。我尝试了forkMode默认值和never,它没有改变任何内容。对于TestNG测试,建议采用这种方式:

<properties>
  <property>
    <name>fooPort</name>
    <value>${foo.port}</value>
  </property>
</properties>

但是现在我应该使用Guice的这个属性,所以它应该以某种方式给予GuiceModule,我已经尝试了下一个方法:

@Test(groups = "large")
@Guice(moduleFactory = FooLargeTest.ModuleFactory.class)
public class FooLargeTest {
  public static class ModuleFactory extends AbstractModule {
    private final String fooPort = fooPort;
    @Parameters("fooPort")
    public ModuleFactory(String fooPort) {
      this.fooPort = fooPort;
    }
    public Module createModule(final ITestContext context, Class<?> testClass) { 
      return new AbstractModule {
        public void configure() {
          bindConstant().annotatedWith(FooPort.class).to(fooPort);
          // ... some other test bindings
        }
      }
    }
  }
  @Inject Provider<Foo> fooProvider;
  @Test
  public void testFoo() {
    Foo foo = fooProvider.get() // here injection of port is done
    // actual test of foo
  }
}

但是这种方式也失败了,因为modulefactories的创建者没有考虑@Parameters,因此无法创建工厂的实例。

看起来我应该尝试从ITestContext context获取一些数据,但我不知道数据是如何存在的,或者是否有更简单的方法来做我想要的事情。

感谢您的回复。

2 个答案:

答案 0 :(得分:2)

我刚刚进行了快速测试,属性似乎正确传递给了TestNG:

    <configuration>
      <suiteXmlFiles>
        <suiteXmlFile>src/test/resources/testng-single.yaml</suiteXmlFile>
      </suiteXmlFiles>
      <systemPropertyVariables>
        <foo>bar</foo>
      </systemPropertyVariables>

我的套件文件调用测试类B,其中包含:

@Test
public void f() {
  System.out.println(" property:" + System.getProperty("foo"));
}

并使用Maven运行它:

property:bar
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.358 sec

我在这个简单的例子中没有使用Guice,但这是你的代码和我的代码之间的唯一区别。

随意创建一个重现问题的小型Maven项目,确保我可以编译它然后通过电子邮件发送给我。

答案 1 :(得分:0)

我尝试了以下测试并且工作正常

我的Pom文件

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <!--<groups>Regression</groups> -->
                    <systemPropertyVariables>
                        <environment>UAT</environment>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>

我的TestNG测试

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


public class TestAuthentication {

    @Test (groups = { "Sniff", "Regression" })
    public void validAuthenticationTest(){
        System.out.println(" property:" + System.getProperty("environment"));
    }

    @Test (groups = { "Regression" },parameters = {"environment"})
    public void failedAuthenticationTest(String environment){
        System.out.println("Regression-"+environment);
    }

    @Parameters("environment")
    @Test (groups = { "Sniff"})
    public void newUserAuthenticationTest(String environment){
        System.out.println("Sniff-"+environment);
    }
}