本文是自己在工作中的一些总结,开发语言与工具以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 }
测试截图:
2 逻辑类:
逻辑类是该工具的核心中的核心,包括基本的业务实现(如socket发包或者WinpCap发包,如报文的解析,回应,ACK,加解密压缩等),用以控制整个工具使用期间的流程以及业务逻辑,需要具体问题具体对待。
3 功能类:
此类是逻辑类与用户类的辅助类,如数据转换,文件读取,日志读写,优化等
(3)输出类
好的文章需要“凤头”“猪肚”“豹尾”,开发一个软件亦是如此。输出类起到一个豹尾的作用;
输出分为多种形式,常见的如下:
1 日志输出;将每一步的执行动作,执行结果打印到界面,或者保存到Log文件中(具体实现形式由用户自己发挥);
2 测试报告输出;将测试的结果输出给用户,需要知道用户的关注点在何处;
实际实行时,可以二者结合。
In a Word,
整个开发过程建议采取瀑布模型,循环反馈,步步为营,持续集成,这样可以保证工具的高集成,高可用和高复用。