通过test.xml文件,基于已定义的优先级和多个类运行测试

时间:2017-02-24 11:53:03

标签: xml selenium-webdriver automation testng

我有3个课程,每个课程有3个测试。

第1类

@Test( priority = 1 )
public void testA1() {
    System.out.println("testA1");
}

@Test( priority = 2 )
public void testA2() {
    System.out.println("testA2");
}

@Test( priority = 3 )
public void testA3() {
    System.out.println("testA3");
}

第2类

@Test( priority = 1 )
public void testB1() {
    System.out.println("testB1");
}

@Test( priority = 2 )
public void testB2() {
    System.out.println("testB2");
}

@Test( priority = 3 )
public void testB3() {
    System.out.println("testB3");
}

第3类

@Test( priority = 1 )
public void testC1() {
    System.out.println("testC1");
}

@Test( priority = 2 )
public void testC2() {
    System.out.println("testC2");
}

@Test( priority = 3 )
public void testC3() {
    System.out.println("testC3");
}

这是我的XML文件代码。

<test verbose="2" name="hello" group-by-instances="true">
    <classes>
        <class name="Class1"></class>
        <class name="Class2"></class>
        <class name="Class3"></class>
    </classes>
</test>

这是我的答案 testA1 testB1 testC1 testA2 testB2 testC2 testA3 testB3 testC3

但我的预期答案是 testA1 testA2 testA3 testB1 testB2 testB3 testC1 testC2 testC3

提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:1)

看到的行为是预期的行为。

事实上,priority更为重要group-by-instanceshttps://github.com/cbeust/testng/blob/master/CHANGES.txt#L48) 这就是为什么TestNG尊重priority而不是group-by-instances

要实现预期的行为,您必须将priority替换为更重要的订单功能,例如dependsOnMethods

@Test
public void testA1() {
    System.out.println("testA1");
}

@Test( dependsOnMethods = "testA1" )
public void testA2() {
    System.out.println("testA2");
}

@Test( dependsOnMethods = "testA2" )
public void testA3() {
    System.out.println("testA3");
}

如评论中所述,如果您真的想要“没有强烈依赖性的课程的优先级”,您可以使用a method interceptor自行创建,您可以根据需要订购方法。在伪代码中,类似于:

public class PriorityOnClassOrder implements IMethodInterceptor {

  public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
    // 1. Group by instance/class
    Map<Class<?>, List<IMethodInstance>> map = ...
    for (IMethodInstance method : methods) {
      map.get(method.getInstance().getClass()).add(method);
    }

    List<IMethodInstance> result = ...
    // 2. Order methods from an instance/clas according to their priority
    for(Map.Entry entry : map.entries()) {
      List<IMethodInstance> m = entry.value();
      Collections.sort(m, new Comparator<IMethodInstance>() {
        public int compare(IMethodInstance o1, IMethodInstance o2) {
          return o1.getMethod().getPriority() - o2.getMethod().getPriority()
        }
      });
      result.addAll(m);
    }

    // 3. Return the result
    return result;
  }
}

答案 1 :(得分:0)

正如您可能已经注意到的那样,优先级标志会影响整个而不是单个类。最简单的方法是增加第二类的优先级。

@Test( priority = 4 )
public void testA1() {
    System.out.println("testA1");
}

@Test( priority = 5 )
public void testA2() {
    System.out.println("testA2");
}

@Test( priority = 6 )
public void testA3() {
    System.out.println("testA3");
}

此外,您可以将单个课程单独放入,我认为如果您想要分开测试域,情况会更好。

 <test name="Test1" verbose="3" >
  <classes>
    <class name="tests.NewTest"></class>
  </classes>
  </test> <!-- Test -->
  <test name="Test2" verbose="3" >
   <classes>
    <class name="tests.NewTest2"></class>
  </classes>
  </test>

verbose标志。在调试过程中我几乎不推荐这个。

答案 2 :(得分:0)

最后我得到了问题的解决方案。

请参阅以下XML代码。

<classes>
            <class name="Class1">
                <methods>
                    <include name="testA1" />
                    <include name="testA2" />
                    <include name="testA3" />
                </methods>
            </class>
           <class name="Class2">
                <methods>
                    <include name="testB1" />
                    <include name="testB2" />
                    <include name="testB3" />
                </methods>
            </class>
            <class name="Class3">
                <methods>
                    <include name="testC1" />
                    <include name="testC2" />
                    <include name="testC3" />
                </methods>
            </class>

这会给你预期的结果。此外,它也更容易管理。好像我们想要查看我的所有测试或删除一些测试,我可以查看test.xml