一个Flex BlazeDS的应用程序的性能测试

2009年7月14日,由罗布德波尔
http://blog.dutchworks.nl/2009/07/14/performance-testing-a-flex-blazeds-application/

 
 
 
 
 

在过去几年中,我已经看到了在我们的客户在Flex应用程序的兴趣日渐浓厚。我不得不说,我没有对这一趋势感到惊讶。不仅Flex应用程序一般很好看,而且还提供一个大的提高用户体验。作为一个开发人员和架构师,我也挺高兴的编程模型和丰富的部件库。当然,Adobe可以改善了很多东西,但到目前为止,我一直与Flex应用程序的乐趣工作。

最近,在我们的客户之一,我碰上Flex应用程序开发的另一个有趣的一面,即性能测试(例如负载测试或压力测试) 。令人惊奇的是,这是很难找到一个经济实惠的解决方案。那里有似乎非常好做的Neoload)或合理地 WebLOAD),但我不能找到一个可行的开源替代品的商业工具。

当然,它的不完全直接写这样的一个工具。困难在于生成和AMF的请求发送到Web服务器的能力,再加上你回来的AMF响应的解释 。标准的做法,大多数的性能测试工具的使用是基于HTTP请求和响应的假设上的。虽然技术上对HTTP协议的AMF协议“扯起一坐”,以及中,内容是打包成二进制格式(AMF)的,不能被解释的常规方式,HTTP请求和响应。因此,需要一个专门的工具,可以解释AMF的 。然而,并非每一位顾客花几万块钱。所以,你怎么应付这个?

AMF请求产生

事实证明,一个小的聪明才智和BlazeDS的代码库的帮助下,你可以创建一个解决方案,以优秀的一起JMeter的,让你就像你是用来干什么的执行性能测试。让我们开始与一代的AMF请求 。

在BlazeDS的- core.jar有申述的AMF消息和de-/serializing他们的方法。这实际上是使用BlazeDS的本身之间进行转换AMF数据到Java对象模型,反之亦然。因为他们亲切开源这个代码,我是能够重复使用这些类来生成AMF的请求,并保存这些文件。下面是一个代码片段,我写了这样做的情侣:

