# QPerf
**Repository Path**: peternest/qperf
## Basic Information
- **Project Name**: QPerf
- **Description**: Qt框架开发的网络性能测试工具
- **Primary Language**: C++
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 35
- **Created**: 2021-03-25
- **Last Updated**: 2021-03-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# QPerf
(项目及文档持续完善中,欢迎加入。交流QQ群:972641491)
## ☸介绍
Qt5框架下使用[QtNet库](https://gitee.com/andwp/qt-socket) 开发的跨平台网络性能测试库。
## ☸软件架构
### ☃类设计
图1 主要类图

#### ☂主要类说明
##### ▶BaseState 状态基类
网络性能测试工具的状态抽象。此类是应用设计模式-状态模式的一个变体,解决各状态之间的业务耦合,各状态类可组合使用。
##### ▶StateFactory 状态类创建工厂
封装各个状态的实现类。包括:`InitServerState`、 `StartServerState`、`InitClientState`、`InitServerState`、`StopState`等的对象实例创建。
##### ▶PointerFactory 远端节点类创建工厂
封装各个远端节点实现类。包括:`FakeServerPointer`、`FakeClientPointer`、`PFPointer`。
##### ▶BasePointer 远端节点基类
表示对远端节点的业务封装,一个远端节点可能是真实存在的,也可能是虚拟的(`FakeClientPointer`、 `FakeServerPointer`)
##### ▶Context 上下文
封装类的调用关系。控制状态切换。依赖`BasePointer`、`BaseState`。使用`PointerFactory`、`StateFactory` 创建需要的实例。
##### ▶BaseTunnel 隧道基类
对通信隧道的封装,通信隧道可能是`TcpServer`、`TcpClient`、`Udp`的任一种封装。
##### ▶PFPointer 真实远点节点类
封装真实的远端节点的类,
### ☃状态机设计
图2 服务端状态机设计

图3 客户端状态机设计

图4 服务端时序图

图5 客户端时序图

### ☃目录结构
- qtsocket QtNet通信库项目文件;
- include QtNet通信库头文件;
- src QtNet通信库实现文件;
- netperf 网络性能测试工具(进行中);
- perfunittest 性能测试工具的单元测试;
- doc 文档相关。
### ☃编码规范
#### 💚命名
- :pushpin: 文件名
所有源代码文件均使用全小写命名,源码文件的名称与文件中的类名称一致。
- :pushpin: 类命名
大写开头,遵从驼峰式命名法,使用英文名词对需要缩写的单词,不得超过三个连续的大写字母。
- :pushpin: 类方法命名
小写开头,遵从驼峰式命名法。
- :pushpin: 类成员命名
类成员使用`m_`开头,紧接着的单词以小写开头,并遵从驼峰式命名法。
- :pushpin: 属性命名
获取属性名称以对应的成员名称为准(去掉`m_`开头), 设置属性加入前置`set`,并接属性大写开头。
- :pushpin: 局部变量命名
局部变量以小写开头,遵从驼峰式命名法。
#### 💚注释
- :pencil2: 类注释
例子:
```cpp
/**
* @brief The CommandParser class
* 解析命令参数。
*/
```
- :pencil2: 方法注释
例子:
```cpp
/**
* @brief cmdIPTuple 获取命令的IP五元组。
* @param dest 输出参数。
* @return 成功返回true。
*/
```
- :pencil2: 成员注释
例子:
```cpp
int m_sampling; //数据采样率
int m_allowErrorCode; //允许数据包容错大小
QTime m_startTime; //启动时间
qint64 m_totalSampleCount; //读取到的总数据大小
```
#### 💚代码格式
- :pencil2: if 条件
```cpp
if(condition)
{
dosth..
}
```
- :pencil2: while 循环
```cpp
while(condition)
{
dosth...
}
```
或
```cpp
do{
dosth...
}while(condtion)
```
#### 💚文件编码
所有代码文件采用utf-8 带BOM头格式保存
#### 💚其它规范
- :pencil2:类的代码行数限定 500行以内
- :pencil2:类方法代码行数限定 50行以内
- :pencil2:类的继承层次不超过3层
- :pencil2:`while` `if-else` `switch-case` 等嵌套层次不能超过3层