zoukankan      html  css  js  c++  java
  • 借助面向对象的思路开发多用户模拟类工具

    本文是自己在工作中的一些总结,开发语言与工具以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,

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

    除特殊说明外,其余所有文章均属原创。未经允许,请勿进行转载或者其他操作 有问题欢迎留言交流
  • 相关阅读:
    go开发 modules 的使用和代理
    利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
    别再@官方啦,普天同庆加国旗
    vue基于 element ui 的按钮点击节流
    react-router 5.0 的鉴权
    slot 组件的内部传值 v-slot 的使用
    javascript 写一个ajax 自动拦截,并下载数据
    Linux 命令大全
    http 基础
    MongoDB Shell (mongo)
  • 原文地址:https://www.cnblogs.com/LiuBingBlogs/p/8542148.html
Copyright © 2011-2022 走看看