有赞测试分享读后感

认清差距,方能追赶

通过有赞测试团队的分享,我深受鼓舞,指明了我们测试组未来的发展方向,让我知道一个测试团队可以做到这么强大。下面我简单分析一下我的看法

1.有赞是一个纯粹的互联网企业,在开发、技术方便很重视,这一点,从测试人员质量就可以看的出来,需要具备白盒测试能力、CodeReview能力、业务功能测试的测试工程师,而且必须是BAT团队出来的。这点我想我们是可以看得出差距的。可是这种人员的差距怎么缩小呢?假设,我们有两种方法:1.统一招BAT团队的资深测试工程师,2.选团队最优测试工程师给整个团队业余时间培训,公司给与支持,然后培养成具备这种能力的工程师。那么我想,第二种方法是最优解,培训成本较低、人力成本低,现有测试人员业务熟练。可以快速介入测试。

2.对于测试日常工作分配,我觉得可以学习有赞团队,将项目细分成标准需求项目、技术重构项目、优化项目、缺陷修复项目。第一、对于标准需求项目或者跨多个业务的项目,一定会有测试投入;第二、技术重构改造项目,这种一般是单应用或者极少应用改造,但不改变业务使用规则。这类项目测试同学只要通过doclever设计测试用例即可,用例的执行由开发自行完成。测试同学要做的就是对新系统进行自动化覆盖。如有需要,测试会在上线前做质量check。 第三、对于线上反馈、缺陷修复项目,如如果开发的自测场景与测试同学的测试场景基本一致,那开发自行搞定即可;或者测试同学把需要特别关注的或者风险点给开发同学简单介绍。对于有差异的,测试同学把差异点向开发同学描述清楚即可。

3.对于测试流程,如果是现在功能测试为主,那现在的测试流程相对之前,还算比较完整合理,但是提测质量不高,所以我们也需要在接口完成时介入编写接口自动化用例,但是有赞团队所说的:“需求分析后,需要输出对象生命周期图、业务时序图、用例图、待确认的问题、风险点清单。并就相关问题、风险与产品、开发进行多次沟通,直到问题得到明确答复。”对于敏捷开发,那启动开发的时间其实很紧急,没有那么多时间去评审风险和业务缺陷,流出更多是时间去写自动化用例兼其他测试项目的功能测试。

4.对于提测分支冲突问题,我们也可以学习有赞团队的搭载公交车发布模式,每一个服务都可以拉出一个test测试分支,所有开发提测时都把自己代码合并到test分支,以后解决bug也要同步自己分支,如果没问题了,可以把自己分支合并master,可以独立上线。

5.对于测试,分为三部分,第一部分是单元测试,这部分属于白盒测试,介于测试代码能力不足,这部分可以由开发自测;第二部分为接口自动化测试,这部分属于灰盒测试,测试会通过开发在doclever写的接口文档编写接口自动化,可以由测试介入进行接口集成测试;第三部分为UI自动化测试,由robotframework实现,同时做手动UI测试,验证功能展示效果和一些边界测试,测试完成后,验收通过上预发布测试,测试通过,上线上正式环境后通过UI自动化测试实现业务全覆盖。

6.对于压力测试,介于对服务器的要求高,所以我们最后通过第三方压测平台实现,如果后期资源到位,可以使用压测工具在测试环境实现。

7.对于线上环境监控,主要又运维来做好,比如宕机监控、服务挂点监控,sql超时监控等等。

好了,罗马不是一天建成的,我们只要重视了,并且有推进,就一定会有成绩,虽然我能力自愧不如,但是我愿意去学习,和测试组一同成长。

 

jenkins的一些其他必要设置(三)

接上次的继续聊…
这次说说jenkins的一些配置
1、先说系统管理中的系统设置
1
点击系统管理后,显示页面,在此页面中可配置需要的JDK、Maven、git等基本信息
2
配置JDK有两种方式:第一种、选择电脑本身已安装的jdk路径
17
第二种、可选择自动安装
3
在git插件安装好后,在此页面会有git配置栏
4
2、接着来配置一个在构建之后自动化发送邮件的基础设置
5
此处设置jenkins地址以及发送邮件人的邮箱
6
点击高级按钮,页面展开,填写以上必要的信息。可使用下边的邮箱验证来进行邮箱是否是通的
7
在具体的项目中,增加构建步骤中选择邮件设置(该选项也是在安装了对应的插件才显示的)
Project Recipient list 一栏填写被发送人的邮箱名称
8
点击advanced Settings出现高级设置
9
添加一项Recipient list后点击高级
10
在此填写相关人员的邮箱名称,以及发送邮件的标题和内容和相应的执行结果页面,点击应用保存生效,此时在giant项目执行之后,就会发送相应的邮件来通知相关人员,此次构建是否成功
3、Configure Global Security设置一项
11
选择随机选取,或者可以指定端口,默认是禁用,这会导致一个问题,随后来解释…
保存后
4、进行管理节点的设置
我们在日常工作中,所看到的晋中、秦皇岛…机器,这这就体现为节点设置,我们现在新建一个节点
进入管理节点后,点击左侧新建节点
12
输入对应的节点名称,选择第一项,点击OK 如果有需要可选择第二项来进行复制
13
填入远程工作目录,启动方法选择…java web start,这个选择项呢是在Configure Global Security设置中选择了指定端口或者随机端口才会出现的,这个有什么作用呢,接着看…
点保存之后,双击该节点
14
此处有两种方式来使用该节点
第一种,复制截图中下边的命令到指定的.bat文件中,可启用该节点(可用于windows或者linux)
15
第二种,点击Launch下载该节点的slave-agent.jnlp文件到指定的地方,启用(适用于windows系统)
16
这两方式都可以指定使用该节点的项目在指定的机器来运行项目。
下次再会…

testng套件测试

