1

我想要一个项目 pom,但是当我在 Netbeans 上调用 JUnit 时,我的 GUI 测试总是运行,但是在命令行上构建(通常用于生产构建时)有条件(在环境变量上?)无头机器,但有时只是为了构建速度)。

我不介意为此测试我的 JUnit 测试,因为我已经设置了我的 GUI 测试基础设施,但是我如何对我的 pom 进行条件化!

带有 Maven 插件的 Netbeans 6.5。

有什么想法可以做到这一点吗?

伊莱恩

4

3 回答 3

0

Surefire 插件可以指定要运行的测试。

您可以为不同的配置文件指定不同的集合,并使用 选择您的配置文件-P{profilename}

于 2010-05-24T21:04:42.003 回答
0

一种解决方案是使用配置文件(实际上可以由环境变量激活)并根据命名约定从Maven Surefire Plugin配置文件中使用的配置中排除 GUI 测试。excludes像这样的东西:

<profile>
  <id>headless</id>
  <activation>
    <property>
      <name>env.FOO</name>
      <value>foo</value>
    </property>
  </activation>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <excludes>
            <exclude>**/*$*</exclude><!-- to exclude inner classes -->
            <exclude>**/gui/**</exclude>
          </excludes>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
</profile>

另一种选择是使用 TestNG 并利用该excludeGroups参数。

于 2010-05-24T22:47:27.327 回答
0

为了在 Netbeans 上的 Maven 项目中实现所需的行为,我在项目的 pom 中设置了一个定义环境变量的配置文件,并修改了项目属性中的测试文件操作以激活我的新配置文件。通过这种方式,我可以在我的测试中检查环境变量。(这可以通过系统属性类似地完成。)

然而,为了避免对每个 GUI 测试添加检查,我发现我可以添加一个 JUnit 过滤器,它会在我不想运行 UI 测试并输入数字的情况下自动忽略它们测试结果行中跳过的测试。

这是我的个人资料的样子:

      <个人资料>
          <id>测试界面</id>
          <构建>
              <插件>
                  <插件>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <配置>
                      <skipTests>假</skipTests>
                      <不包括>
                        <exclude>**/TestSuite.java</exclude>
                      </排除>
                       <环境变量>
                        <GUI_TEST>真</GUI_TEST>
                      </环境变量>
                    </配置>
                  </插件>
                </插件>
              </build>
      </profile>

以下是有关如何更新 Netbeans 操作的说明:

(在项目窗口中右键单击项目)-> 属性
    在类别框中,选择“操作”
        在操作框中,选择“测试文件”
            在激活配置文件文本字段中,输入“test-gui”
    单击“确定”按钮保存。

为了添加 JUnit 过滤器(并且文档很少,所以我可能没有以最有效的方式完成此操作),我将默认测试运行程序 TestClassRunner 子类化并让它调用我的过滤器,它检查测试名称和环境变量. 为了让 JUnit 调用我的类,我注释了测试类。


public class GUITestClassRunner extends TestClassRunner {

    public GUITestClassRunner(Class klazz) throws InitializationError {
        super(klazz);
    }

    public GUITestClassRunner(Class klazz, Runner runner) 
        throws InitializationError, NoTestsRemainException {
        super(klazz, runner);
    }

    @Override
    public void  run(RunNotifier notifier) {
        if (getDescription().testCount() > 0) {
            try {
                filter(new GUIFilter(notifier));
            } catch (NoTestsRemainException ex) {
                Description description = getDescription();
                notifier.fireTestStarted(description);
                notifier.fireTestIgnored(description);
                notifier.fireTestFinished(description);
                return;
            }
        }
        super.run(notifier);
    }

    class GUIFilter extends Filter {
        private boolean isGUI = false;
        private RunNotifier notifier;

        public GUIFilter(RunNotifier notifier) {
            this.notifier = notifier;
            isGUI = UI.isGUITestEnvironment();
        }

        @Override
        public boolean shouldRun(Description desc) {
            if (!isGUI && UI.isGUITest(desc.getDisplayName())) {
                Description description = getDescription();
                notifier.fireTestStarted(description);
                notifier.fireTestIgnored(description);
                notifier.fireTestFinished(description);
                return false;
            }
            return true;
        }

        @Override
        public String describe() {
            return "all tests except GUI tests if headless";
        }
    }
}


要调用此运行器,测试类需要使用以下注释:


@RunWith(GUITestClassRunner.class)
public class MyJUnitTestClass
{
    ....
    @Test
    public void testAlpha() {...}

    @Test
    public void testBeta_UI() {...}
}

所以,现在,从 Netbeans,我只需运行我的单元测试类,GUI 测试就会自动运行。我可以在没有设置环境变量或 GUI_TEST 设置为 false 的情况下从命令行运行,并且我的 GUI 测试被跳过,或者我可以在 GUI_TEST 设置为 true 的情况下从命令行运行,或者使用mvn -Ptest-gui并运行我的所有 GUI 测试。

我衷心感谢 Brian 和 Pascal 为我指明了正确的方向。

伊莱恩

于 2010-06-04T20:10:13.253 回答