实例演示自动化测试testng的assert判定,方法技巧全get
在运行下面代码之前,你觉得运行结果是打印了哪些内容呢?
Assert.assertTrue(1==2);
System.out.println("A");
System.out.println("B");
是的,你的理解没错,程序什么都不会打印!那如何解决判定失败后,还能继续执行呢?如果你想到使用try-catch的异常机制,恭喜你,前进了一大步!那像下面这份代码,又会打印什么内容呢?
public void test() {
try {
Assert.assertTrue(1==2);
System.out.println("A");
}
catch (Exception e) {
e.printStackTrace();
}
finally {
System.out.println("B");
try {
Assert.assertTrue(1==2);
System.out.println("C");
}
catch (Exception e) {
e.printStackTrace();
}
finally {
System.out.println("D");
}
System.out.println("E");
}
System.out.println("F");
Assert.assertTrue(1==2);
System.out.println("G");
}
运行结果可能超出了你的预料,是的,程序仅打印了B和D,也就是说,A、C、E、F、G的代码都未执行!
因此,在编写自动化测试脚本时,要考虑这样的异常情况处理。当你在Assert判定后,还有其他操作时,就要考虑使用这种try-catch-finally结构了。当你读懂了这个例子,具体的使用方法和场景自然迎刃而解。
讲到这里,你可能以为判定就万事大吉了,可现实很无情,看下面这个例子
try {
Assert.assertTrue(driver.findElement(By.id("name")).getText().contains("测试"));
}
catch (Exception e) { e.printStackTrace();}
finally {System.out.println("A");}
这种判定很常见,但如果你直接这样写了,用例的测试结果在某些情况下可能让人呵呵了。这样的代码会出现什么问题呢?
当findElement找不到元素时,你可能会觉得,那肯定是判定失败,继续打印A呀。但实际结果却是:判定成功,继续打印A。
竟然是判定成功!!!这不天大的笑话嘛!必须解决。结合我们之前发现的规律,我们尝试在判定前,增加一个元素是否存在的判定,如果元素不存在,就不会走后面的判定。
try {
Assert.assertTrue(ifWebElementExist(driver,By.id("name"));
Assert.assertTrue(driver.findElement(By.id("name")).getText().contains("测试"));}
catch (Exception e) { e.printStackTrace();}
finally {System.out.println("A");}
//判断元素是否存在,存在则返回true,不存在则返回false
public static boolean ifWebElementExist(WebDriver driver,By locator) {
try {
driver.findElement(locator);
return true;
}
catch (NoSuchElementException e){
return false;
}
}
再次运行,结果perfect,问题完美解决!
文章原创,以自己做自动化测试过程中遇到的问题及解决思路和步骤,供大家思考,以期抛砖引玉,共同进步和提高。