测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合。在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征。这也允许灵活的配置要运行的测试。套件可以包含一个或多个测试和被定义由标签。 
testng.xml中有根标签。它描述了一个测试套件,这反过来又是由多个区段组成。 
下表列出了所有的可接受合法属性。 
属性:name 描述:此套件的名称。这是一个强制性的属性。 
属性:verbose 描述:这个运行级别或冗长。 
属性:parallel 描述:由TestNG 运行不同的线程来运行此套件。 
属性:thread-count 描述:使用的线程数,如果启用并行模式(忽略其他方式)。 
属性:annotations 描述:在测试中使用注释的类型。 
属性:time-out 描述:默认的超时时间,将用于本次测试中发现的所有测试方法。 
以下例子为有两个Test1 & Test2测试类一起运行测试套件。

创建一个类
创建一个Java类进行测试 MessageUtil.java 在 C:\ > JUNIT_WORKSPACE
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add “Hi!” to the message
public String salutationMessage() {
message = “Hi!” + message;
System.out.println(message);
return message;
} }

创建测试用例类
创建一个Java类文件名 Test1.java 在C:\ > TestNG_WORKSPACE
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = “Manisha”;
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println(“Inside testPrintMessage()”);
Assert.assertEquals(message, messageUtil.printMessage());
} }

创建一个Java类文件名 Test2.java 在C:\ > TestNG_WORKSPACE import org.testng.Assert; 
import org.testng.annotations.Test;  
public class Test2 { 
    String message = “Manisha”; 
 
    MessageUtil messageUtil = new MessageUtil(message);  
  
    @Test 
    public void testSalutationMessage() { 
        System.out.println(“Inside testSalutationMessage()”);        
 message = “Hi!” + “Manisha”; 
        Assert.assertEquals(message,messageUtil.salutationMessage());     
} } 

写入testng.xml 在C:\ > TestNG_WORKSPACE ,将包含标签如下: 
 
 
   
     
 
             
   
 
        
 
             
   
 
   
 
Suite1 包括 exampletest1 和 exampletest2. 

所有Java类编译使用javac。 
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java 
现在运行 testng.xml,将运行提供的测试用例类中定义的测试用例。 
C:\TestNG_WORKSPACE>java -cp “C:\TestNG_WORKSPACE” org.testng.TestNG testng.xml 
验证输出。 
Inside testPrintMessage() Manisha 
Inside testSalutationMessage() Hi!Manisha 
=============================================== Suite1 
Total tests run: 2, Failures: 0, Skips: 0 =============================================== 
您也可以检查测试输出文件夹;下Suite1文件夹中,可以看到两个HTML创建的exampletest1.html 和 exampletest2.html 

linux中搭建redis服务器

1.在虚拟机新建一个目录,比如/usr/local/redis

2.在目录下执行:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

解压:tar –zxvf redis-2.8.17.tar.gz

解压完成后,执行make命令

cd /redis/redis-2.8.17

make

make完成后,进入src目录,发现多了两个redis-server 和redis-cli文件

启动redis:cd/src–>./redis-server

