如何在TestNG中保留组顺序

时间:2014-11-03 07:54:33

标签: java testng

我有两个类,每个类都以不同的方式实现,但两者的测试都相同。如果它们并行运行,每个类都会做一些会影响另一个类的事情,因此它们不能并行运行。 (这是以下代码背后的基本原理)

如果在Eclipse中运行类Both,请参见下面的TestNG测试,可以预期它首先运行ClassAAA类的测试test1和test2,然后运行ClassBBB的相同测试方法,因为ClassBBB' s组注释指定它取决于ClassAAA的注释 然而,你发现的是,看起来,TestNG有一种不同的方式来看待它,而且,似乎"它忽略了组顺序并且并行运行两个分支的测试。

class Both {

    @Test(groups={"base"})
    public static abstract class BothBase {

        @Test public void test1() { System.out.println("test1"+name()); }               
        @Test public void test2() { System.out.println("test2"+name()); }

        protected String name() {
            String s = getClass().getName();
            s = s.substring( 1 + s.lastIndexOf("$"));
            return " - " + s;
        }
    }

    @Test(groups={"gr1"})
    public static class ClassAAA extends BothBase { }

    @Test(groups={"gr2"},dependsOnGroups={"gr1"})
    public static class ClassBBB extends BothBase { }
}

输出结果为:

test1 - ClassAAA
test1 - ClassBBB
test2 - ClassAAA
test2 - ClassBBB

我不喜欢的一种尝试强迫"它遵循所需的组顺序,就是在叶类中添加一个虚拟测试方法,如下所示:

    @Test(groups={"gr1"})
    public static class ClassAAA extends BothBase { 
        @Test public void dummyTestMustBeInAllLeavesToEnforceGroupOrder() { 
            System.out.println("dummyTestMustBeInAllLeavesToEnforceGroupOrder"+name());
        }   
    }

    @Test(groups={"gr2"},dependsOnGroups={"gr1"})
    public static class ClassBBB extends BothBase { 
        @Test public void dummyTestMustBeInAllLeavesToEnforceGroupOrder() { 
            System.out.println("dummyTestMustBeInAllLeavesToEnforceGroupOrder"+name());
        }   
    }

这仍然不能完全按照人们的预期行事。输出是:

test1 - ClassAAA
test2 - ClassAAA
test2 - ClassBBB
dummyTestMustBeInAllLeavesToEnforceGroupOrder - ClassAAA
test1 - ClassBBB
dummyTestMustBeInAllLeavesToEnforceGroupOrder - ClassBBB

这意味着它在完成ClassAAA的测试之前就开始运行ClassBBB的测试 我不喜欢这样一个事实:我必须为每个方法添加一个虚拟/不相关的方法,以使TestNG了解它们不能并行运行。事实上,我并不关心哪个班级首先运行......而且,我并没有真正完成我想要的,因为它们仍在并行运行。

实现此目标的最愚蠢的方法是将测试从基类移动到每个叶类 - 是否假设您在TestNG中执行这些操作?

还有另一种方法吗?我确定有人会提出优先考虑的事项 - 但是,这并没有表达真正的意图 - 我没有优先权 - 只是不希望他们并行运行。我也不想写XML文件......

2 个答案:

答案 0 :(得分:0)

这个问题是由静态内部类引起的。尝试以下代码,您将获得所需的输出

import org.testng.annotations.Test;


    @Test(groups={"base"})
    public abstract  class BothBase {

        @Test public void test1() { System.out.println("test1"+name()); }               
        @Test public void test2() { System.out.println("test2"+name()); }

        protected String name() {
            String s = getClass().getName();
            s = s.substring( 1 + s.lastIndexOf("$"));
            return " - " + s;
        }
    }

    @Test(groups={"gr1"})
      class ClassAAA extends BothBase { }

    @Test(groups={"gr2"},dependsOnGroups={"gr1"})
      class ClassBBB extends BothBase { }

答案 1 :(得分:0)

很多方式

最简单 - 优先级

比较难(组)

检查testng手册(例如此http://www.mkyong.com/tutorials/testng-tutorials/)。