我想要一个项目 pom,但是当我在 Netbeans 上调用 JUnit 时,我的 GUI 测试总是运行,但是在命令行上构建(通常用于生产构建时)有条件(在环境变量上?)无头机器,但有时只是为了构建速度)。
我不介意为此测试我的 JUnit 测试,因为我已经设置了我的 GUI 测试基础设施,但是我如何对我的 pom 进行条件化!
带有 Maven 插件的 Netbeans 6.5。
有什么想法可以做到这一点吗?
伊莱恩
我想要一个项目 pom,但是当我在 Netbeans 上调用 JUnit 时,我的 GUI 测试总是运行,但是在命令行上构建(通常用于生产构建时)有条件(在环境变量上?)无头机器,但有时只是为了构建速度)。
我不介意为此测试我的 JUnit 测试,因为我已经设置了我的 GUI 测试基础设施,但是我如何对我的 pom 进行条件化!
带有 Maven 插件的 Netbeans 6.5。
有什么想法可以做到这一点吗?
伊莱恩
一种解决方案是使用配置文件(实际上可以由环境变量激活)并根据命名约定从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
参数。
为了在 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 为我指明了正确的方向。
伊莱恩