为什么引入断言?
我们通过WebDriver编写的自动化测试脚本,严格来说还不能称之为测试用例
,主要是因为我们没有对测试的结果进行验证,通过Assert断言
比较期望值和实际值是否相同可以达到我们验证结果的目的
常见Assert断言方法:
示例一:
public class TestAssert {
@Test
public void testAssert() {
System.out.println("Test1")
Assert.assertEquals(1,2)
System.out.println("Test2")
}
}
运行结果:
[RemoteTestNG] detected TestNG version 6.11.0
Test1
FAILED: testAssert
junit.framework.AssertionFailedError: expected:<1> but was:<2>
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.failNotEquals(Assert.java:282)
at junit.framework.Assert.assertEquals(Assert.java:64)
at junit.framework.Assert.assertEquals(Assert.java:201)
只打印了第一条输出信息:Test1,第二条没有打印是因为
Assert.assertEquals(1,2)
,测试没有通过
当然这样的话可能不太直观,因为如果你断言的地方过多,很容易弄混,
这时我们可以使用:Assert.assertEquals("前后两个值不同",1,2)
这时的运行结果:
Test1
FAILED: testAssert
junit.framework.AssertionFailedError: 前后两个值不同 expected:<1> but was:<2>
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.failNotEquals(Assert.java:282)
at junit.framework.Assert.assertEquals(Assert.java:64)
at junit.framework.Assert.assertEquals(Assert.java:201)
at com.test.demo.TestAssert.testAssert(TestAssert.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
会有我们之前写的关键提示信息,相对而言更加直观
其中:一般int类型数字,前面的一般是期望值参数,后面的一般是实际值参数
示例一的缺陷:
我们看到如果在两条输出数据之间添加一条断言验证,如果中间任何一条数据
出现验证错误就会导致我们的自动化测试用例停止下来,这样的话显得很不智能
比如我们执行的用例很多时,打个比方有一百条,那么如果第50,70,90条用例
出现错误,那么我们没执行一次就会在出现问题的用例的地方停止,那么我们
可不可以把100条用例全部执行完毕后,再统一归纳一下问题,之后再解决的话
这样岂不是更好?,这样避免了因为个别用例有问题导致整体无法运行的尴尬
下面的示例二会弥补示例一的缺陷
示例二
封装断言Assertion
package com.selenium.test.util;
import org.testng.Assert;
public class Assertion {
private static boolean flag=true;
public static boolean currentFlag() {
return flag;
}
public static void setFlag(boolean flag) {
Assertion.flag = flag;
}
public static void verifyEquals(Object actual, Object expected){
try{
Assert.assertEquals(actual, expected);
}catch(Error e){
e.printStackTrace();
setFlag(false);
}
}
public static void verifyEquals(Object actual,Object expected,String message) {
try {
Assert.assertEquals(actual,expected,message);
} catch (Error e) {
e.printStackTrace();
setFlag(false);
}
}
}
实例调用:
package com.test.demo
import org.testng.annotations.Test
import com.selenium.test.util.Assertion
import junit.framework.Assert
public class TestAssert {
@Test
public void testAssert() {
Assertion.setFlag(true)
System.out.println("Test1")
Assertion.verifyEquals(1,2,"不相同")
System.out.println("Test2")
Assert.assertTrue(Assertion.currentFlag())
}
}
结果输出:
[RemoteTestNG] detected TestNG version 6.11.0
Test1
java.lang.AssertionError: 不相同 expected [2] but found [1]
at org.testng.Assert.fail(Assert.java:93)
at org.testng.Assert.failNotEquals(Assert.java:512)
at org.testng.Assert.assertEqualsImpl(Assert.java:134)
at org.testng.Assert.assertEquals(Assert.java:115)
Test2
FAILED: testAssert
junit.framework.AssertionFailedError
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertTrue(Assert.java:27)
at com.test.demo.TestAssert.testAssert(TestAssert.java:17)
===============================================
Default test
Tests run: 1, Failures: 1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================
示例二总结:
1.在进行Assert断言之前需要设置一下我们的flag值,即:
Assertion.setFlag(true);目的是为了防止用例之间的flag值发生错乱,
比如上一条用例没有通过验证,在verifyEquals中的catch最后设定的
setflag(false)即flage为false,那么下一条用例执行的时候不管通不通过
都是false,所以我们需要初始化设定一下
2.其中打印的结果中:Test1下面的报错信息是通过e.printStackTrace();来打印的
当然如果我们通过verifyEquals验证的信息确定是不通过的,那么我们最后会通过
Assert.assertTrue(Assertion.currentFlag());即通过判断当前的flag值来
判断时候抛出错误信息,如果判断为错误,那么在Total tests run: 1, Failures: 1, Skips: 0
结果输出中,Failures数字会+1