Selenium之断言 Assert Assert动态封装

为什么引入断言?

我们通过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);验证的期望值和实际值不相同(即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 {

    /*为了使我们的Assert验证多条用例或者方法是否正确,
     * 所以需要设定一个boolean值来进行判断识别,私有变量,防止外部访问
     * */
    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();
            //抛出异常时记录flag=false
            setFlag(false);
        }
    }
    /*
     * 添加static是为了在类刚加载的时候就能直接调用该类的静态方法
     * Object参数类型是为了验证不同的数据类型,如String,int等
     * */
    public static void verifyEquals(Object actual,Object expected,String message) {
        /*
         * 添加try,catch是为了捕捉未封装前时如果验证失败后续用例无法执行报的错误
         * 使其能够跳过,继续执行后面的用例
         * */
        try {
                Assert.assertEquals(actual,expected,message);

        /*注意:catch中的错误参数要是:Error类型的,有别于常见的Exception,
         * 这个是根据Assert未封装前验证两个值不同时抛出的   AssertionFailedError
         * 来涵盖此类型的所有错误父类,即Error
         * */   
        } catch (Error e) {
            //仅仅代表异常消息的输出
            e.printStackTrace();
            //抛出异常时记录flag=false
            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

猜你喜欢

转载自blog.csdn.net/wushuai150831/article/details/79175444
今日推荐