启动redis后如图FA@TBU3YH9IW[YMT7~6D3PX

启动redis客户端:另外打开一个xshell窗口,进入安装目录下的src路径(cd /usr/local/redis/redis-2.8.17/src)执行命令

./redis-cli启动后如图:

0BZSOWMQ%7S2LNW3SC4N4AJ

验证连接:

ping

结果应该显示PONG

set name nihao

get name

结果应该是‘nihao’

如果上面一切都顺利,说明已经搭建成功了,然后就是关闭redis客户端

quit或者exit

然后关闭redis服务:./redis-cli shutdown

有没有很简单?

 

 

软件测试的心理

角色决定工作内容和承担的任务。测试工程师的角色应该承担什么任务呢?这没有统一的答案。因为,这与软件公司的规模,软件项目管理制度,公司领导和项目经理的管理风格,以及具体软件项目自身的特点有很大关系。而且,测试工程师也有普通和高级之分。

设置软件测试环境,安装必要的软件工具。运行软件,发现和报告软件缺陷或错误。尤其需要快速定位软件中的严重的错误。对软件整体质量提出评估,确认软件达到某种具体标准

以最低的成本,最短的时间,完成高质量的测试任务; 在这其中,最重要的是要明确,程序员的责任和目标。在执行任何具体测试任务前,都要在项目组内对于责任和目标达成共识,以免带来后续工作的相互推诿。

另外一个值得注意的方面就是工作效率和质量,或许高级测试工程师与普通测试工程师的主要区别在于高级测试工程师可以更快地发现更多软件中的严重错误。对此,有什么可以借鉴的诀窍吗?请尝试以下方法,保证不会是您失望。

首先测试程序的核心功能,然后测试辅助功能。

首先测试功能,然后测试性能。

首先测试常见情况,然后测试异常情况。

首先测试经过变更的部分,然后测试没有变更的部分。

首先测试影响大的问题,然后测试影响小的问题。

首先测试必须测试的部分,然后测试可选或没有要求测试的部分

需要强调的一点是,无论你是多么高级的测试工程师,都要明白无论测试需要的工具多么复杂,测试步骤多么冗长,测试工程师在软件项目开发中始终都是扮演服务员的角色,这是由测试工作的特点决定的。任何服务都有被服务对象—客户,软件测试工程师的服务对象有哪些呢?

最重要的客户是软件的用户。测试工程师需要站在客户的使用和需求角度测试软件,报告问题。项目经理也是客户。测试工程师需要报告测试工作进度和发现的问题,尤其是严重的问题。程序员是最经常打交道的客户。为了便于程序员重复报告的错误,尽量提供良好的软件问题报告,以便程序员可以更快的修复软件错误。技术文档工程师、市场开发人员和技术支持工程师也都是测试工程师的服务对象。

前文已经指出测试工程师应该明确角色,明确任务和责任。知道哪些是自己份内的事,哪些是不属于自己的事。一定要尽最大努力完成份内的事,不要做不属于自己的事情,以免弄巧成拙。 为了更好的扮演软件测试工程师的角色,尽量避免犯下面的错误:

承诺完成测试的软件没有质量问题

软件测试只是保证质量的一种方法,软件测试工程师的工作不会直接提高软件质量,因为绝大多数软件错误都需要程序员修复。软件测试只能证明软件存在错误,不能保证软件没有错误,不可能找出全部软件错误。个人的能力和对质量的影响范围很小,软件质量的提高要靠软件项目团队全体成员的共同努力。

承担软件的发布权利

不要因为软件中存在还没有修复的错误,而试图提出更改软件发布的计划。也不要认为已经完成了测试计划,自己决定可以发布软件。因为,改变软件发布计划可能要失去进入市场的良机和很多客户,对此造成的经济和公司市场的损失将不是测试工程师能够承担的。另外,软件发布后,如果用户发现了新的软件错误,公司领导或项目经理可能将过错加在软件测试人员的头上,因为他们同意发布软件。通常软件发布的权利由产品经理、项目经理、测试经理、市场经理共同集体讨论决定。

扮演过程改进成员的角色

软件测试工程师必须报告错误,有时也要分析错误的类型、特征和产生错误的原因。但是,不要主动提出改进软件过程的具体改进措施,更不要直接干涉程序员的工作方式,以免出力不讨好,影响今后的愉快合作。软件过程改进的方法是软件质量控制部门的事情,这是他们的本职工作。

客观独立的测试心理

采用独立测试方式,无论在技术上还是管理上,对提高软件测试的有效性都具有重要意义。

客观性
对软件测试和软件中的错误抱着客观的态度,这种客观的态度可以解决测试中的心理学问题,既能够以揭露软件中错误的态度工作,也能不受发现的错误的影响。经济上的独立性使其工作有更充分的条件按测试要求去完成。
专业性
独立测试作为一种专业工作,在长期的工作过程中势必能够积累大量实践经验,形成自己的专业优势。同时软件测试也是技术含量很高的工作,需要有专业队伍加以研究,并进行工程实践。专业化分工是提高测试水平,保证测试质量,充分发挥测试效用的必然途径。
权威性
由于专业优势,独立测试工作形成的测试结果更具信服力,而测试结果常常和对软件的质量评价联系在一起,由专业化的独立测试机构的评价,更客观、公正和具有权威性。
资源有保证
独立测试机构的主要任务是进行独立测试工作,这使得测试工作在经费、人力和计划方面更有保证,不会因为开发的压力减少对测试的投入,降低测试的有效性,可以避免开发单位侧重软件开发而对测试工作产生不利的影响。

通过-Rational-AppScan 如何应对网站攻击

IBM-Rational-AppScan 正是应对这一挑战的利器。

如下图所示,Rational AppScan 工作方式比较简单,就像一个黑盒测试工具一样,测试人员不需要了解 Web 应用本身的结构。AppScan 拥有庞大完整的攻击特征库,通过在 http request 中插入测试用例的方法实现几百中应用攻击,再通过分析 http response 判断该应用是否存在相应的漏洞。整个过程简单易懂高效,测试人员可以快速的定位漏洞所在的位置,同时 AppScan 可以详细指出该漏洞的原理以及解决该漏洞的方法,帮助开发人员迅速修复程序安全隐患。对于攻击的特征以及测试用例用户不需要花费大量的精力,WatchFire 团队定期的对特征库进行更新,随着保证与业界的同步,最大化的提高用户的工作效率。

图 4.-Rational-AppScan 工作示意图

111

下面我们通过简单的实例介绍一下-Rational-AppScan 的使用:

定义扫描

首先确定扫描站点的 URL,根据默认的模板配置向导,确定扫描的整个站点模型以及你想扫描的漏洞种类。例如,我想扫描企业应用 www.xxx.com,想根据默认值扫描是否有安全隐患,启动 AppScan,创建一个扫描,敲入 www.xxx.com; 根据配置向导直至完成。

图 5. 默认的模板配置向导

222

图 6. 创建一个扫描

33

扫描启动,进行测试

只需要点击执行。

扫描结果查看

如图所示,AppScan 以各种维度展现了扫描后的结果,不仅仅定位了问题发生的位置,也提出了问题的解决方案。

图 7. 扫描后的结果

44

monkeyrunner之环境搭建及实例

一、Monkeyrunner简介
1.MOnkeyrunner相对Monkey区别
1)Monkeyrunner工具在工作站上通过API定义的特定命令和事件控制设备或模拟器(可控)
2)精确控制事件之间的事件
3)可以进行:点触屏、拖拽、长按、键盘事件
4)可以智能截图对比和判断
5)回溯出详细具体的BUG路径
2.Monkeyrunner优缺点
1) 能完全模拟人工所有操作
2) 有详细的API文档参考
3) 可以写出智能图像对比脚本
4) 支持java和Python两种语言脚本
5) 脚本移植性差
3.Monkeyrunner脚本编写
1) 终端USB调成开发者模式
2)电脑安装手机驱动
二、Monkeyrunner环境搭建
    Monkeyrunner的环境搭建,需要安装以下工具:jdk、android sdk、python编译器。
1.jdk的安装与配置
1)jdk下载地址
    下载完成后,默认安装即可。
2)jdk环境配置
    jdk安装成功后,计算机→属性→高级系统设置→高级→环境变量,在系统变量中,新建JAVA_HOME变量,变量值填写jdk的安装目录。

100

    在系统变量中,编辑Path变量,在变量值最后输入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
101
在系统变量中,新建CLASSPATH变量,变量值填写为:
  .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
102
    到此,系统变量配置完毕。
3)jdk环境检查
    检验jdk环境是否配置成功,则运行cmd,在cmd窗口中,输入 java -version (java 和 -version 之间有空格)。若如图所示,显示版本信息,则说明安装和配置成功。
103
2.android sdk安装与配置
android sdk就是指Android专属的软件开发工具包。android sdk中我们最常用的就是tools和platform-tools文件夹中的工具。
1)sdk下载地址
下载地址1:http://developer.android.com/sdk/index.html
下载地址2:http://rj.baidu.com/soft/detail/23485.html?ald
Sdk下载完成后,解压缩到自己的目录,不需要安装。
2)sdk环境配置
    sdk安装成功后,计算机→属性→高级系统设置→高级→环境变量,在系统变量中,新建ANDROID_HOME变量,变量值填写sdk中tools和platform-tools的安装目录。
104
    在系统变量中,编辑Path变量,在变量值最后输入%ANDROID_HOME%;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
