TestNG在Selenium中的测试优先级

如果在运行多个测试用例时未定义测试优先级,则TestNG会将所有的@Test的优先级指定为 zero(0) 。在运行的时候,较低的优先级将首先运行。

在本教程中,将了解-

  • 无优先级测试代码演示
  • 按字母顺序无优先级测试代码演示
  • 如何在测试中设置优先级
  • 具有相同优先级的方法
  • 结合使用 prioritized(having same priority) 和非优先级方法

无优先级测试代码演示

来看一个场景,其中需要排序才能通过所有测试用例。

场景: 生成一段代码,要求使用特定的关键字执行Baidu搜索,比如“微信”。现在,验证浏览器标题是否更改为“微信-百度搜索”。 注意:编码的每个步骤都应该在不同的方法中。

方法1 :打开浏览器说火狐(openBrowser()))

方法2 :启动baidu.com(launchBaidu())

方法3 :使用“微信”进行搜索(performSearchAndClick1stLink())

方法4 :验证百度搜索页面标题(WeChatPageTitleVerification)

代码 :

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Priority_In_testNG {
    WebDriver driver;
    // Method 1: Open Brower say Firefox
    @Test
    public void openBrowser() {
        driver = new FirefoxDriver();
    }
    // Method 2: Launch Google.com
    @Test
    public void launchBaidu() {
        driver.get("http://www.baidu.com");
    }
    // Method 3: Perform a search using "Facebook"
    @Test
    public void peformSeachAndClick1stLink() {
        driver.findElement(By.xpath(".//*[@title='百度一下']")).sendKeys("微信");
    }
    // Method 4: Verify baidu search page title.
    @Test
    public void WeChatPageTitleVerification() throws Exception {
        driver.findElement(By.xpath(".//*[@value='kw']")).click();
        Thread.sleep(3000) ;
        Assert.assertEquals(driver.getTitle().contains("微信 - Baidu Search"), true);
    }
}
 

