本文旨在帮助读者介绍,一般的全自动化代码接口,并简单介绍如何使用数据驱动来实现简单的自动化
  在经过上述几个博客介绍后,相信读者对自动启动执行一个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等文档,以及测试框架的大致模样

java自动化-数据驱动juint演示,上篇的更多相关文章

  1. java自动化-数据驱动junit演示,下篇

    本文旨在帮助读者介绍,如何使用excle实现数据驱动 本文是上文https://www.cnblogs.com/xuezhezlr/p/9096063.html的继续,如果没看上文建议自己看一下,对理 ...

  2. 《手把手教你》系列技巧篇(五十九)-java+ selenium自动化测试 - 截图三剑客 -上篇(详细教程)

    1.简介 今天本来是要介绍远程测试的相关内容的,但是宏哥在操作服务器的时候干了件糊涂的事,事情经过是这样的:本来申请好的Windows服务器用来做演示的,可是服务器可能是局域网的,连百度都不能访问,宏 ...

  3. Jenkins CI&CD 自动化发布项目实战(上篇)

    Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

  4. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  5. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  6. Java概述和项目演示

    Java概述和项目演示 1. 软件开发学习方法 多敲 多思考 解决问题 技术文档阅读(中文,英文) 项目文档 多阅读源码 2. 计算机 简称电脑,执行一系列指令的电子设备 3. 硬件组成 输入设备:键 ...

  7. Java自动化环境搭建笔记(3)

    Java自动化环境搭建笔记(3) 自动化测试 自动化的环境已经基本搭建完成,后续可对BaseTester基类以及工具类进行扩展.下面便是持续集成的环境的搭建: Jenkins安装 git安装 源码上传 ...

  8. Java自动化环境搭建笔记(2)

    Java自动化环境搭建笔记(2) 自动化测试 在笔记一中已经完成了一键构建项目.xml指定规划测试集.数据解耦与allure报告生成的开发.接下来便是: 浏览器驱动通过配置启动 页面元素定位解耦,通过 ...

  9. Java自动化环境搭建笔记(1)

    Java自动化环境搭建笔记(1) 自动化测试 先搭建java接口测试的环境: 使用mvn命令构建项目 测试集通过testNG.xml组织并运行 测试数据解耦,通过Excel等文件提供 基础依赖 创建m ...

随机推荐

  1. Sending forms through JavaScript

    https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript As in the ...

  2. Drupal7.8的安装注意的问题

    首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...

  3. 技术人应该学习的行话--UML统一建模语言

    新生代码农如何在硝烟弥漫的商业丛林中生存和崛起? 洞见,让一部分先遇见未来. 最近公司技术部在组织架构师培训,有幸参与.导师老刘特别推荐了UML语言的学习.回想多年来,自己习惯做一些流程图,框图或者所 ...

  4. .Net中stirng转Systen.Type的一种实现思路

    今天在上班的过程中,许长时间未联系的大学小伙伴发来消息,带着一个疑问来找我. 他的需求是type动态添加,这对我来说当然很easy,用泛型就好了, 随后,手起刀落,Demo就写出来,如下: 写了一个方 ...

  5. 循环神经网络(RNN)--学习笔记

    一.基本概念 RNN针对的数据是时序数据.RNN它解决了前馈神经网络,无法体现数据时序关系的缺点.在RNN网络中,不仅同一个隐含层的节点可以相互连接,同时隐含层的输入不仅来源于输入层的输入还包括了上一 ...

  6. Node笔记三

    global --类似与客户端javascript运行环境中的window process --用于获取当前node进程信息,一般用于获取环境变量之类的信息 console --node中内置的con ...

  7. 常用域名记录解释:A记录、MX记录、CNAME记录、TXT记录、AAAA记录、NS记录

    A记录 A记录是用来创建到IP地址的记录. A记录设置技巧 1.如果想创建不带www的记录,即ezloo.com,在主机记录中填写@或者留空,不同的注册商可能不一样. 2.创建多个域名到同一个IP,比 ...

  8. Spring 的IOC和AOP总结

    Spring 的IOC和AOP IOC 1.IOC 许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我 ...

  9. Redis的并发竞争问题的解决方案总结

    什么是Redis的并发竞争问题 Redis的并发竞争问题,主要是发生在并发写竞争. 考虑到redis没有像db中的sql语句,update val = val + 10 where ...,无法使用这 ...

  10. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...