• 2016-05-23

    Moco 0.11.0发布

    Tag:moco

    前版信息:Moco 0.10.2发布

    我很高兴地宣布,Moco 0.11.0发布了。

    Moco是什么?

    Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

    变更

    本次发布主要增加了两个大的特性:REST API 和 JUnit 集成。

    众所周知,REST 服务几乎已经成了现代服务端开发的标配。为了简化 REST API 的模拟,Moco 专门提供了特定的 API,比如,下面这个例子:

    RestServer server = restServer(port, log());
    ResourceObject resource = new ResourceObject();
    resource.code = 1;
    resource.message = "hello";

    server.resource("targets",
        get("1").response(toJson(resource))
    );

    RestServer 的 resource 方法是为配置资源而设计的,主要配置资源的名字,以及访问的设置。这里的例子里,我们声明了一个名为 targets 的资源,我们还配置了一个 get 方法,当资源 ID 为1时,返回相应的对象。这个配置可以通过 /targets/1 访问得到。

    REST API 同样支持 JSON 配置文件,上面的例子用 JSON 配置文件的形式可以写成如下格式:

    [
    "resource": {
      "name": "targets",
      "get": [
        {
          "id": "1",
          "response": {
            "json": {
              "code": 1,
              "message": "foo"
            }
          }
        }
      ]
    }
    ]

    访问 REST API 的文档可以了解更多细节。

    Moco 的 JUnit 集成是利用 JUnit 的特性,进一步简化测试代码的编写。

    public class MocoJunitJsonHttpRunnerTest {
        @Rule
        public MocoJunitRunner runner = MocoJunitRunner.jsonHttpRunner(12306, "foo.json");

        @Test
        public void should_return_expected_message() throws IOException {
            Content content = Request.Get("http://localhost:12306").execute().returnContent();
            assertThat(content.asString(), is("foo"));
        }
    }

    这里声明了一个 JUnit 的规则(Rule),它会在测试运行之前启动一个 Moco 服务器,在测试运行完毕之后关闭它。利用 Rule 的特性,就不必在每个测试里去启停 Moco 服务器了。

    更多发布相关信息,请参考 Release Notes

  • 2015-09-05

    Moco 0.10.2发布

    Tag:moco

    前版信息:Moco 0.10.1发布

    我很高兴地宣布,Moco 0.10.2发布了。

    Moco是什么?

    Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

    变更

    本次发布主要是一些API的增强和内部细节的改进。

    对于json的Java API增加了对于普通Java对象的支持。这样一来,我们就可以通过编写普通的Java对象,让它自动转换成对应的json。比如,下面的代码是对请求的支持:

      server.request(json(pojo)).response("foo");

    应答的支持是这样的:

      server.request(by(uri("/json"))).response(toJson(pojo));

    因为这个普通Java对象到json的自动转换是由Jackson实现的,所以,这里的对象类需要按照Jackson的方式进行声明,比如,下面是一个例子:

      public class PlainA {
        public int code;
        public String message;
      }

    更多Jackson的用法,可以参考Jackson的文档

    另外,本次的API增强还包括了对于redirect的模板支持,这样,redirect的API就可以实现更强大的跳转效果:

      server.redirectTo(template("${var}", "var", "http://github.com"));

    更多发布相关信息,请参考Release Notes

  • 2015-05-12

    Moco 0.10.1发布

    Tag:moco

    前版信息:Moco 0.10.0发布

    我很高兴地宣布,Moco 0.10.1发布了。

    Moco是什么?

    Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

    变更

    本次发布对使用Java API的用户最大影响在于,原来的httpserver已经废弃了,推荐使用httpServer。

        HttpServer server = httpServer(12306);

    另外一个废弃掉的API是没有TimeUnit的latency,推荐使用有时间单位的latency接口。

        server.response(latency(1, TimeUnit.SECONDS));

    以上废弃的API将会在下一次发布中移除,请尽早更新。

    接下来,比较大的变动是增加了字符集,file和pathResource都可以进行字符集的处理。

        server.response(file("gbk.response", Charset.forName("GBK")));

    甚至,日志也指定对应的字符集:

        HttpServer server = httpServer(port(), log("path.log", Charset.forName("UTF-8")));

    模板在原来对内容处理的基础上,增加了对文件名的处理:

        server.response(file(template("${var}.response", "var", "foo")));

    这样一来,你可以把更多模板的特性用在文件名上,比如jsonPath、xpath等,也就是说,可以把不同请求应答的结果,放到不同的文件里。当然,你可以把它用在JSON配置文件里:

    [
      {
        "response":
        {
          "file":
          {
            "name": {
              "template": {
                "with" : "${var}.response",
                "vars" : {
                  "var" : "foo"
                }
              }
            }
          }
        }
      }
    ]

    这次发布还有一个针对于JSON API的调整,就是现在可以mount的时候,额外增加应答配置,比如像下面这样:

    [
      {
        "mount" :
        {
          "dir" : "src/test/resources/mount",
          "uri" : "/mount-response",
          "headers" : {
            "Content-Type" : "text/plain"
          }
        }
      }
    ]

    还有一个针对全局配置的特性,就是配置全局Request,如果你想实现一个全局token,保证每次请求都带过来,现在,就不必在每个请求上编写,只要配置一个全局的就好了:

    [
      {
        "request" : {
          "headers" : {
            "foo" : "bar"
          }
        },
        "include": "blah.json"
      }
    ]

    还有一个实现细节方面的调整,如果在模板里采用了xpath或jsonpath,可能会返回多个值,可以参考freemarker的文档编写对多值对象的处理。

    更多发布相关信息,请参考Release Notes

  • 2014-12-03

    Moco 0.10.0发布

    Tag:moco

    前版信息:Moco 0.9.2发布

    我很高兴地宣布,Moco 0.10.0发布了。

    Moco是什么?

    Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

    变更

    本次发布最大的变更是加入了Socket的支持。

    除了HTTP,Socket是另一种常见的集成方式,对Socket的支持让Moco能够更为全面地对集成进行支持。创建一个Socket的服务器,可以采用socketServer:

      final SocketServer server = socketServer(12306);

    与HTTP支持类似,Socket服务器也是需要设定请求以及对应的应答:

      server.request(by("foo")).response("bar");

    与HTTP本身支持很多参数不同,Socket只支持与内容相关的部分,比如,text、file、xml、json、match、exist、latency、template等等。更多细节,请参见Socket API的文档

    因为增加了不同的服务器类型,Moco独立服务器的启动参数也有所调整,原来的一个start已经不足以满足需要了。在最新的版本中,你可以根据服务类型记性启动,比如,启动一个Socket服务器的方式如下:

      java -jar moco-runner--standalone.jar socket -p 12306 -c foo.json 

    HTTP和HTTPS服务器的启动参数分别对应着http和https,为了兼容原有版本,start依然得到保留,但不确定未来是否会长期存在下去。

    这个版本增加了一个许多人要求的新特性,在Java代码中可以使用JSON配置文件。这种用法与Moco设计JSON API的初衷有很大差别,但在实际的使用中,确实有很多人这么用,所以,在这个版本里提供了一个更简洁的API,不过,这个API存在于Moco Runner包中:

      jsonHttpServer(12306, file("foo.json"));

    在API方面,

    • 增加attachment API,直接对下载附件提供支持。
    • 增加了template提取器的支持,比如,如下代码就会从请求中提取内容作为应答返回值。
        server.response(template("${foo}", "foo", jsonPath("$.book.price")));

    在Moco独立服务器和shell版本,增加了版本查询功能,以便对一些外部工具进行支持。

    另外,由于JSON Path底层实现的升级,可能会引入一些破坏性的变化,如果你用到JSON Path API,请注意。

    更多发布相关信息,请参考Release Notes

    感谢

    感谢Alex Soto,提供Moco服务关闭的解决方案,增强了Moco服务器的稳定性。
    感谢方志刚,提供Moco的Shell版本在Cygwin下运行的支持。

  • 2014-07-02

    Moco 0.9.2发布

    Tag:moco

    前版信息:Moco 0.9.1发布

    我很高兴地宣布,Moco 0.9.2发布了。

    Moco是什么?

    Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

    变更

    本次发布最大的变更是加入了HTTPS的支持。

    HTTPS服务器的创建即不同于普通的HTTP服务器,它使用的是httpsServer方法,除了类似于HTTP服务器的参数之外,一个很重要的参数是certificate,这里需要给出相应文件以及对应keystore密码和certificate密码。

    final HttpsCertificate certificate = certificate(pathResource("cert.jks"), "mocohttps", "mocohttps");
    final HttpsServer server = httpsServer(12306, certificate);

    独立服务器用户也可以通过命令行生成一个HTTPS服务器:

    java -jar moco-runner-<version>-standalone.jar start -p 12306 -c foo.json --https /path/to/cert.jks --cert mocohttps --keystore mocohttps

    还有一个比较重要的调整,在JSON配置中,增加了直接对JSON的支持,比如,

    {
       "request": {
           "uri": "/json_response_shortcut"
       },
       "response": {
           "json": {
               "foo" : "bar"
           }
       }
    }

    这样,给出应答就会是一个JSON对象:

    {
       "foo" : "bar"
    }

    而原来的做法如果需要返回一个JSON对象,需要大量的转义字符或是存放到文件中。

    在API方面,也做了许多调整:

    • 在Java API中,增加了HTTP版本协议类,无需以字符串的方式制定HTTP版本。
    • 在匹配方面,增加了更多的运算符,比如startsWith、endsWith、contain、exist。
    • 对于RequestHit的验证,增加了between运算符,可以判断请求次数在某个区间内。
    • 增加了多个Request Monitor的接口,以便处理遗留代码的时候,可以同时进行验证和查看日志。
    • 在模板接口上,将模板变量的类型由Object接口改成了String,这样,API用户必须确定好模板变量具体的表现形式。

    更多的细节请参考ReleaseNotes

    感谢

    感谢Michal Svab,实现了HTTPS API部分。