105
3)sdk环境检查
    检验sdk环境是否配置成功,则运行cmd,在cmd窗口中,输入adb。若如图所示,则说明安装和配置成功。
106
3.Python编辑器安装与配置
    python用于支持Monkeyrunner运行,使用python脚本编写用例会大大简化Monkeyrunner用例的编写,且会帮助扩展monkeyrunner的自动化功能。
1)Python下载地址
下载后,按照提示信息,下一步安装即可。
2)Python环境配置
    Python安装成功后,计算机→属性→高级系统设置→高级→环境变量,在系统变量中,编辑Path变量,在变量值最后输入Python的安装路径;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
107
3)Python环境检查
    检验Python环境是否配置成功,则运行cmd,在cmd窗口中,输入python。若如图所示,显示版本信息,则说明安装和配置成功。
108
4.Monkeyrunner环境检查
    若以上步骤均完成,且各环境变量也配置正确,至此,Monkeyrunner环境已经搭建完成。检验Monkeyrunner环境是否搭建成功,则同样运行cmd,在cmd窗口中,输入monkeyrunner。如下图所示,则说明Monkeyrunner环境搭建成功。
109
    下面就可以用Monkeyrunner连接模拟器来进行自动化的测试了。
三、Monkeyrunner使用方法
    Moneyrunner在使用前,必须先打开模拟器或连接上手机设备。下面是Monkeyrunner的实例操作。
1.模拟器启动
    我们这里选择命令打开模拟器。运行cmd,在cmd窗口,输入命令:emulator -avd AVD_test,其中AVD_test是模拟器的名称,填写自己创建的模拟器名称。
110
    模拟器启动成功后,我们仍在cmd环境中操作。现在进入Monkeyrunner的shell命令交互模式。
输入命令:monkeyrunner
进入shell命令交互模式后,首要一件事就是导入monkeyrunner所要使用的模块。直接在shell命令下输入命令:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
再回车,这步完成我们就可以利用monkeyrunner进行测试工作了。
111
2.模拟器连接
    下面我们就要Monkeyrunner连接上模拟器,进行一系列操作了。输入命令:
device=MonkeyRunner.waitForConnection()
其中,device=MonkeyRunner.waitForConnection(6,’emulator-5554′)
参数1:超时时间,单位秒,浮点数,默认是无限期地等待。
参数2:指定的设备名称device_id,默认为当前设备(手机优先,其次为模拟器)
112
    输入命令后,页面上没有错误信息返回,即成功连接设备。
3.app安装并启动
1)app安装
    模拟器启动成功后,我们安装自己想要的apk,这里我们选择qq音乐安装。
输入命令:device.installPackage(‘F:\\QQyinle_439.apk’),其中,参数是APK的相对路径。
    安装成功返回true,此时查看模拟器我们可以在IDLE界面上看到安装的APK的图标了。
113
2)app启动
    app安装成功后,现在启动该app,命令为:
device.startActivity(component=”package名/.activity”)
首先,我们有必要说一下,如何获取一个app的package名和activity。这里,我们只描述一种获取方式。
使用aapt,其中aapt是sdk自带的一个工具,在sdk\builds-tools\目录下:
114
    以存储在F盘的qq音乐为例,运行cmd,命令行中切换到aapt.exe目录,
方法一:
执行命令:aapt dump badging F:\QQyinle_439.apk ,注意,apk路径中一定不能有空格。
120
120
121
由上图可知:package name:com.tencent.qqmusic
activity:.activity.AppStarterActivity
方法一由于日志较多,寻找起来比较费劲,所以我们引出方法二。
方法二(推荐):
把日志存储在特定的文件中,在文件中通过搜索关键字,得到包名及活动名,这里我把结果输出到F盘的log.txt中:
aapt dump badging F:\QQyinle_439.apk > F:\log.txt
    到此,已经获取了app的package名和activity。下面,我们真正的启动app。在原有cmd运行窗口,输入命令:
device.startActivity(component=” com.tencent.qqmusic/.activity.AppStarterActivity “)
    命令执行后,模拟器上的app被启动。这表示命令启动app成功。这里的关键是app的package name和activity对应获取正确,否则启动不了特定app。
115
    此时可以向模拟器发送如按键、滚动、截图、存储等操作了。
四、Monkeyrunner运行python脚本
    同样,Monkeyrunner可以直接调用指定python脚本,将命令写到python文件里,命名例如***.py,然后我们再从命令行直接通过monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:monkeyrunner ***.py。接下来monkeyrunner会自动调用***.py,并执行其中的语句,相当方便。
    我们这里将上述例子,所有命令放在python文件里,并命名test.py,然后存储到本地F盘,即路径为:F:\test.py。
复制代码
#coding:utf-8 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice device=MonkeyRunner.waitForConnection() device.installPackage(‘F:\\QQ_374.apk’) MonkeyRunner.sleep(3.0) runComponent = “com.tencent.qqmusic/.activity.AppStarterActivity” device.startActivity(component=runComponent)
复制代码
    在cmd中运行monkeyrunner F:\test.py,这里的python脚本路径为相对路径。结果报错:SyntaxError:mismatched input ‘test’ expecting NEWLINE,如下:
116
    这是因为python脚本应在dos模式下执行,不要进入monkeyrunner的shell命令交互模式。正确的方式如下,输入命令monkeyrunner F:\test.py:
117
    运行成功后,则可以在模拟器上看到启动的qq音乐app。

Doclever使用简介

