zoukankan      html  css  js  c++  java
  • java自动化-数据驱动junit演示,上篇

      本文旨在帮助读者介绍,一般的全自动化代码接口,并简单介绍如何使用数据驱动来实现简单的自动化
      在经过上述几个博客介绍后,相信读者对自动启动执行一个java编译过的class有了一定了解,也完全有能力去执行,故本文开始介绍如何编写一个java自动化
      首先说明,自动化在笔者的眼中,大致分为2种,1种是需要人来控制和输入的,比方说在工作中需要把一个指定订单变为完成订单,则需要人来输入一个刚刚创建的订单号,点击执行后利用代码来完成修改订单状态的操作,即 使用代码来执行一些原本该有人来执行的工作,这种自动化在大公司往往是各种形式的自动化平台,其本质是一种半自动化,第二种自动化是指,较为单纯的较少人工介入的自动化,可以看作完全自动化,比如一些接口每天运行自动化代码校验其正确性,本文主要讲的是后者,为不失一般性,笔者讲的大多数是http协议,一些大公司的内部rpc接口,不进行讨论,不过差别不大,本文只是简单介绍
      我们的代码大部分是这样的,如下
    import com.bs2.core.Util;
    import org.junit.*;
    import util.PbgDict;
    import util.PbgService;

    import java.util.HashMap;
    import java.util.Map;

    /**
    * Created by zlr on 16/10/8.
    */
    public class test_ylw_ip_ipcall_releasecall extends PbgService {
    public Map<String, Object> applyParams = null;
    public void initData() throws Exception {
    applyParams = new HashMap<String, Object>();
    applyParams.put(PbgDict.TOKEN, token1);
    applyParams.put(PbgDict.IP, "123.121.78.204");
    applyParams.put(PbgDict.WORKTYPE, "不限");
    applyParams.put(PbgDict.CAT, "青春,武侠");
    applyParams.put(PbgDict.ANONYMOUS, "0");
    applyParams.put(PbgDict.PROJECTDESC, "zlr");
    applyParams.put(PbgDict.demand, "网剧,电视剧,综艺节目");
    applyParams.put(PbgDict.IDENTITY, "zlr"+ Util.strTime14());
    applyParams.put(PbgDict.copyBudget, "5万以内");
    applyParams.put(PbgDict.callEnd, "14766400001");
    }
    @Before
    public void setUp() throws Exception {
    initData();
    }
    @After
    public void TearDown() throws Exception {
    this.applyParams.clear();
    this.applyParams = null;
    }
    @Test
    public void testsSuccessreleasecall() throws Exception{
    Map<String,Object> a=get1("/ip/ipcall/releasecall", applyParams,"发起征稿","0");
    }
    @Test
    public void testsfailreleasecall1() throws Exception{
    applyParams.remove(PbgDict.TOKEN);
    get("/ip/ipcall/releasecall", applyParams,"不传token","3000");
    }
    }
      上面是笔者之前在的公司编写的自动化代码,使用Java可以正常执行,可见代码主要是划分为以下几个部分
    1before:这部分放置的是一些初始化工作,比如一些变量和map的初始化等等
    2test:真正执行测试的部分,里面会包含执行和校验
    3after:数据清除,主要是把数据库中数据清洗干净,变量的数据清空,为下一次执行做好准备
      可见代码中往往一个class文件有多个test文件,这时有人提出了数据驱动
      何为数据驱动?意思就是指,因为代码变更较快,参数变化也比较快,所以每一个class中的test总会进行修改,所以把代码中的参数从代码中抽取出来,抽取到数据库或者excle中来进行统一管理,较为方便,由于现在测试市场总觉得,没有做数据驱动的自动化代码不是合格的自动化代码,所以本文先不进行数据驱动是不是必要的讨论,先演示数据驱动,在进行讨论
    本文先把上文代码进行改写,变得更加简单更便于讨论代码思路,然后在进行举例,改造后代码如下
    package zlr;

    import org.junit.Assert;
    import org.junit.Test;

    public class zlrshiyan {

    @Test
    public void test1() throws Exception{
    int a=1;
    int b=2;
    int c=3;
    int d=6;
    Assert.assertEquals(a+b, c);
    }
    @Test
    public void test2() throws Exception{
    int a=1;
    int b=3;
    int c=3;
    int d=5;
    Assert.assertEquals(a+b, c);
    }

    }

    执行结果

     

    上面这一段代码就是原有代码转化而来的,第一个成功第二个会失败,然后我们观察到,实际上变量只有d和b,对a和c而言没有变化,故可以把代码利用juint的before方法进行优化,如下代码

    package zlr;

    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    public class zlrshiyan {
    private int a;
    private int c;
    @Before
    public void testinit() throws Exception{
    a=1;
    c=3;
    }
    @Test
    public void test1() throws Exception{
    int b=2;
    int d=6;
    Assert.assertEquals(a+b+c, d);
    }
    @Test
    public void test2() throws Exception{
    int b=3;
    int d=5;
    Assert.assertEquals(a+b+c, d);
    }
    }
    这里做一个提醒,上述代码中,a和c在声明后,在before中被给予数值,这时不要使用int a=1这样的语句,会使得a为1无法传递到test中而使得他们为0,没有初始化成功

    那么如果要做成数据驱动,我们会想着如何把数据抽取出来,即把 变量这两对参数抽取出来做成参数化,下面这段代码就是这样的

    package zlr;

    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;

    import java.util.Arrays;
    import java.util.Collection;

    @RunWith(Parameterized.class)
    public class zlrshiyan {
    private int a;
    private int b;
    private int c;
    private int d;
    @Parameterized.Parameters
    @SuppressWarnings("unchecked")
    public static Collection zlrshiyan(){
    return Arrays.asList(new Object[][]{{2,6},{3,5}});
    }
    public zlrshiyan(int b,int d){
    this.b = b;
    this.d=d;
    }
    @Before
    public void testinit() throws Exception{
    a=1;
    c=3;
    }
    @Test
    public void test1() throws Exception{
    Assert.assertEquals(a+b+c, d);
    }
    }
    执行效果如图

    
    

     上述代码主要是把参数抽取出来,可以看到,代码中把a,c放在了before中,每次都不会变化,而把b,d放在了参数化中,代码中会直接的声明

    public static Collection zlrshiyan(){
    return Arrays.asList(new Object[][]{{2,6},{3,5}});
    }
    使用这个方法声明一个参数集合,在用
    public zlrshiyan(int b,int d){
    this.b = b;
    this.d=d;
    }
    方法来接受b,d两个参数,实际上呢,由于zlrshiyan与类名相同,所以代码会视为初始化,会在执行test 之前执行该方法,会把2,6作为一个整体传进方法zlrshiyan中,然后b作为第一个参数会取2,d作为第二个参数取6,再执行后面的断言,然后如若
    public static Collection zlrshiyan(){
    return Arrays.asList(new Object[][]{{2,6},{3,5}});
    }
    里面的参数集还有数值,就像上文代码一样,会把3,5也传进去,赋值到b,d上后执行test,直到原有参数集合用光为止

    上文介绍了参数化的思维和代码,虽然较为简单,但是思路很重要。下一篇博客说一下,如何把代码抽取到excle等文档,以及测试框架的大致模样

  • 相关阅读:
    [C#]画图全攻略(饼图与柱状图)(转)
    ZedGraph控件的使用
    android PopupWindow实现从底部弹出或滑出选择菜单或窗口
    那两年炼就的Android内功修养
    android添加edittext后布局就不好用
    第三方应用分享到微信朋友圈功能
    android的微信签名
    Android开源库
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
    android 显示特殊符号
  • 原文地址:https://www.cnblogs.com/xuezhezlr/p/9096063.html
Copyright © 2011-2022 走看看