【问题标题】:TestNG - Order of Tests execution in selenium scriptTestNG - 硒脚本中的测试执行顺序
【发布时间】:2017-12-21 10:21:57
【问题描述】:

我正在使用 selenium 3.8.1 和 TestNG 6.9.2 版本,而在完成 @Test 方法之前的测试执行另一个 @Test 方法开始了,因为这个我在 selenium 脚本中遇到错误在完成测试用例后执行。

一类

public class LoginPage{


@Test(priority=0)
public void test1(){

System.out.println(first test);
}


@Test(priority=1)
public void test2(){

System.out.println(Second test);
}

}

二等

public class HomePage{


@Test(priority=0)
public void test3(){

System.out.println(first test);
}

@Test(priority=1)
public void test4(){

System.out.println(Second test);
}

}

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test name="Test" preserve-order="true">
    <classes>
      <class name="com.tests.day.modules.LoginPage"/>
      <class name="com.tests.day.modules.HomePage"/>    
    </classes>
  </test>
</suite>

在完成登录页面类的test2之前使用testng.xml文件执行上述操作后,test3正在启动主页,因为这个我得到了异常,无法找到元素。

【问题讨论】:

  • 你怎么知道 test3 在 test2 完成之前开始了。当我们将保留顺序设置为 true 时,它​​将仅在 test2 之后启动 test3。可能是其他原因造成的异常。
  • 在测试中我正在打印页面标题,当时测试 3 页面标题在打印测试 2 页面标题之后首先打印

标签: java selenium selenium-webdriver testng testng-annotation-test


【解决方案1】:

Annotations 提到了 TestNGpreserve-order 属性如下:

默认情况下,TestNG 会按照它们所在的顺序运行你的测试 XML 文件。如果您想要此文件中列出的类和方法 要以不可预测的顺序运行,请设置 preserve-order 属性 假的

我执行了与您的代码块和testng.xml 类似的相同测试,如下所示:

  • 登录页面

    package testng_order_of_tests_execution;
    
    import org.testng.annotations.Test;
    
    public class LoginPage 
    {
    
        @Test(priority=0)
        public void test1(){
    
        System.out.println("First Test");
        }
    
    
        @Test(priority=1)
        public void test2(){
    
        System.out.println("Second Test");
        }
    }
    
  • 首页

    package testng_order_of_tests_execution;
    
    import org.testng.annotations.Test;
    
    public class HomePage 
    {
    
        @Test(priority=0)
        public void test3(){
    
        System.out.println("first test");
        }
    
        @Test(priority=1)
        public void test4(){
    
        System.out.println("second test");
        }
    }
    
  • testng.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="Suite">
      <test name="Test" preserve-order="true">
        <classes>
          <class name="testng_order_of_tests_execution.LoginPage"/>
          <class name="testng_order_of_tests_execution.HomePage"/>
        </classes>
      </test> <!-- Test -->
    </suite> <!-- Suite -->
    

我在控制台上发现的输出与您的类似,如下所示:

First Test
first test
Second Test
second test

这个Console Output 显然给我们的印象是执行顺序是:

test1() -> test3() -> test2() -> test4()

但实际上没有

查看运行套件的结果,你会得到如下图的实际执行顺序:

所以很明显,实际的顺序是:

test1() -> test2() -> test3() -> test4()

琐事

您可以使用 testng-results.xml 进行更细致的观察,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<testng-results skipped="0" failed="0" ignored="0" total="4" passed="4">
  <reporter-output>
  </reporter-output>
  <suite name="Suite" duration-ms="61" started-at="2017-12-25T12:57:12Z" finished-at="2017-12-25T12:57:12Z">
    <groups>
    </groups>
    <test name="Test" duration-ms="61" started-at="2017-12-25T12:57:12Z" finished-at="2017-12-25T12:57:12Z">
      <class name="testng_order_of_tests_execution.HomePage">
        <test-method status="PASS" signature="test3()[pri:0, instance:testng_order_of_tests_execution.HomePage@5419f379]" name="test3" duration-ms="4" started-at="2017-12-25T18:27:12Z" finished-at="2017-12-25T18:27:12Z">
          <reporter-output>
          </reporter-output>
        </test-method> <!-- test3 -->
        <test-method status="PASS" signature="test4()[pri:1, instance:testng_order_of_tests_execution.HomePage@5419f379]" name="test4" duration-ms="1" started-at="2017-12-25T18:27:12Z" finished-at="2017-12-25T18:27:12Z">
          <reporter-output>
          </reporter-output>
        </test-method> <!-- test4 -->
      </class> <!-- testng_order_of_tests_execution.HomePage -->
      <class name="testng_order_of_tests_execution.LoginPage">
        <test-method status="PASS" signature="test1()[pri:0, instance:testng_order_of_tests_execution.LoginPage@735b5592]" name="test1" duration-ms="14" started-at="2017-12-25T18:27:12Z" finished-at="2017-12-25T18:27:12Z">
          <reporter-output>
          </reporter-output>
        </test-method> <!-- test1 -->
        <test-method status="PASS" signature="test2()[pri:1, instance:testng_order_of_tests_execution.LoginPage@735b5592]" name="test2" duration-ms="2" started-at="2017-12-25T18:27:12Z" finished-at="2017-12-25T18:27:12Z">
          <reporter-output>
          </reporter-output>
        </test-method> <!-- test2 -->
      </class> <!-- testng_order_of_tests_execution.LoginPage -->
    </test> <!-- Test -->
  </suite> <!-- Suite -->
</testng-results>

testng-results.xml 中,您将观察到所有测试都从 2017-12-25T12:57:12Z 开始并在 2017-12 结束-25T12:57:12Z。尽管 Test Execution 花费的时间甚至少于 1 秒,但您仍可以观察到实例名称的差异,例如 instance:testng_order_of_tests_execution.HomePage@5419f379instance:testng_order_of_tests_execution.LoginPage@735b5592。由于我们的测试单线程测试,因此我们可以得出结论,执行顺序是正确的并且符合预期。但是控制台输出搞混了。

【讨论】:

    【解决方案2】:

    在 testng.xml 的 test 标签内使用group-by-instances="true"

    定义您的 xml test 标签,如下所示:

    <test name="Test" group-by-instances="true">
    

    或者,您也可以检查以下代码行:

    <test name="Test" preserve-order="true" group-by-instances="true">
    

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 2019-08-14
      相关资源
      最近更新 更多