TestNG框架之依赖项(五)

2021-04-20 11:27:11 浏览数 (1)

每个CASE都不是独立的,这就像同步任务一样,总得有个顺序的过程,自动化测试尤其如此,为什么这样说了?每个测试用例都不是独立的,都会涉及到不同业务场景之间的关联。再举一个更加简单的案例,就是HTTP的交互,在API的自动化测试中,我们对一个系统的操作,首先是要进入到这个系统,那么我们就需要获取登录成功后的的token信息,我们才能够对系统做一系列的操作。当然这样的案例还是有很多的。让我们庆幸的是作为主流的测试框架TestNG它提供的这样的能力,这样我们就可以很完美的在业务中进行整合和应用。在TestNG的框架中,依赖还是在两个维度来展开,一个是测试用例之间的关系,另外一个是我们可以通过testng.xml配置文件来实现我们的诉求。 我们先来看依赖性的测试,行代码的角度来深度了解依赖性测试到底是什么,案例代码如下:

代码语言:javascript复制
package test.depend;

import org.testng.annotations.Test;
import org.testng.Assert;

public class DependTest
{
    @Test(dependsOnMethods = "test_two")
    public void test_one()
    {
        System.out.println("This Is A Test One");
    }

    @Test
    public void test_two()
    {
        System.out.println("This Is A Test Two");
    }
}

在如上的代码中可以看到,test_one的测试用例执行是依赖test_two的,那么也就意味了什么,意味了我们在执行test_one的测试用例的时候,它首先会执行test_two的测试用例,再次执行test_one的测试用例,这就是依赖性。当然在TestNG测试框架中依赖性分为依赖测试方法和依赖测试组,我们这地方主要是依赖测试方法这部分。我们单独的执行test_one测试用例,其实内部就先执行test_two的测试用例,然后执行test_one的测试用例,当然如果我们只是执行test_two,因为它没有任何的依赖项,是其他测试用例依赖它,并不是它依赖其他测试用例,所以单独执行test_two的测试用例,就只会执行test_two的测试用例。如上就是依赖性的实际案例应用。当然实际的业务可能更加复杂,比如执行一个测试场景,依赖项可能会有多个测试步骤,那么也就是说一个测试用例可以依赖N个测试用例,具体案例代码如下:

代码语言:javascript复制
package test.depend;

import org.testng.annotations.Test;
import org.testng.Assert;

public class DependTest
{
    @Test(dependsOnMethods = {"test_two","test_three"})
    public void test_one()
    {
        System.out.println("This Is A Test One");
    }

    @Test
    public void test_two()
    {
        System.out.println("This Is A Test Two");
    }

    @Test
    public void test_three()
    {
        System.out.println("This Is A Test Three");
    }
}

再次看如上的代码,可以看到,测试用例test_one依赖test_two和test_three,所以单独的执行test_one后,它的顺序就是test_two->test_three->test_one,执行后的结果信息如下所示:

在如上的测试结果信息中,可以看到执行的结果和我们预期的是一致的。

在上面讲的都是在同一个类中的测试方法之间的依赖关系,还有一种方式就是继承件的依赖关系,简单点理解就是不同类之间的测试方法的依赖,我们还是通过具体的案例代码来说明这部分的应用,类DependFather.class的源码为:

代码语言:javascript复制
package test.depend;


import org.testng.annotations.Test;
import org.testng.Assert;

public class DependFather
{
    @Test()
    public void test_one()
    {
        System.out.println("This Is A Test One");
    }

    @Test
    public void test_two()
    {
        System.out.println("This Is A Test Two");
    }
}

被继承的类,也就是子类的源码为:

代码语言:javascript复制
package test.depend;

import org.testng.annotations.Test;

public class DependTest extends DependFather
{
    @Test(dependsOnMethods={"test_one"})
    public void test_four()
    {
        System.out.println("This Is A Test Four");
    }
    @Test
    public void test_five()
    {
        System.out.println("This Is A Test Five");
    }
}

我们可以看到,子类测试方法test_four依赖的测试方法test_one是基类的测试方法,我们单独执行test_four,它首先会执行基类的测试方法test_one,再执行子类的测试方法test_four,这也就是通过不同的类来实现继承式的依赖,这点功能我个人觉得是非常强大的。

下面我们来看通过组的方式来实现依赖,其实我个人觉得通过组的方式,其实最终本质上还是通过测试方法来实现的依赖,具体见如下的案例代码:

代码语言:javascript复制
package test.depend;

import org.testng.annotations.Test;

public class DependGroups
{
    @Test(dependsOnGroups = {"test-group"})
    public void test_one()
    {
        System.out.println("this is a test one");
    }

    @Test(groups = {"test-group"})
    public void test_two()
    {
        System.out.println("this is a test two");
    }

    @Test(groups = {"test-group"})
    public void test_three()
    {
        System.out.println("this is a test three");
    }
}

在如上的案例代码中,我们可以看到,test_two和test_three被分到了test-group的组中,test_one的测试方法依赖测试组test-group,也就意味着依赖这个组里面所有的测试用例,那么测试用例之间的执行顺序就会TestNG测试框架的执行顺序了。使用组了功能后,依赖性的功能就会显得特别的强大。

感谢您的阅读,后续会持续更新!

0 人点赞