public byte[] generate(AmfRequestParameters params) {
    ActionMessage message = new ActionMessage();
    message.addBody(createMessageBody(params));
 
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    MessageSerializer serializer = createMessageSerializer(out);
    try {
        serializer.writeMessage(message);
    catch (IOException e) {
        throw new AmfRequestGenerationException(e);
    }
 
    return out.toByteArray();
}

首先要注意的是创造一个ActionMessage。这实际上是一个AMF请求,我们将添加一个身体在这个方法的第二行表示。因为我们要保存到一个文件这个AMF的要求,我们当然需要首先将其序列化。我们使用MessageSerializer类BlazeDS的,请提供。我们让序列化的消息,以一个ByteArrayOutputStream使我们有可能用于其他目的,它比它保存到一个文件,但你可以很容易地传递了一个FileOutputStream。最后,我们返回的字节数组返回到客户端调用此方法。

建设信息

所以,让我们来看看createMessageBody(参数)方法:

protected MessageBody createMessageBody(AmfRequestParameters params) {
    RemotingMessage message = new RemotingMessage();
    message.setHeader(HEADER_DS_ENDPOINT, channel);
    message.setHeader(HEADER_DS_ID, "1");
    message.setMessageId("1");
    message.setDestination(params.getDestination());
    message.setOperation(params.getOperation());
    message.setBody(params.getParameters());
 
    return new MessageBody(nullnullnew RemotingMessage[] {message});
}

我们在这个方法做的是创建一个RemoteMessage实例。如果你曾经检查一个AMF请求的内容,一些属性可能是熟悉的。设置了两个头:“DSEndpoint”和“DSID”。端点实际上是在你的services - config.xml文件的通道,您使用发送的所有通信通过(默认情况下,所谓的东西,像“通道AMF”)。我不太清楚什么ID头应该做的事,但BlazeDS的似乎需要它。不过值似乎并不重要,因此“1”。也没有为此事的消息ID。

有趣的部分是目标,操作和参数。这些属性与你想调用的后端服务,该服务的方法,该方法的任何参数。最后,我们回到这将被添加在生成()方法,我们在前面看到的ActionMessage RemotingMessage MessageBody。

我介绍了一个小数据持有人的类来保存消息的动态值,称为AmfRequestParameters:

public class AmfRequestParameters {
 
    private String destination;
    private String operation;
    private Object[] parameters;
 
    /**
     * Creates a new {@code AmfRequestParameters} with the given fields.
     *
     * @param destination destination of the amf request
     * @param operation operation to call on the destination
     * @param parameters parameters of the operation
     */
    public AmfRequestParameters(String destination, String operation, Object[] parameters) {
        this.destination = destination;
        this.operation = operation;
        this.parameters = parameters;
    }
 
    // getters and setters omitted
}

创建一个消息序列化

需要做的最后一件事是序列化的消息。这是可以做到与MessageSerializer:

protected MessageSerializer createMessageSerializer(OutputStream out) {
    SerializationContext context = new SerializationContext();
    context.setSerializerClass(AmfMessageSerializer.class);
    SerializationContext.setSerializationContext(context);
 
    MessageSerializer serializer = context.newMessageSerializer();
    serializer.initialize(context, out, null);
 
    return serializer;
}

为了创建一个MessageSerializer,BlazeDS的需要知道什么类型的序列化器需要创建的。这是通过一个SerializationContext您指定为一个它应该实例AmfMessageSerializer类。然后我们初始化的序列化的背景和所选择的OutputStream,这是一个在我们的例子ByteArrayOutputStream。或者,您可以添加一个AmfTrace初始化过程,但我不觉得这是给我的任何值。

AMF的请求添加到JMeter的

最后,我们现在有一个字节数组,它包含一个序列化的AMF消息。这可以很容易地被保存到一个文件,它可以加载到JMeter的:

JMeter的AMF的要求截图

几件事情是重要的,知道什么时候使用JMeter发送AMF的请求。所有您需要确保您点JMeter的公开您的后端服务到您的Flex应用程序的URL。这实际上是在你的services - config.xml文件的通道元素下的端点URI。其次,确保你指定的HTTP请求方法为POST。有道理,如果我们与请求一起发送的文件。最后,点JMeter的AMF请求文件包括请求,并指定其为“应用程序/ x - AMF”的MIME类型。

就是这样,大家都为测试你的Flex BlazeDS的应用程序的性能!

限制

这种方法有一些限制的情侣:

  • 你不能检查详细的请求的响应。作为响应也是以AMF,JMeter可以不检查,就可以断言
  • HTTP响应代码是意义不大。由于基本上每一个来自服务器的响应是一个HTTP 200响应代码,我们可以不检测,如果一个错误被抛出。例如,如果我们得到一个BadCredentialsException在登录过程中,我们可以添加一个断言到JMeter的检查,如果用户实际上在下一个屏幕上,而不是重定向到登录屏幕,。不幸的是,这并不Flex应用程序作为客户端应用程序本身已经使这种类型的错误决定什么(服务器,而不是为我们这样做)
  • 这种方法只限于BlazeDS的。由于使用BlazeDS的代码库的代码中,我们,我们不能使用,例如WebORB代替的BlazeDS。这主要是由于这样的事实,有细微的差别在某些数据类型的序列化和反序列化
  • 也许最大的缺点是,你必须创建一个AMF的请求文件,每个请求的变化。例如,如果我们要与100个不同的用户登录,我们还需要创建100个登录请求文件。通常情况下,你就可以在JMeter的脚本请求参数中添加变量。

目前,我寻找到解决这些限制,通过使用JMeter的预处理器和后置。您可以添加自定义Java代码到JMeter的每个请求将执行。因此,您可能能够动态生成AMF请求文件。

结论

通过使用BlazeDS的代码库和JMeter,我们都能够到一个Flex BlazeDS的一个非常符合成本效益的应用程序性能测试。JMeter的多年来已经证明是一个极好的工具进行性能测试,它是一​​种解脱,一点点的聪明才智,我们可以使用Flex应用程序也的。

我觉得我只触及表面上可以完成这个组合。definetely是有很大的潜力,这里要探讨的,我鼓励每个人都具有读取此博客条目​​有走出去,自己尝试!

标签:AMFBlazeDS的Flex中JMeter的负载性能测试

 posted on 2012-01-17 08:04  奈奥奇  阅读(604)  评论(0编辑  收藏  举报