DOClever简单使用介绍:
1、地址:http://mock.dev.aixuexi.com/ 用户名及密码可自行申请(最好用名字全称)
2、右上角登录后,显示到如下页面:
可增加添加项目或者团队,淡绿色框显示是已经添加的项目会团队
微信图片_20170915184020
3、双击已经入的团队,显示已加入的项目,成员显示已经在系统中存在的成员。概况页面显示已加入的项目数量、接口总数、用户数微信图片_20170915184106
微信图片_20170915184132微信图片_20170915184151
4、双击项目,显示接口分组页,页面显示具体分组,点击组名,可显示改组下具体的接口以及请求类型
微信图片_20170915184224
5、先说全局菜单,这块可全局设置使用的baseurl,点击右边+可新增,点击X可删除
微信图片_20170915184251
6、新增一个接口看看具体操作:页面可输入名称、路径(除baseurl,见上一步设置),分组可选择该接口属于的分组、方法用于选择方法类型、状态可选开发阶段
中间栏可填写请求参数,Header。或者可以直接通过执行导入实现,Heased同样可以导入。对于post方法时,这栏会新增一个body菜单,见图!
还有一个比较重要的功能,就是mock数据,点击mock规则会展示mock具体规则,在result中的最后一栏,写入一定的规则,在运行请求Mockserver是会按照这个规则来显示数据
result中的json同样支持导入。
微信图片_20170915184318
微信图片_20170915184458
get 方式请求
微信图片_20170915184529
post方式请求
微信图片_20170915184544
mock规则页面
7、点击保存然后点击运行,弹出页面可选择baseurl,填入请求的参数值,点击运行,在result中产生返回结果数据
微信图片_20170915184622
8、在新增接口时,平台提供了一个较方便的功能,复制功能,可以直接复制整个接口。在复制后,点击组名右边的… 会出现一个粘贴的命令,
点击后粘贴成功,选择必要的分组,点击保存,即可保存成功
微信图片_20170915184650
微信图片_20170915184658
9、测试在执行接口测试时,可点击+新增模块,在新增模块后新建用例。在用例的第一栏显示接口基本信息,内容中编写接口测试用例,
有必要时可插入用例来使用上一个用例执行的数据,编辑结束后,点击保存,点击运行,在输出可看到该接口执行的情况。点击如何编写
有教程哦!
微信图片_20170915184823

在做自动化测试之前你需要知道的

什么是自动化测?

       做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。

  首先理清自动化测试的概念,广义上来讲,自动化包括一切通过工具(程序)的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具(loadrunner、jmeter),或自己所写的一段程序,用于生成1到100个测试数据。狭义上来讲,通工具记录或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证。

当然,我们更普遍的认识把“自动化测试”看做“ 基于产品或项目UI层的自动化测试”。

分层的自动化测试

       这个概念最近曝光度比较高,传统的自动化测试更关注的产品UI层的自动化测试,而分层的自动化测试倡导产品的不同阶段(层次)都需要自动化测试。1

  相信测试同学对上面的金字塔并不陌生,这不就是对产品开发不同阶段所对应的测试么!我们需要规范的来做单元测试同样需要相应的单元测试框架,如java的Junit、testNG,C#的NUnit ,python 的unittest、pytest 等,几乎所有的主流语言,都会有其对应的单元测试框架。

  集成、接口测试对于不少测试新手来说不太容易理解,单元测试关注代码的实现逻辑,例如一个if 分支或一个for循环的实现;那么集成、接口测试关注的一是个函数、类(方法)所提供的接口是否可靠。例如,我定义一个add()函数用于计算两个参数的结果并返回,那么我需要调用add()并传参,并比较返回值是否两个参数相加。当然,接口测试也可以是url的形式进行传递。例如,我们通过get方式向服务器发送请求,那么我们发送的内容做为URL的一部分传递到服务器端。但比如 Web service 技术对外提供的一个公共接口,需要通过soapUI 等工具对其进行测试。

  UI层的自动化测试,这个大家应该再熟悉不过了,大部分测试人员的大部分工作都是对UI层的功能进行测试。例如,我们不断重复的对一个表单提交,结果查询等功能进行测试,我们可以通过相应的自动化测试工具来模拟这些操作,从而解放重复的劳动。UI层的自动化测试工具非常多,比较主流的是QTP,Robot Framework、watir、selenium 等。

 为什么要画成一个金字塔形,则不是长方形 或倒三角形呢? 这是为了表示不同阶段所投入自动化测试的比例。如果一个产品从没有做单元测试与接口测试,只做UI层的自动化测试是不科学的,从而很难从本质上保证产品的质量。如果你妄图实现全面的UI层的自动化测试,那更是一个劳民伤财的举动,投入了大量人力时间,最终获得的收益可能会远远低于所支付的成本。因为越往上层,其维护成本越高。尤其是UI层的元素会时常的发生改变。所以,我们应该把更多的自动化测试放在单元测试与接口测试阶段进行。

  既然UI层的自动化测试这么劳民伤财,那我们只做单元测试与接口测试好了。NO! 因为不管什么样的产品,最终呈现给用户的是UI层。所以,测试人员应该更多的精力放在UI层。那么也正是因为测试人员在UI层投入大量的精力,所以,我们有必要通过自动化的方式帮助我们“部分解放”重复的劳动。

  在自动化测试中最怕的是变化,因为变化的直接结果就是导致测试用例的运行失败,那么就需要对自动化脚本进行维护;如何控制失败,降低维护成本对自化的成败至关重要。反过来讲,一份永远都运行成功的自动化测试用例是没有价值。

  至于在金字塔中三种测试的比例要根据实际的项目需求来划分。在《google 测试之道》一书,对于google产品,70%的投入为单元测试,20%为集成、接口测试,10% 为UI层的自动化测试。

我为什么要做自动化测试?

   根据51testing的《中国软件测试从业人员调查报告》,手工测试占到的89% ,相对开发来说,测试的门槛底,薪资普遍较底,所要求的知识面虽然有一定广度,但缺乏深度。这是测试的普遍现状。

  正因为手功测试人门槛不高,使大量的毕业生,甚至是非专业人员涌入这个行业。从而增加了这个行业的激烈竞争。对于工作几年扔处于手工测试的人员来说都会有强列的危机感。由于工作的技术含量不高,薪资的涨幅遇到瓶颈,另一方面受到新进入者的威胁,同样的工作公司花5K招来的人就可以做,那么就不会花8K 的招。

  好吧,这个问题不应该出现讨论技术的话题中,但他的确是大多测试人员不得不面对的一个问题。所以,从测试人员自身的发展来说,我其实非常需要通过自动化技术来增加自己有竞争力。当然,做到一定年限测试人员会选择转管理或其它岗位,这又是另一个话题了。

  从测试行业的发展来说,国内产品由于产品特点,世界级的产品不多,技术含量相对不高,质量要求相对要求不高,外包国外项目,测试人力成本低廉,所以需要大量的手工测试人员。

  所以,在不远的未来,我认为纯的工手测试人员的需求是递减,公司更需要更高技术能力的测试。质量需要测试,测试行为永远不会消失,但纯的手工测试人员是否消失是有可能的。

  好吧,你可以说测试多朝阳的行业,我纯属在危言耸听。不管未来如何,我们都需要提升自身的技能对吧!

