我正在使用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
获取一些数据,但我不知道数据是如何存在的,或者是否有更简单的方法来做我想要的事情。
感谢您的回复。
答案 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);
}
}