Как передать параметры в заданный тест TestNG из плагина Surefire Maven? - PullRequest
1 голос
/ 08 июня 2011

Я использую 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 ]

2 голосов
/ 08 июня 2011

Я только что провел быстрый тест, и свойства, похоже, правильно передаются в 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воспроизводя вашу проблему, убедитесь, что я могу скомпилировать ее, а затем отправьте ее мне по электронной почте.

0 голосов
/ 29 ноября 2012

Я попробовал тест ниже и отлично работает

Файл My 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...