什么项目适合做自动化测试?

  假如你已经决定要学习自动化测试了,如何学习是要面临的下一个问题?这个问题以被测试产品为出发点进行分析,假如你所学的技术不能得到应用(验证),将会使你的学习过程寸步难行。

  首先考考虑产品是否适合做自动化测试。这方法比较普遍的共识是从三个方面进行权衡。

  软件需求变动不频繁

  测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。

  项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。

  项目周期较长

由于自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。

  自动化测试脚本可重复使用

  自动化测试脚本的重复使用要从三个方面来考量,一方面所测试的项目之间是否很大的差异性(如C/S系统和B/S系统的差异);所选择的测试工具是否适应这种差异;最后,测试人员是否有能力开发出适应这种差异的自动化测试框架。

选择什么工具进行自动化测试

  假如你已经确认了XX 项目适合做自动化测试,那么接下来你要做的就是选测试工具了。

  首先要先确认你所测试的产品是桌面程序(C/S)还是web应用(B/S)。

  桌面程序的工具有:QTP、 AutoRunner

  web应用的工具有:QTP、AutoRunner、Robot Framework、watir、selenium

  由于B/S架构的诸多优势,早几年前大量C/S架构的应用转为B/S结构。从而也推动了web开发与测试技术的发展。假如,被测试有产品是C/S架构的,那么推荐QTP ,QTP在UI自动化测试领域占到了一半的试用率。所以,足以说明QTP在自动化领域强大,易用性等。学习主流的工具也可以使你获得更多的机会。市面上关于QTP的书籍也非常丰富。当然,要想学好QTP ,你必须要掌握VBS脚本语言。

  如果,被测产品是B/S 结构,那么推荐selenium ,为什么不是QTP 或其它工具?因为selenium 对B/S应用支持很好,更重要的一点,它支持多语言的开发,真正的试用selenium ,你所要掌握的不仅仅是一个工具而已,你还需要学习一门语言。我为什么要选择selenium?还要学一门语言,这无疑增加了我的学习成本。增加成本的同时,也增加的你的竞争力,而且,在这个过程中你不单单只是学会了一个自动化工具而已,你完全可以使用所学的语言去做更多的事情。

  好吧!假如你决定试用selenium 了之后,你又面临了一个新的问题,选择一门语言。selenium 是支持java、python、ruby、php、C#、JavaScript 。

  从语言易学性来讲,首选ruby ,python

  从语言应用广度来讲,首选java、C#、php、

  从语言相关测试技术成度(及 资料)来讲:ruby ,python ,java

  或者你可以考虑整个技术团队主流用什么语言,然后选择相应的语言。

selenium 用前须知

  OK!经过上的过程,我相信你一定做出的相应的选择,如果你选择的是selenium 工具,那么接着往下阅读。

首选你在开始selenium之前,需要花一到两个月时间去学一门语言,这里是根据没有语言基础的同学而定的。我推荐ruby ,python ,java 任意一门语言来进行学习。

  当然,已经如果有很好的语言基础略过这个环节,或者你的丰富的java编程能力,那么学习python 可能只需要几天时间或更短。

  假如,你已经搞定了一门语言的基础,接下来你需要先了解selenium ,selenium 并不是单纯的一个工具,他是一组工具的集合,而且,他还有1.0与2.0之分,当然3.0也已经到来。

  selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。

2

selenium IDE

  selenium IDE 是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。那么什么情况下用到它呢?

  快速的创建bug重现脚本,在测试人员的测试过程中,发现了bug之后可以通过IDE将重现的步骤录制下来,以帮助开发人员更容易的重现bug。

  IDE录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,关于这个功能后而用到时再详细介绍。

selenium Grid

  Selenium Grid是一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-app的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。其特点为:

· 并行执行

· 通过一个主机统一控制用例在不同环境、不同浏览器下运行。

· 灵活添加变动测试机

selenium RC

  selenium RC 是selenium 家族的核心工具,selenium RC 支持多种不同的语言编写自动化测试脚本,通过selenium RC 的服务器作为代理服务器去访问应用从而达到测试的目的。

  selenium RC 使用分Client Libraries和selenium Server,Client Libraries库主要主要用于编写测试脚本,用来控制selenium Server的库。

  Selenium Server负责控制浏览器行为,总的来说,Selenium Server主要包括3个部分:Launcher、Http Proxy、Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。Launcher用于启动浏览器,把selnium Core加载到浏览器页面当中,并把浏览器的代理设置为Selenium Server 的Http Proxy。

selenium 2.0

  搞清了selenium 1.0 的家族关系,selenium 2.0 是把WebDriver 加入到了这个家族中;简单用公式表示为:

  selenium 2.0 = selenium 1.0 + WebDriver

  需要强调的是,在selenium 2.0 中主推的是WebDriver ,WebDriver 是selenium RC 的替代品,因为 selenium 为了向下兼容性,所以selenium RC 并没有彻底抛弃,如果你使用selenium开发一个新自动化测试项目,强列推荐使用WebDriver 。那么selenium RC 与webdriver 主要有什么区别呢?

  selenium RC 在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript 翻译器来翻译和执行selenese命令(selenese 是selenium命令集合)。

  WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。

  如果是新项目直接学习webdriver 就OK了,RC是过时技术。

