每个CASE都不是独立的,这就像同步任务一样,总得有个顺序的过程,自动化测试尤其如此,为什么这样说了?每个测试用例都不是独立的,都会涉及到不同业务场景之间的关联。再举一个更加简单的案例,就是HTTP的交互,在API的自动化测试中,我们对一个系统的操作,首先是要进入到这个系统,那么我们就需要获取登录成功后的的token信息,我们才能够对系统做一系列的操作。当然这样的案例还是有很多的。让我们庆幸的是作为主流的测试框架TestNG它提供的这样的能力,这样我们就可以很完美的在业务中进行整合和应用。在TestNG的框架中,依赖还是在两个维度来展开,一个是测试用例之间的关系,另外一个是我们可以通过testng.xml配置文件来实现我们的诉求。 我们先来看依赖性的测试,行代码的角度来深度了解依赖性测试到底是什么,案例代码如下:
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个测试用例,具体案例代码如下:
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的源码为:
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");
}
}
被继承的类,也就是子类的源码为:
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,这也就是通过不同的类来实现继承式的依赖,这点功能我个人觉得是非常强大的。
下面我们来看通过组的方式来实现依赖,其实我个人觉得通过组的方式,其实最终本质上还是通过测试方法来实现的依赖,具体见如下的案例代码:
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测试框架的执行顺序了。使用组了功能后,依赖性的功能就会显得特别的强大。
感谢您的阅读,后续会持续更新!