接下来来测个WebSocket应用。
- 被测应用:一个Elixir and Phoenix实现的聊天室。参考代码
- URL:
ws://localhost:4000/socket/websocket
WebSocket测试的配置和HTTP差不多,如果你还没有看过HTTP,请移銮驾。唯一不同点在于sessions
的配置。这里给出sessions
以外的完整配置:
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung>
<clients>
<client host="localhost" cpu="4" maxusers="30000"/>
</clients>
<servers>
<server host="localhost" port="4000" type="tcp"/>
</servers>
<load>
<arrivalphase phase="1" duration="1" unit="minute">
<users arrivalrate="10000" unit="second"/>
</arrivalphase>
</load>
<sessions>
<!-- 在这里添加会话 -->
</sessions>
</tsung>
添加会话
对于WebSocket来说,一个会话相当于创建连接->(发送消息&接收消息)* n ->断开连接
的全过程。这个过程用XML配置来描述就是下面这样:
<sessions>
<session name="websocket" probability="100" type="ts_websocket" weight="1">
<!-- 创建连接 -->
<request>
<websocket type="connect" path="/socket/websocket"/>
</request>
<!-- 定义动态变量 room_id -->
<setdynvars sourcetype="random_number" start="1" end="100">
<var name="room_id" />
</setdynvars>
<!-- 发送消息加入房间的 -->
<request subst="true">
<websocket type="message">
{"topic":"room:%%_room_id%%","event":"phx_join","payload":{},"ref":"1"}
</websocket>
</request>
<!-- 发送聊天消息 -->
<for var="i" from="1" to="1000" incr="1">
<thinktime min="10" max="60" random="true"/>
<request subst="true">
<websocket type="message">
{"topic":"room:%%_room_id%%","event":"publish_message","payload":{"username":"user","body":"test"},"ref":"%%ts_user_server:get_unique_id%%"}
</websocket>
</request>
</for>
<thinktime min="1" max="10" random="true"/>
<request>
<websocket type="close"/>
</request>
</session>
</sessions>
上述配置首先创建了websocket连接(type="connect"
),然后在100个房间里随机挑了一个房间进,在这个房间里时而发消息(type="message"
),时而读别人发来的消息(用thinktime
模拟),发了1000条消息后,主动断开连接(type="close"
)。
这里比较有意思的事定义动态变量(<setdynvars/>
)和使用动态变量。定义不用多说,一看就知道怎么用了。使用的话,<request/>
元素上必须加上属性subst="true"
。subst
是substitute(替换)的缩写,意味着当前的<request/>
元素里有动态替换的部分,这种部分的长相是%%_变量名%%
,注意变量名前面有个下划线。
运行测试和绘制图表
和HTTP版一样,我这里就偷懒了。