selenium学习路线

  配置你的测试环境,真对你所学习语言,来配置你相应的selenium 测试环境。selenium 好比定义的语义—“问好”,假如你使用的是中文,为了表术问好,你的写法是“你好”,假如你使用的是英语,你的写法是“hello”。 所以,同样有语义在不同的语言下会有不同的写法(语法)。

   接着你需要熟悉webdriver API ,API就是selenium 所定义一方法,用于定位,操作页面上的各种元素。

  先学习元素的定位,selenium 提供了id、name、class name、 tag name、link text、partial link text、 xpath、css、等定位方法。xpath和css 功能强大语法稍微复杂,在这其间你可能还需要了解更多的前端知识。xml ,javascript 等。

  定位元素的目的是为了操作元素,接就要学习各种元素有操作,输入框,下拉框,按钮点击,文件上传、下载,分页,对话框,警告框…等等。

  经过一段时间的学习,你可以游刃有余的模拟手工测试来操作页面上的各种元素了。接着你需要做的就是把这些“用例”组织起来,统一来跑。

  那么你需要做的就是学习并使用单元测试框架,单元测试框架本身就解决了用例的组织与运行。

  当你写了一些“测试用例” 之后,你会发现用例中有大量重复的操作,能不能写到一个单独的文件中,需要的时候调用这些操作?当然可以,运用你的编程能力来实现这一点将非常简单。然后,你又发现每个用例中都有一些数据,这些数据也是一样的,但如果变化了修改起来非常麻烦,你也可以把他写到一个单独的文件中进行读取。

  接着你又遇到了新的疑问,我写的脚本(用例)都是流水式的,我怎么知道用例运行失败还是成功。那么就需要在脚本中加一些验证与断言。

  接着你又有了更多的想法,单元测试框架的log太简陋了,能不能生成一张漂亮的测试报告出来。我能不能定时的来跑这个脚本。能不能把每一次跑脚本的测试结果直接发到我的邮箱。能不能……

  为解决这些问题,你不得不学习更多的编程技术,然后你的“测试结构”会功能越来越强大,越来越灵活。产生了一定的通用性和移植性。一个有模有样的自动化测试框架诞生了。

   假如,有一天你不再做UI的自动化测试了,你会发现你去做单元测试 或接口测试基本没什么难度。开发个测试工具之类的也不在话下,感谢selenium 吧!顺便也感谢一下我吧!

总结:每天学习一点点!

ELK使用及详解

1.前言

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog ,将所有服务器上的日志收集汇总。

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep 、 awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

开源实时日志分析 ELK 平台能够完美的解决我们上述的问题, ELK 由ElasticSearch 、 Logstash 和 Kiabana 三个开源工具组成。官方网站:https://www.elastic.co/products

l   Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。

l   Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。

l   kibana 也是一个开源和免费的工具,他 Kibana 可以为 Logstash 和 ElasticSearch提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

工作原理如下如所示:

在需要收集日志的所有服务上部署 logstash ,作为 logstash agent ( logstash shipper )用于监控并过滤收集日志,将过滤后的内容发送到 logstash indexer ,logstash indexer 将日志收集在一起交给全文搜索服务 ElasticSearch ,可以用ElasticSearch 进行自定义搜索通过 Kibana 来结合自定义搜索进行页面展示。

2.kibana查询语法

我们kibana页面访问地址:elk.dev.aixuexi.com,下图是查询页面上常用的功能注释微信图片_20170912191526

 单项term查询

例: 搜independenceDay,student等(不建议这么查询慢,容易超时)

字段field查询

field:value   例:appname:Alen, host:beijing

通配符

? 匹配单个字符      例: H?bbs

* 匹配0到多个字符           例: H*

注意: ? * 不能用作第一个字符,例如: ?text    *text

范围查询

age:[20 TO 30]        age:{20 TO 30}

注:[ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内

逻辑操作(建议使用查询快)

AND     OR       例子:firstname:H* AND age:20          firstname:H* OR age:20

+ :搜索结果中必须包含此项

– :不能含有此项

例: +firstname:H* -age:20 city:H*    firstname字段结果中必须存在H开头的,不能有年龄是20的,city字段H开头的可有可无

分组

(firstname:H* OR age:20) AND state:KS      先查询名字H开头年龄或者是20的结果,然后再与国家是KS的结合

字段分组

firstname:(+H* -He*)        搜索firstname字段里H开头的结果,并且排除firstname里He开头的结果

转义特殊字符

+ – && || ! () {} [] ^” ~ * ? : \

注意:以上字符当作值搜索的时候需要用 \ 转义(例如account-service搜索时加引号或者转义)

3.logstash配置

工作原理:
每个阶段都由很多的插件配合工作,比如file、elasticsearch、redis等等。
每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。
 
命令行中常用的命令
 
    -f:通过这个命令可以指定Logstash的配置文件,根据配置文件配置logstash
    -e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“” 则默认使用stdin作为输入,stdout作为输出)
    -l:日志输出的地址(默认就是stdout直接在控制台中输出)
    -t:测试配置文件是否正确,然后退出。
 
 
logstash基本上由三部分组成:
 
    input {…}
    filter {…}
    output {…}
 
在每个部分中,也可以指定多个访问方式,例如多个日志来源:
 
    input { 
     file { path =>”/var/log/messages” type =>”syslog”} 
     file { path =>”/var/log/apache/access.log” type =>”apache”} 
    }
  类似的,如果在filter中添加了多种处理规则,则按照它的顺序一一处理,但是有一些插件并不是线程安全的。
  比如在filter中指定了两个一样的的插件,这两个任务并不能保证准确的按顺序执行,因此官方也推荐避免在filter中重复使用插件。
 
例子:
 
    input {
        file {
         #指定监听的文件路径,注意必须是绝对路径
            path => “E:/software/logstash-1.5.4/logstash-1.5.4/data/test.log”
            start_position => beginning
        }
    }
    filter {
        
    }
    output {
        stdout {}
    }
日志大致如下:
 
    hello,this is first line in test.log!
    hello,my name is xingoo!
    goodbye.this is last line in test.log!
 
我们的配置文件
input {
        file {
                #start_position => beginning
                #add_field => {“project_name” => “battleship”}
                #tags => “tag1”
                path => [“/data/var/log/application/*/*/*.log”]
        }
}
filter {
        grok {
                patterns_dir => [“/usr/local/logstash-2.3.4/patterns”]
                match => { “message” => “%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:level}”
                        }
             }
        grok {
                match => {
                        “path” => “/data/var/log\/application/%{USER:appname}/”
                        }
             }
}
output {
        elasticsearch{
         hosts => [“10.44.202.185:9200″,”10.28.51.196:9200″,”10.28.51.196:9200”]
     }
     stdout { codec => rubydebug }
        }
