如果在运行多个测试用例时未定义测试优先级,则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类中介绍两个案例。
- 具有相同优先级值的方法。
- 多个未按优先级排序的方法。
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中使用优先级。