解密数据驱动:自动化测试中处理数据的方式、优势及数据源全解析
数据驱动的意义

数据驱动指的是在自动化测试中处理测试数据的一种方式。一般情况下,测试数据与功能函数是分离的,并且被存储在功能函数的外部位置。当自动化测试运行时,数据驱动框架会去读取数据源里的数据,接着把这些数据当作参数传递到功能函数当中,而且会依据数据的条数,多次运行同一个功能函数。数据驱动的数据源也能够是数据库等。如果没有数据来驱动我们针对一个方法 Add()进行测试,且测试数据为{1,2}、{0,2}、{0,3}这三组,那么我们就得写三个测试方法;然而,通过数据驱动的方式,只需写一个测试方法,接着通过循环来读取测试数据,就能够完成对这三组数据的测试。数据驱动在测试框架中是通过对测试数据进行参数化来实现的。本文将详细讲解测试驱动在 junit4 测试框架中的应用。
Junit4中数据驱动基础实现
代码如下:
importjava.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Test;
需要导入 org.junit.runner.RunWith 这个类。
引入 org.junit.runners.Parameterized;将 org.junit.runners.Parameterized 进行引入;对 org.junit.runners.Parameterized 进行导入;把 org.junit.runners.Parameterized 给引入进来;使 org.junit.runners.Parameterized 被引入;让 org.junit.runners.Parameterized 得以引入。
引入了 org.junit.runners.Parameterized.Parameters 这个类。
//@RunWith表示测试用例将会以参数化的形式执行
@RunWith(Parameterized.class)
public class ParaDemo {
private int input1;
private int input2;
private int expected;
@Parameters
方法 prepareData()包含需参数化的数据,示例里存在三组数据,每组数据具备三个值。
此公共静态的集合用于准备数据。
Object 数组 object,其中包含两个子数组。第一个子数组为 {1,2,3},第二个子数组为 {0,2,2},第三个子数组为 {0,3,3}。
return Arrays.asList(object);
构造方法的参数和 prepareData()中的数据存在一一对应关系。以第一组数据{1,2,3}作为例子:
请提供具体的“input1”“input2”和“expected”内容呀,没有这些我没法进行改写呢。
创建 ParaDemo 类的实例时需要传入三个整数参数,分别是 input1、input2 和 expected。
this.input1 = input1;
this.input2 = input2;
this.expected = expected;
@Test
//测试用例中把测试数据进行了参数化
public void testAdd(){
这个结果是将 this.input1 与 this.input2 相加得到的。即先有 this.input1 和 this.input2,然后通过相加操作得到了 result 这个结果。
断言这个预期值与结果相等。
运行测试用例时,能够看到同一个测试用例被 prepareData() 所赋值的三组测试数据执行了,其情况如下图所示。
测试数据与不同测试用例关联
假设要增加一个名为 testSubstract()的测试方法,接着要让 testAdd()和 testSubstract()都分别使用各自的参数化测试数据,该如何去实现呢?思路是这样的:
1.两个方法设计到不同的测试类中。(这里不做讨论)
使用枚举类 enum Type {SUBSTRACT, ADD} 来增加标签对用例数据进行标识。在执行用例的时候,依据标签去判定该用例是否需要执行。通过 org.jnit.Assume.assumeTrue 进行判定。
具体代码实现如下:
从静态角度来看,需要使用 org.junit.Assert 类中的 assertEquals 方法。
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
publicclass ParaJunit4Demo {
enum Type {SUBSTRACT, ADD};
@Parameters
数据可通过静态的集合来获取。
一个包含多个对象的数组,这些对象的具体内容未知。
{Type.SUBSTRACT, 3, 2, 1},
{Type.SUBSTRACT, 4, 2, 2},
{Type.SUBSTRACT, 4, 2, 2},
{Type.ADD, 3, 2, 5},
{Type.ADD, 3, 2, 5},
});
private Type type;
private int a, b, expected;
public ParaJunit4Demo 这个类接收三个整型参数和一个类型参数,分别是 a、b、expected 和 type,用于特定的操作或测试。
this.type = type;
this 的 a 被赋值为 a;this 的 b 被赋值为 b;this 的 expected 被赋值为 expected。
@Test
public void testAdd(){
假设;假设为真(类型 == 类型.ADD);
断言这个预期值与这个 a 与这个 b 的和相等。
@Test
public void testSubstract(){
假设;假设为真(类型 == 类型.SUBSTRACT);
断言:this.expected 等于 this.a 减去 this.b 。
上面的例子表明 testAdd()和 testSubstract()具有相同的测试参数个数,均为 3 个。倘若要增加一个测试用例 testOthers(),且该用例只需两个测试参数,那么该如何实现呢?
直接将参数数据设置为{Type.OTHERS, 3, 3},代码情况如下:
public static Collection data(){
return Arrays.asList(new Object[][] {
{Type.SUBSTRACT, 3, 2, 1},
{Type.SUBSTRACT, 4, 2, 2},
{Type.SUBSTRACT, 4, 2, 2},
{Type.ADD, 3, 2, 5},
{Type.ADD, 3, 2, 5},
{Type.OTHERS, 3,3}
});
用例设置如下:
@Test
public void testOthers(){
假设,假设为真(类型等于类型.OTHERS);
assertEquals(this.a, this.b);
运行代码,提示参数个数错误
尝试方法二:尝试添加一个构造方法,代码如下:
ParaJunit4Demo 有两个参数,一个是类型 type,另一个是两个整数 a 和 b,该构造函数用于创建一个公共的 ParaJunit4Demo 对象。
this.type = type;
this.a=a;
this.b=b;
运行代码,提示只能有一个构造方法的错误
尝试方法三:添加一组数据,将最后一个数据设置为3,3,0
公共静态的取得数据。
return Arrays.asList(new Object[][] {
{Type.SUBSTRACT, 3, 2, 1},
{Type.SUBSTRACT, 4, 2, 2},
{Type.SUBSTRACT, 4, 2, 2},
{Type.ADD, 3, 2, 5},
{Type.ADD, 3, 2, 5},
{Type.OTHERS, 3,3,0}
});
运行测试,测试通过。
由此可见,要实现拥有不同测试参数个数的测试用例的参数化,就需要让参数个数统一。对于参数少的用例,需要添加参数来占位,至于这些参数是否被使用并不重要。在实例中,是通过添加 0 来使参数个数统一的,即{Type.OTHERS, 3, 3, 0}。
总结
有人会说,在 junit5 里可以很方便地实现该功能,在 TestNG 里也可以很方便地实现该功能。那么,有必要把事情搞得这么麻烦吗?大家说得没错,在这里,我只是给大家展示一个解决问题的思路罢了。好多测试同学都不知道通过代码该怎样去解决问题!其实最简单有效的做法是完善目前架构中的功能。遇到问题时,不要置之不理,不能因为觉得架构不提供,就认为没有必要继续深入。我们应该好好思考,通过编码是否能够解决问题。多动手、多思考,慢慢地,编码能力就会得到提升。
劲爆福利
如果你有以下几点困惑的小伙伴们,注意了!
1、测试多年,只会看代码,不会写代码,甚至只会点点点
2、想求职高薪岗位,但是技能没有优势,拿不出手,不敢面试
3、不想花费高昂的学费学习,想学习性价比高又实用的课程
4、看了很多的资料,花费大量的时间,但是学习没有头绪
5、对测试行业越来越迷茫,不知道方向在哪里?
如果这几点你全部都中了,那么鲁德自动化接口课程对你来说是个福音。它会手把手地教你开始写代码,现在报名还有限时优惠呢!能让你摆脱不会写代码的困境,让你的技能提升到新的高度!让你在面试时轻松拿到高薪!
原价是 5980 元,现在有优惠价 4980 元,并且这个优惠价仅限 50 名。如果想要了解更多详情,可以咨询下方的课程老师。
转发1名好友报名,直接抵扣1000元!