4.elasticsearch增删改查详解
刚接触的童鞋经常搞不明白ES的各个概念的含义。尤其对“索引”二字更是与关系型数据库混淆的不行。本文通过对比关系型数据库,将ES中常见的增、删、改、查操作进行图文呈现。能加深你对ES的理解。同时,也列举了kibana下的图形化展示。

ES Restful API GET、POST、PUT、DELETE、HEAD含义:
1)GET:获取请求对象的当前状态。
2)POST:改变对象的当前状态。
3)PUT:创建一个对象。
4)DELETE:销毁对象。
5)HEAD:请求获取对象的基础信息。

MySQL与Elasticsearch核心概念对比示意图
这里写图片描述
以上表为依据,
ES中的新建文档(在Index/type下)相当于mysql中(在某Database的Table)下插入一行数据。

1、新建文档(类似mysql insert插入操作)

http://localhost:9200/blog/ariticle/1 put
{
"title":"New version of Elasticsearch released!",
"content":"Version 1.0 released today!",
"tags":["announce","elasticsearch","release"]
}

创建成功如下显示:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1 -d",
- "_version": 1,
- "_shards": {
    - "total": 2,
    - "successful": 1,
    - "failed": 0
- },
- "created": true

}

这里写图片描述

2、检索文档(类似mysql search 搜索select*操作)

检索结果如下:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1",
- "_version": 1,
- "found": true,
- "_source": {
    - "title": "New version of Elasticsearch released!",
    - "content": "Version 1.0 released today!",
    - "tags": [
        - "announce"
        - ,
        - "elasticsearch"
        - ,
        - "release"
    - ]
- }

}

如果未找到会提示:

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "11",
- "found": false

}

查询全部文档如下:
这里写图片描述
具体某个细节内容检索,
查询举例1:查询cotent列包含版本为1.0的信息。
http://localhost:9200/blog/
_search?pretty&q=content:1.0

{

- "took": 2,
- "timed_out": false,
- "_shards": {
    - "total": 5,
    - "successful": 5,
    - "failed": 0
- },
- "hits": {
    - "total": 1,
    - "max_score": 0.8784157,
    - "hits": [
        - {
            - "_index": "blog",
            - "_type": "ariticle",
            - "_id": "6",
            - "_score": 0.8784157,
            - "_source": {
                - "title": "deep Elasticsearch!",
                - "content": "Version 1.0!",
                - "tags": [
                    - "deep"
                    - ,
                    - "elasticsearch"
                - ]
            - }
        - }
    - ]
- }

}

查询举例2:查询书名title中包含“enhance”字段的数据信息:
[root@5b9dbaaa1a ~]# curl -XGET 10.200.1.121:9200/blog/ariticle/_search?pretty -d ‘

> { "query" : {
> "term" :
> {"title" : "enhance" }
> }
> }'
{
  "took" : 189,
  "timed_out" : false,
  "_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
  },
  "hits" : {
  "total" : 2,
  "max_score" : 0.8784157,
  "hits" : [ {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "4",
  "_score" : 0.8784157,
  "_source" : {
  "title" : "enhance Elasticsearch!",
  "content" : "Version 4.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "5",
  "_score" : 0.15342641,
  "_source" : {
  "title" : "enhance Elasticsearch for university!",
  "content" : "Version 5.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  } ]
  }
}

查询举例3:查询ID值为3,5,7的数据信息:
[root@5b9dbaaa148a ~]# curl -XGET 10.200.1.121:9200/blog/ariticle/_search?pretty -d ‘

{ "query" : {
"terms" :
{"_id" : [ "3", "5", "7" ] }
}
}'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
  },
  "hits" : {
  "total" : 3,
  "max_score" : 0.19245009,
  "hits" : [ {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "5",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "enhance Elasticsearch for university!",
  "content" : "Version 5.0!",
  "tags" : [ "enhance", "elasticsearch" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "7",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "deep Elasticsearch for university!",
  "content" : "Version 2.0!",
  "tags" : [ "deep", "elasticsearch", "university" ]
  }
  }, {
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "3",
  "_score" : 0.19245009,
  "_source" : {
  "title" : "init Elasticsearch for university!",
  "content" : "Version 3.0!",
  "tags" : [ "initialize", "elasticsearch" ]
  }
  } ]
  }
}

3、更新文档(类似mysql update操作)

http://localhost:9200/blog/ariticle/1/_update/ POST
{“script”:”ctx._source.content = \”new version 2.0 20160714\”“}

更新后结果显示:
{

  • “_index”: “blog”,
  • “_type”: “ariticle”,
  • “_id”: “1”,
  • “_version”: 2,
  • “_shards”: {
    • ”total”: 2,
    • “successful”: 1,
    • “failed”: 0
  • }

}

查询&验证更新后结果:(对比可知,版本号已经更新完毕)
http://localhost:9200/blog/ariticle/1/

{

- "_index": "blog",
- "_type": "ariticle",
- "_id": "1",
- "_version": 2,
- "found": true,
- "_source": {
    - "title": "New version of Elasticsearch released!",
    - "content": "new version 2.0 20160714",
    - "tags": [
        - "announce"
        - ,
        - "elasticsearch"
        - ,
        - "release"
    - ]
- }

}
`![这里写图片描述](http://img.blog.csdn.net/20160717132407353)``

注意更新文档需要在elasticsearch_win\config\elasticsearch.yml下新增以下内容:

script.groovy.sandbox.enabled: true
script.engine.groovy.inline.search: on
script.engine.groovy.inline.update: on
script.inline: on
script.indexed: on
script.engine.groovy.inline.aggs: on
index.mapper.dynamic: true

4、删除文档(类似mysql delete操作

http://localhost:9200/blog/ariticle/8/回结果

{

- "found": true,
- "_index": "blog",
- "_type": "ariticle",
- "_id": "8",
- "_version": 2,
- "_shards": {
    - "total": 2,
    - "successful": 1,
    - "failed": 0
- }

}

这里写图片描述