借助面向对象的思路开发多用户模拟类工具

 

本文是自己在工作中的一些总结,开发语言与工具以C++/C为例。整理比较仓促,后续持续更新。转载或其他操作请通知作者。当然,交流讨论是十分欢迎的。(原有所有的CSDN 博客不再更新)

公司新上了一个Server,现在需要对该Server进行压力性能和基本功能测试,需要模拟几千几万的客户端,同时进行上下线,以及其他业务操作(很多时候使用的是自己的私有协议),开发步骤如下:

一 确立开发方案:解决以下几个问题

(1)如何解决用户输入问题?

(2)如何实现工具的业务功能?

(3)如何确定输出?

二 针对1中的三个问题,一 一 回答

(1)用户输入可采用多种形式

1 UI界面:利用QT,MFC等图形化的工具解决图形界面的输入输出问题。QT的好处是可以跨平台,代码比较简洁,但windows上的通信速率以及部分系统函数需要自己编写;MFC的好处是微软自己的一个Lib,封装的是Window平台的API,借助MSDN可以迅速完成开发,缺点是代码比较复杂,想要深入了解需要功夫,跨平台不太容易;

2 加载配置文件:将用户的输入以文本或者CSV(Comma Separated Value)文件的形式保存,并在工具运行之前加载。优点是不需要UI界面,可以以命令行的形式运行,效率高,内存消耗小,缺点是不够直观(Windows已经深入人心,大部分时候我们开发的工具并不是只给自己使用,而大部分使用工具的人并不喜欢Dos界面)。

除此之外,还需要对用户输入的数据进行相应的转换。如String 类型的IP地址转换成BYTE或者DWORD;用户输入的复选框,转换成相应的TRUE OR FALSE 等等,具体的转换情况见C++/C分类;

(2)实现工具的业务功能是工具的核心,可以分成以下几步去完成

1用户类:利用面向对象的思想去考虑完成该类,然后多次生成该类的对象,即可实现多用户的模拟;如,要模拟一个孩子类可以这样写:

 1 //Child.cpp
 2 //lb 2018 3 
 3 //For Multi Users
 4 
 5 #include "stdafx.h"
 6 #include "atlstr.h"
 7 #include <iostream>
 8 const int nMaxClientNum = 10;
 9 class child
10 {
11 public:
12     child() :sName("Tom"), nAge(10), sSex("Male") {};
13 
14 public:
15 
16     CString sName;
17 
18     unsigned nAge : 7;
19 
20     CString sSex;
21 
22 };
23 
24 int main()
25 {
26 
27     /*创建多个客户端*/
28     static child* s_pChildList[nMaxClientNum];
29 
30     for (int i=0; i < nMaxClientNum; i++)
31     {
32         s_pChildList[i] = new child();
33         child *pTmp = s_pChildList[i];
34 
35         pTmp->nAge = i;
36 
37         CString sN;
38         sN.Format("%d",i);
39         pTmp->sName += sN;
40 
41         (i % 2 == 0) ? pTmp->sSex = "Male" : pTmp->sSex = "Female";
42 
43     }
44     /*验证客户端*/
45     for (int i = 0; i < nMaxClientNum; i++)
46     {
47         child *pChild = s_pChildList[i];
48 
49         std::cout << "Child" << i << std::endl << "姓名:" << pChild->sName << ";" << std::endl << "性别:" << pChild->sSex << ";"
50             << std::endl << "年龄:" << pChild->nAge << std::endl<<std::endl;
51     }
52     /*清理客户端*/
53     for (int i = 0; i < nMaxClientNum; i++)
54     {
55         child *pChild = s_pChildList[i];    
56         if (pChild != NULL)
57         {
58             delete pChild;
59             pChild = NULL;
60         }
61     }
62     getchar();
63     return 0;
64 }
View Code

 

测试截图:

 

2 逻辑类:

逻辑类是该工具的核心中的核心,包括基本的业务实现(如socket发包或者WinpCap发包,如报文的解析,回应,ACK,加解密压缩等),用以控制整个工具使用期间的流程以及业务逻辑,需要具体问题具体对待。

3 功能类:

此类是逻辑类与用户类的辅助类,如数据转换,文件读取,日志读写,优化等

(3)输出类

好的文章需要“凤头”“猪肚”“豹尾”,开发一个软件亦是如此。输出类起到一个豹尾的作用;

输出分为多种形式,常见的如下:

1 日志输出;将每一步的执行动作,执行结果打印到界面,或者保存到Log文件中(具体实现形式由用户自己发挥);

2 测试报告输出;将测试的结果输出给用户,需要知道用户的关注点在何处;

实际实行时,可以二者结合。

In a Word,

整个开发过程建议采取瀑布模型,循环反馈,步步为营,持续集成,这样可以保证工具的高集成,高可用和高复用。

 

posted on 2018-03-10 21:30  我是某某某是我  阅读(193)  评论(0编辑  收藏  举报

导航