如上所述,已经创建了4个测试用例,用于在独立的方法中执行每个操作。

  • 第1种方法 (openBrowser) 初始化Firefox浏览器的状态。
  • 第2种方法 (launchBaidu) 在浏览器中打开baidu.com。
  • 第3种方法 (peformSeachAndClick1stLink) 在搜索框中执行搜索(By.xpath (“.//* [@title=‘kw’] ”) 其搜索词为微信
  • 第4种也是最后一种方法 (WeChatPageTitleVerification) 声明单击搜索图标,并验证浏览器标题是否已更改为 微信 – Baidu Search。

现在使用TestNG运行此代码,发现所有测试用例都失败了。失败原因:由于需要通过前一个测试用例的依赖,所以只有当前运行的测试用例才会通过。

在这种情况下,

  • 执行的第1个方法是 openBrowser() . 它之所以通过,是因为它没有任何依赖关系。
  • 执行的第2个方法是 WeChatPageTitleVerification() ; 它失败了,因为正在尝试单击搜索按钮并验证浏览器标题。
  • 可以看到,如果没有处理搜索活动,那么如何通过任何其他步骤。因此,这就是测试用例失败的原因。
 PASSED:openBrowser
FAILED:WeChatPageTitleVerification
FAILED:launchBaidu
FAILED:peformSeachAndClick1stLink
 

按字母顺序无优先级测试代码演示

如果没有任何优先级,TestNG将根据@Test方法名的字母顺序执行 @Test方法 ,而不考虑它们在代码中的实现位置。

 package com.guru.testngannotations;
import org.testng.annotations.Test;
public class TestNG_Priority_Annotations {
    @Test
    public void c_method() {
        System.out.println("I'm in method C");
    }
    @Test
    public void b_method() {
        System.out.println("I'm in method B");
    }
    @Test
    public void a_method() {
        System.out.println("I'm in method A");
    }
    @Test
    public void e_method() {
        System.out.println("I'm in method E");
    }
    @Test
    public void d_method() {
        System.out.println("I'm in method D");
    }
}
 

输出

 I'm in method A
I'm in method B
I'm in method C
I'm in method D
I'm in method E
 

虽然以随机的方式定义方法(c、b、a、e、d),但是TestNG通过考虑字母顺序来基于方法名称执行方法,并且输出中也反映了这一点。

如何在测试中设置优先级

在前面的示例中看到的,需要进行排序才能通过,因此将使用以下命令修改代码:优先级参数。因此,每个测试都应该与分配给它们的优先级先后运行。

现在,正如所看到的,已经为每个测试用例分配了优先级,将首先执行较低的优先级的测试用例。TestNG的优先级

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Priority_In_testNG {
    WebDriver driver;
    // Method 1: Open Browser say Firefox
    @Test (priority=1)
    public void openBrowser() {
        driver = new FirefoxDriver();
    }
    // Method 2: Launch baidu.com
    @Test (priority=2)
    public void launchBiadu.com() {
        driver.get("http://www.baidu.com");
    }
    // Method 3: Perform a search using "微信"
    @Test (priority=3)
    public void peformSeachAndClick1stLink() {
        driver.findElement(By.xpath(".//*[@title='百度一下']")).sendKeys("微信");
    }
    // Method 4: Verify Baidu search page title.
    @Test (priority=4)
    public void FaceBookPageTitleVerification() throws Exception {
        driver.findElement(By.xpath(".//*[@value='kw']")).click();
        Thread.sleep(3000) ;
        Assert.assertEquals(driver.getTitle().contains("微信 - Baidu Search"), true);
    }
}
 

为每个测试用例分配优先级后,使用TestNG运行上面的代码。在这里,可以看到测试用例是按优先顺序排列的。因此,所有的测试用例现在都通过了。

Eclipse的控制台,输出 :

 PASSED:openBrowser
PASSED:launchBaidu
PASSED:peformSearchAndClick1stLink
PASSED:WeChatPageTitleVerification
 

数字0具有最高的 priority(it’ll be executed first) ,并且优先级基于给定的数字。即,0具有比1更高的优先级。1具有比2更高的优先级,依此类推。

 package com.itxiaonv.testngannotations;
import org.testng.annotations.Test;
public class TestNG_Priority_Annotations {
    @Test(priority=6)
    public void c_method() {
        System.out.println("I'm in method C");
    }
    @Test(priority=9)
    public void b_method() {
        System.out.println("I'm in method B");
    }
    @Test(priority=1)
    public void a_method() {
        System.out.println("I'm in method A");
    }
    @Test(priority=0)
    public void e_method() {
        System.out.println("I'm in method E");
    }
    @Test(priority=3)
    public void d_method() {
        System.out.println("I'm in method D");
    }
}
 

输出

 I'm in method E
I'm in method A
I'm in method D
I'm in method C
I'm in method B
 

这里设置优先级为0、1、3、6、9。因此,优先级为0的方法是e这里不考虑按字母顺序排列的方法名称,因为设置了优先级。

具有相同优先级的方法

方法可能包含相同的优先级。在这些情况下,TestNG会考虑优先级相同的方法名称的字母顺序。

 package com.itxiaonv.testngannotations;
import org.testng.annotations.Test;
public class TestNG_Priority_Annotations {
    @Test(priority=6)
    public void c_method() {
        System.out.println("I'm in method C");
    }
    @Test(priority=9)
    public void b_method() {
        System.out.println("I'm in method B");
    }
    @Test(priority=6)
    public void a_method() {
        System.out.println("I'm in method A");
    }
    @Test(priority=0)
    public void e_method() {
        System.out.println("I'm in method E");
    }
    @Test(priority=3)
    public void d_method() {
        System.out.println("I'm in method D");
    }
}
 

输出

 I'm in method E
I'm in method D
I'm in method A
I'm in method C
I'm in method B
 

这里‘e’和‘d’是根据它们的优先级值执行的。因此,TestNG考虑“a”和“c”的字母顺序,并相应地执行测试。

结合使用相同优先级和非优先级方法

在本例中,将在一个TestNG类中介绍两个案例。

  1. 具有相同优先级值的方法。
  2. 多个未按优先级排序的方法。
 package com.itxiaonv.testngannotations;
import org.testng.annotations.Test;
public class TestNG_Priority_Annotations {
    @Test()
    public void c_method() {
        System.out.println("I'm in method C");
    }
    @Test()
    public void b_method() {
        System.out.println("I'm in method B");
    }
    @Test(priority=6)
    public void a_method() {
        System.out.println("I'm in method A");
    }
    @Test(priority=0)
    public void e_method() {
        System.out.println("I'm in method E");
    }
    @Test(priority=6)
    public void d_method() {
        System.out.println("I'm in method D");
    }
}
 

输出:

 I'm in method B
I'm in method C
I'm in method E
I'm in method A
I'm in method D
 
 PASSED:
b_method
PASSED:
c_method
PASSED:
e_method
PASSED:
a_method
PASSED:
d_method
 

说明:首选, 未按优先级排序的方法:‘c’和‘b’:根据字母顺序,首先执行‘b’,然后执行‘c’。 其次,按优先级排序的方法:‘a’、‘e’和‘d’,‘e’被首先执行,因为它具有最高的 priority(0) 。

测试中区分大小写

在TestNG中,有定义优先级的标准语法,即 @Test (priority=4) , 假设正在用其他语法定义它,比如 @Test (PRIORITY=1)然后,IDE会将其显示为编译错误。参阅下图:

TestNG Priority in Test Cases
TestNG Priority in Test Cases

结论:如果需要以特定的顺序运行一组测试用例,那么可以在TestNG中使用优先级。

IT赶路人

专注IT知识分享