Moco框架以及其在Web集成测试的应用
作者:网络转载 发布时间:[ 2016/3/9 14:29:03 ] 推荐标签:软件测试 单元测试
在 2013 年Duke's Choice Awards上,Moco 框架被提名为具创新力的 Java 项目之一,在 Twitter 上得到了 Martin Fowler 的关注,详见《企业系统集成点测试策略》一文在 InfoQ 英文站
Moco 下的 Hello World
首先,您需要:
配置您的 Java 环境
下载 Java 程序,并设置好系统环境变量 (PATH, JAVA_HOME)
安装并配置 Gradle
具体可以参考http://www.gradle.org/
接下来,按照下面的步骤安装 Moco
获取 Moco 源文件
使用 git 命令,获取新的代码
git clone https://github.com/dreamhead/moco.git
也可以直接下载编译好的 Jar 文件,目前是 0.9.1
http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.9.1/moco-runner-0.9.1-standalone.jar
编译源代码,生成 Jar 文件 (用以编译好的 Jar 文件的,可以忽略这个步骤) 在命令行执行如下的命令
cd <moco directory>
./gradlew build
编写配置文件,以简单的 Hello World 为例
[
{
"response" :
{
"text" : "Hello, Moco"
}
}
]
将文件以 json 的后缀存储,比如 foo.json
启动 Moco 服务
在命令行输入
java -jar moco-runner-<version>-standalone.jar start -p 12306 -c foo.json
注:-p 指定 Moco 服务端口 (目前仅指 Web 端口)
访问 Web 服务
打开浏览器,访问 http://localhost:12306
您应该可以立即看到久违了的"Hello World"
Moco 的复杂实例
实例一, 带参数的 HTTP 请求
有些时候我们希望能够在请求的同时,传递相应的参数。这时我们需要用到"queries"关键字
配置文件
{
"request" :
{
"uri" : "/foo",
"queries" :
{
"param" : "blah"
}
},
"response" :
{
"text" : "bar"
}
}
启动浏览器,并访问
http://localhost:12306/foo?parm=blash
实例二,基于正则表达的 URL 匹配
在很多对 URL 请求的测试中,我们希望对于多个相似的 URL,都返回相同的结果
配置文件
{
"request":
{
"uri":
{
"match": "/\w*/foo"
}
},
"response":
{
"text": "bar"
}
}
启动浏览器
在地址栏输入多个地址(/foo 前带有任意字符, 比如 http://localhost:12306/xxx/foo)
实例三:跳转
页面的自动跳转也是经常在 Web 开发中遇到的问题之一
配置文件
{
"request" :
{
"uri" : "/redirect"
},
"redirectTo" : "http://www.github.com"
}
启动浏览器访问 http://localhost:12306/redirect
页面将会被自动导向到 http://www.github.com
实例四: 返回 JSON 对象
在 Web 开发中,对于 JSON 的操作是典型的应用
配置文件
{
"request": {
"uri": "/json"
},
"response": {
"json": {
"foo" : "bar"
}
}
}
启动浏览器访问 http://localhost:12306/json
页面上会显示输出的 JSON 对象
Moco 高级用法
在 Moco 里您还可以发现一些好玩的,或者说高级用法,比如 Asynchronous、Template。具体用法还是参考 Moco 的文档,这里仅以 Asynchronous 为例。
编写配置文件
{
"request": {
"uri" : "/event"
},
"response": {
"text": "event"
},
"on": {
"complete": {
"async" : "true",
"post" : {
"url" : "http://another_site",
"content": "content"
}
}
}
}
那么对于/event 的访问,将会是异步。
也是说数据并不会立即返回,而是要等到对 http://another_siter 访问结束后,才会将结果放到 Response 里。
Moco 的 API 用法
前面的这些用法在 Moco 里被称为"Standalone", 它强调的是 Moco 的简单性和可配置性,而 Moco 的 API 是它的另一个特色,它更加关注如何在测试用例里如何使用 Moco。
我们先看一个基于 Moco 的典型测试用例
import org.junit.Test;
import java.io.IOException;
import com.github.dreamhead.moco.HttpServer;
import org.apache.http.client.fluent.Content;
import org.apache.http.client.fluent.Request;
import com.github.dreamhead.moco.Runnable;
import static com.github.dreamhead.moco.Moco.*;
import static com.github.dreamhead.moco.Runner.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
@Test
public void should_response_as_expected() throws Exception {
HttpServer server = httpserver(12306);
server.response("foo");
running(server, new Runnable() {
@Override
public void run() throws IOException {
Content content = Request.Get("http://localhost:12306").execute().returnContent();
assertThat(content.asString(), is("foo"));
}
});
}
上面的测试用例,描述了如何启动 Moco,以及调用相应的帮助方法来编写测试。
有时我们希望测试用例本身能够控制 Server 的启动和关闭,这里要用到@Before, @After 这些 Junit 里常用的注释
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import static com.github.dreamhead.moco.Moco.httpserver;
import static com.github.dreamhead.moco.Runner.runner;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class MocoRunnerTest {
private Runner runner;
@Before
public void setup() {
HttpServer server = httpserver(12306);
server.response("foo");
runner = runner(server);
runner.start();
helper = new MocoTestHelper();
}
@After
public void tearDown() {
runner.stop();
}
@Test
public void should_response_as_expected() throws IOException {
Content content = Request.Get("http://localhost:12306").execute().returnContent();
assertThat(content.asString(), is("foo"));
}
}
Moco + Web 集成测试案例
了解了 Moco 的具体使用方法,我们来看一个真实的基于 Moco 的案例,从而理解为什么 Moco 对于 Web 开发人员来说是革命性的!
用例:
在 Web 上调用 Ajax 获取服务器端的版本(version)号,并根据返回的值显示不同的提示信息。
分析:
其实面对这样的需求,我们很容易看出这个用例本身,关注的是"显示不同的提示信息"这个功能,至于返回的 version 值,用户根本不必关心或者说这属于系统内部的逻辑。
我们先来看看以前的做法
安装并配置好 Web Server (Tomcat or Apache)
建立必要的 Web 工程文件,导入与项目相关的框架,比如 struts2
如果底层系统是 Java 本身,需要导入或者编译相关的 jar 文件,如果底层用其他的语言开发,需要步骤 4
搭建底层开发环境或者在编译机器上编译 Lib 或者 so 文件,在确保能够运行的情况下(需要测试脚本)并导入到项目当中
发布 Web 应用并测试,如果底层 API 有变动或者方法调用错误,需要再次运行步骤 4。
编写并测试 Ajax 逻辑。
那么我们看看基于 Moco 的开发步骤会是什么样的:
编写配置文件, 这里要用到刚才说的同步方法
[
{
"env" : "remote",
"include": "foo.json",
},
{
"env" : "local",
"include": "bar.json",
}
]
启动 Moco 服务
java -jar moco-runner-<version>-standalone.jar start -p 12306 -g env.json -e remote
在很多时候,我们往往将时间浪费在步骤 3,4 中,即使已经有编译好的 Lib 或者 so,还是存在着测试的必要和风险。Web 的开发人员一方面要完成自己开发任务,另一方面还要扮演底层代码测试员角色。
编写 Web 应用,调用 ajax 请求
Moco 让开发人员更关注应用本身,而不必将时间和精力花费在 Lib 或者 so 的可用性上,而且没有复杂的 Web 容器配置,关注的是切实的功能本身。
同时,它的 API 有利于 Web 开发者编写测试用例,将以前部门之间的无效沟通,建立在可度量的测试用例之上,从而提高了 Web 集成测试的可靠性,并有效地降低了集成测试的风险!
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南