Postman操作(接口测试、生成测试报告、MockServer等)

文章目录


前言

阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。


Postman简介

Postman是一款非常流行的接口调试工具,它使用简单,功能强大。不仅测试人员会使用,开发人员也经常使用。

官方网站:https://www.getpostman.com/

在做接口测试时,Postman可以用来模拟各种HTTP请求(如:get/post/delete/put...),它相当于一个客户端,模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,随后验证响应中的结果数据是否和预期值相匹配;能够及时发现接口中的bug,进而保证产品上线之后的稳定性和安全性。

主要特点

  1. 简单易用的图形用户界面
  2. 可以保存接口请求的历史记录
  3. 使用测试集Collections可以更有效的管理组织接口
  4. 可以在团队之间同步接口数据

下图大致罗列了 Postman中所包含的功能。

Postman下载和安装

下载

直接在官网下载即可,下载地址:https://www.postman.com/downloads/

Postman支持Windows、Mac和Linux系统,根据自己的操作系统以及所需版本选择下载。

注意:不同版本界面操作会有所不同。

安装

找到下载好的文件直接双击.exe文件,会默认安装在C盘,安装完会自动打开。

注册与登录

Postman最新版本已经不维护离线模式(即:未登录),要体验全部功能需要登录。打开Postman,注册新用户,点击【Create Acount】进行注册

输入邮箱、用户名、密码,点击注册

注册完成后登录,如下图所示即登录成功

Postman工具介绍

界面说明

发送第一个请求

第一次使用 Postman 发送请求,下面这个例子可以作为一个最基本的入门,可以帮我们建立一个初始印象。

1. 创建一个工程目录

注意:如果没有特别的需求,只需要创建一次即可

2. 创建collection合集

collection是postman用于管理接口请求的,在其内部还可以添加文件夹用于进一步管理接口请求。我们在自己的工程下,点击【+】号,再点击【Blank collection】创建一个空集合,可对其进行重命名。

3. 创建一个接口请求

在上一步创建的集合下右键点击【Add request】,新建一个接口请求,即接口用例,新建后也可重命名

4. 输入接口请求参数

对于一个接口请求来说,需要三部分内容:

请求地址(URL):http://www.baidu.com/s

请求方式:get

请求参数:params

请求参数示例:

wd=csdn

5. 发送请求

点击send按钮发送请求。放请求后,我们接收到响应信息,状态码200 描述OK,点击Headers可以查看响应行信息、可查看Cookies信息。点击Body查看响应体信息,通过选择Pretty、Raw、Preview切换响应体内容的展现形式。下图选择了Preview方式,将响应体中返回的HTML文件以网页的形式展现。

Collection

Collection是多个Folder和Request的合集。Collection可以添加Pre-request Script、Tests脚本和Variables变量,作用于Collection里的所有Request。

选择侧边栏的Collections,再点击加号创建一个空的Collection。

对空Collection进行重命名,可以添加Pre-request Script、Tests脚本和Variables变量。(创建后也可以进行重命名和增加脚本、变量)

删除Collection

Folder

在Collection中,我们可以创建Folder(文件夹)。Folder里放的是请求,请求也可以直接放在Collection中,不放在Folder里,主要用于将请求进一步细分。同样的,创建Folder时,可以添加Pre-request Script、Tests脚本,且作用于Folder下的所有请求。

选择指定的Collection右侧三个点,下拉弹窗选择Add folder新建Folder。

删除Folder:

Requset

Request是请求接口,可以在Collection或Folder下创建,可以添加Pre-request Script、Tests脚本,且只作用于当前Request。

选择指定的Collection或Folder右侧的三个点,下拉弹窗选择Add request新建Request。

Request未保存状态窗口标签会有一个红点提示。

删除Request

注意:在窗口栏上点击加号创建Request,是没有指定保存在哪个Collection或Folder里的。

后续保存时需要自己选择保存到哪个地方。

请求基础功能

  • 新建的请求默认请求方法是,也可以通过左侧的下拉框进行修改。
  • URL框用于输入请求地址。
  • Params:一般是GET请求用的查询传参。Key为参数名,Value为参数值。所谓查询参数,其实就是 URL 地址中问号(?)后面的部分。比如:https://www.baidu.com/s?wd=百度。在这个接口中,查询参数就是:wd=百度。而这一部分,是由键值对组成,格式为:key1=value1\&key2=value2, 如果有多组键值对,要用&隔开。
  • Authorization:一般用于用户名密码或者token鉴权
  • 如果需要请求在请求头中携带一些信息,需要对Headers进行设置。与请求参数类似,是由键值对组成。
  • Body:一般在进行POST请求时,会写入参数
  • none:没有参数
  • from-data:文件上传或表单格式(可选)
  • x-www-form-urlencoded:表单请求(键值对格式)
  • raw:使用原始数据格式请求(JSON、XML、HTML、Text、JavaScript)
  • binary:二进制文件上传
  • GraphQL:不怎么使用,可忽略
  • 若有一些在请求前需要执行的脚本,在Pre-request Script下添加
  • 收到响应后需要执行的脚本,在Tests下添加

参数为表单类型的POST请求

上传文件的表单请求

在做接口测试时,经常会遇到需要上传文件的接口,比如更新微信头像。这时候,可以用form-data。它也属于一种表单,但它既支持表单请求,也支持文件上传。

JSON 类型的接口请求

响应

点击Send按钮后,会接收到响应结果。

Body:响应体的内容

  • Pretty:以不同的格式查看响应体的内容
  • Raw:以文本格式查看响应体的内容
  • Preview:以网页格式查看响应体的内容

Cookies:响应的Cookie

Headers:响应头

Test Results:断言的结果

全局变量、集合变量、环境变量

在 Postman 常用的三种变量分别是全局变量,环境变量,集合变量。

它们的作用域范围从大到小依次排列为:全局变量>集合变量>环境变量

全局变量

  • 全局变量,在Postman中被称为Globals。整个Postman,包括Collection、Folder、Request和脚本都可以使用这个变量。

手动设置Global全局环境变量:

在 Tests,Pre-requests Script 中代码设置Global全局变量: pm.globals.set("var_name", value);

环境变量

环境变量:

  • 一个变量只能属于某个环境,在某一个环境中变量不可重复定义
  • 在环境与环境之间变量可以重复定义
  • 一个环境可以包含多个环境变量
  • 当我们有多个不同环境,例如:本地、开发、测试、生产环境,不同环境变量值分别不同,每个环境变量可以单独设置。

环境变量设置如下:

创建新环境。

新建环境重命名,并设置环境变量


在 Tests,Pre-requests Script 中代码设置环境变量 :

pm.environment.set("var_name", value);

集合变量

  • 集合变量是针对集合的,也就是说声明的变量必须基于某个集合,它的使用范围也只是针对这个集合有效。

选择一个集合,打开查看更多动作(...)菜单,然后点击编辑。

选择"变量"选项卡以编辑或添加到集合变量。

在 Tests,Pre-requests Script 中代码设置集合变量 :

pm.variables.set("var_name", value);

获取变量

定义好变量,接下来就可以使用变量了。需要注意的是,在不同的位置获取变量,编写的规则也是不一样的。

  • 如果在请求参数中获取变量,无论是获取全局变量、环境变量,还是集合变量,获取的方式都是一样的编写规则:{{变量名}}

    请求参数指的是:URL,Params,Authorization,Headers,Body

  • 如果在编写代码的位置(Tests,Pre-requests Script)获取不同类型的变量,则编写的代码各不相同,具体如下:

    1、获取环境变量:pm.environment.get('变量名')

    2、获取全局变量:pm.globals.get('变量名')

    3、获取集合变量:pm.collectionVariables.get('变量名')

内置变量

说明:内置变量和全局变量、环境变量、集合变量一样,只是它是Postman内部已经定义好的,可以直接在请求参数和脚本中引用。

常用内置变量:

  • 时间戳:{{$timestamp}}
  • 生成0-1000的随机整数:{{$randomInt}}
  • 生成一个GUID的字符串:{{$guid}}
  • 生成一个随机UUID:{{$randomUUID}}

Postman内置变量参考:https://learning.postman.com/docs/writing-scripts/script-references/variables-list/

接口关联

在接口测试中,经常出现这种情况:上一个接口的返回数据,是下一个接口的输入参数,那么这两个接口之间就产生了关联。这种关联在做接口测试时,非常常见,所以在Postman 中,如何实现这种关联关系呢?

实现步骤:

  • 提取上一个接口的返回数据值
  • 将这个数据值保存到环境变量或全局变量
  • 在下一个接口获取环境变量或全局变量

JSON提取器

python 复制代码
// 获取JSON格式的响应数据
var jsonData = pm.response.json();
//将响应数据中的var_value(某个变量的值)设置为全局变量(全局变量名为key,可自行指定)
pm.globals.set("key", jsonData.var_value);
//在其他地方即可获取变量
JSON提取数据常见情况

注意:实际是熟悉Javascript代码获取JSON格式的数据

案例 1:多层 JSON 嵌套, 获取 user_id 的值

python 复制代码
{
	"code": 0,
	"message": "请求成功!",
	"data": {
	"user_id": "1252163151781167104"
	}
}

//获取 JSON 体数据
var JSONData = pm.response.JSON()
// 获取 user_id 的值,通过.获取
var user_id = JSONData.data.user_id

案例 2:JSON 中存在列表,获取 points 中的第二个元素

python 复制代码
{
	"code": 0,
	"message": "请求成功!",
	"data": {
		"roles": {
			"api": [
				"API-USER-DELETE"
			],
		"points": [
			"point-user-delete",
			"POINT-USER-UPDATE",
			"POINT-USER-ADD"
		]
		},
		"authCache": null
	}
}

//获取 JSON 体数据
var JSONData = pm.response.JSON()
// 获取 user_id的值,通过下标获取列表中某个元素
var user_id = JSONData.data.roles.points[1]

正则表达式提取器(使用不多)

根据正则表达式获取到响应结果中的值,将其设置为全局变量,其他步骤一致

python 复制代码
//打印响应结果
console.log(responseBody);
//通过正则表达式匹配值(match匹配**key:正则表达式格式**的形式)
var datas = responseBody.match(new RegExp('"key":"(.*?)"'));
console.log(datas[1]);
//设置成全局变量
pm.globals.set("key",datas[1] );

Pre-request script、Test script脚本

Postman 可以在Pre-request script、Test script中编写JavaScript 脚本,允许向Request、Collection和Folder添加动态行为。这允许您编写测试套件,构建可以包含动态参数的请求,在请求之间传递数据等等。

pre-request script:请求前脚本,在请求接口发送前执行。

test script:测试脚本,在接收到响应数据后执行。

脚本的执行顺序:

可以看出,一个请求在发送之前,会先去执行 Pre Request Script(前置脚本)中的代码。那么这个功能在实际工作中有什么作用呢?

主要场景:一般情况下,在发送请求前需要对接口的数据做进一步处理,则都可以使用这个功能。比如说,登录接口的密码,在发送前需要做加密处理,那么就可以在前置脚本中做加密处理;再比如说,注册接口的邮箱输入参数会用到随机字符串,每请求一次接口该参数值都要求发生变化,这时,就可以在前置脚本中编写生成随机字符串的代码。总体来说,凡在请求接口之前,需要对请求数据作进一步加工处理的,都可以使用前置脚本这个功能。

而Test script是在接收到响应数据后进行的代码。主要使用场景:设置/获取变量,获取响应参数,断言测试。

注:Postman在编写脚本的右侧有代码片段,只需要点击一下就会在编辑框生成代码片段,更友好的使用。

断言

所谓断言,就是对返回的响应结果做判断,如果结果符合预期则判定为pass,如果结果与预期不符则判定为fail。

Postman的断言是使用JavaScript语言编写的,写在'Tests'标签页里。

Tests中的脚本在发送请求之后执行,会把断言的结果(PASS/FAIL)最终在'Test Results'标签页中展示

Postman 已经内置了一些常用的断言。用的时候,只需从右侧点击其中某个断言,该断言对应的断言代码块,就会自动生成。

常用Postman断言

  • 断言响应状态码是否为200(Status code is 200)
python 复制代码
pm.test("Status code is 200", function () {
pm.response.to.have.status(200); //这里填写的 200 是预期结果,实际结果是请求返回结果
});
  • 断言响应体是否包含指定字符串(Response body: Contains string)
python 复制代码
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//响应文本中是否包含string_you_want_to_search
  • 断言响应体是否等于指定字符串(Response body:Is equal to a string)
python 复制代码
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});

//注解
响应体是否等于response_body_string
  • 断言响应头是否包含指定的头信息(Response headers: Content-Type header check)
python 复制代码
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type"); //断言响应头存在"Content-Type"
});
  • 断言响应体(JSON)中某个键名对应的值:Response body : JSON value check
python 复制代码
pm.test("Your test name", function () {
var JSONData = pm.response.json();
pm.expect(JSONData.value).to.eql(100);
});
//注解
var JSONData = pm.response.json() 获取响应体,以 JSON 赋值给JSONData.注意:该响应体返回格式必须是 JSON,否则会报错
pm.expect(JSONData.value).to.eql(100) 获取 JSONData 中的value为响应体中的key,然后和 100 进行比较
或者响应体中带列表
pm.expect(JSONData.value[0].value-key).to.eql(100) 
  • 断言响应时间:Response time is less than 200ms
python 复制代码
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200); //断言响应时间<200ms
});

操作示例

日志调试

在做接口测试时,经常会因为代码写的有问题导致报错。这时,通过日志查看错误就显得非常重要,Postman 也提供了这样的功能,它允许我们在脚本中编写打印语句,用以查看打印的结果。同时,也可以查看每个请求的日志信息。

在 Postman 中有两个入口:

第一个入口就是:View -> Show Postman Console。

第二个入口就是左下角Console。

示例

python 复制代码
var body=responseBody;
var title=body.match(new RegExp('"username":"(.*?)"}'))
// 打印标题
console.log(title)

更多内容,详情可自行查阅JavaScript的console调试方法。

批量执行测试用例

当在一个 Collection 中编写了很多个接口测试用例,想一起执行这批用例,在Postman 中如何操作呢?

可以先创建Runner,后选择Collection和设置

或者选中一个 Collection,点击 RUN 按钮。

这时,会出现一个叫 Collection Runner 的界面,默认会把 Collection 中的所有用例选中。对Runner进行设置后,点击RUN按钮执行测试用例。

执行完毕后,将看到测试的结果。

  • 断言统计:统计当前 Collection 中断言成功的执行数和失败的执行数,如果没有编写断言,默认都为 0。
  • Run Summary:运行结果总览,点击它,可以看到每个请求中,具体的测试断言的详细信息。
    Export Result:导出运行结果,默认导出的结果文件格式为 JSON 格式。
    Retry: 重新运行,点击它会把该 Collection 重新运行一遍。
    New:返回到 Runner,可以重新选择用例的组合。

Postman的参数化(数据驱动)

应用场景: 针对于某个接口,如果有大量的测试数据需要批量验证,可以把测试数据保存到数据文件中,通过参数化的方式来实现。

常用的数据文件格式有:CSV、JSON。如下图所示


参数化执行步骤:

  1. 准备测试数据文件
  2. 设置参数
  3. 在请求中使用时,直接通过{{变量名}}引用
  4. 在断言中使用时,需要借助postman内置的data方法来进行使用,如 data.username
  5. 选择数据文件进行批量执行
  6. 结果检查

案例:

需求:批量查询手机号归属地和所属运营商信息,并校验运营商数据是否正确

接口地址: http://cx.shouji.360.cn/phonearea.php?number=13012345678 部分测试数据:

手机号: 13012345678 运营商: 联通

手机号: 13800001111 运营商: 移动

手机号: 18966778899 运营商: 电信

  1. 准备测试数据文件
    CSV格式:

    Json格式:
  2. 设置参数
    在请求参数中使用时,直接通过{{变量名}}引用,在执行时会逐行引用数据文字的{{变量}}值。

    在断言中使用时,需要借助postman内置的data方法来进行使用,内置的data会读取传入的数据文件。
  3. 选择数据文件进行批量执行
    在自己创建的collection集合右上角点击【Run collection】,打开批量执行窗口,选择csv或者json文件,选择后会自动带入执行次数,再勾选要测试的接口,点击执行
  4. 结果检查

    通过Console控制台查看结果

数据导入导出

Postman支出数据导入导出,包括Collection、Environment环境变量、Pre-request Script和Tests脚本。用于不同工作人员之间同步工作进度,传递资料。

链接或文件方式导入

点击主页标题栏下的import按钮。

选择导入的方式,下图所示三种方式。

Collection导出

选择要导出的Collection,点击右侧三个点,选择Export导出。

默认选择,直接导出JSON文件。

注意:如果Collection有Variable变量、Pre-request script和Tests脚本也会一同被导出。

Environments导出

Globals导出,点击Export按钮,直接导出为JSON文件。

自定义的其他环境导出,点击右侧三个点,选择Export,导出JSON文件。

导出本地Postman所有数据

打开设置

选择Data -> Request Data Export。

会跳转到网页上,点击Export Data按钮。

默认全选,选择导出,会通过Email方式发送到你的账号邮箱,访问邮箱链接下载导出文件。

分享Postman数据

除了Collection可以生成分享链接,其他的Folder、Request和Environment都只能分享给指定的用户或者用户邮箱,分享数据和导出数据一样。

除了Collection可以生成分享链接,其他的Folder、Request和Environment都只能分享给指定的用户或者用户邮箱,分享数据和导出数据一样。

Collection分享:

选择要分享的Collection,以下二种方式任意选一个。

选via api,点击Generate New Key,最后复制完整链接给其他用户,用户通过该链接导入分享的Collection。

Request分享:

点击Request右侧三个点,选择Share。

分享方式:

注意:下面让你选择什么方式去合作,默认选择创建一个新的工作台并移除当前Collection给你的团队,另一个是分享你的工作台给你的团队。

Postman实现Cookie、token鉴权

Postman会自动完成cookie、token鉴权,无需手动完成。

在第一次获取cookie、token以后,随后postman发送请求不需要自己手动添加cookie、token,postman会自动帮我们填写在请求头上

可手动对cookie进行管理

Mock Server

使用Mock Server(模拟服务器)目的是,因项目中任务的不同分工(目前项目基本都是前后端分离),会出现每个人的任务进度不一样的情况。就会出现模块A开发完成,但其依赖项模块B还未完成,这时候如果进行集成测试时,就会出现两个模块无法有效完成工作。针对这种情况,就可以使用Mock Server用来模拟未完成的模块B来返回响应数据,测试模块A是否正确。

Mock应用场景

  • 依赖的接口响应速度慢
  • 依赖的接口未实现
  • 接口各种异常模拟

Postman可以创建两种类型的Mock服务

私有Mock:私有Mock服务需要在请求头中添加Postman API key,如X-Api-Key:postman API key

公有Mock:公有Mock服务可以被任何人访问,在使用过程中不需要添加Postman API key

公有Mock Server具体使用操作:

(1)点击左侧图标【Mock Servers】,点击【Create Mock Server】,在右侧填写相应的Mock服务器参数,并点击【Next】,如下图所示。在创建Mock Server的同时,并设定了对该服务器使用GET和POST请求访问后所得到的响应状态码、响应体。

填写Mock服务器的相关信息并点击【Create Mock Server】

在创建Mock Server成功后,会出现如下界面

创建Mock服务后,postman会自动创建集合以及环境变量(生成了Mock Server的url,存放在环境变量),直接对该url发送请求即可(切换至Collections,发送请求)

GET请求Mock Server 示例


POST请求Mock示例

注意: Postman中的Mock Server存在以下限制

  • 每月仅能访问该Mock Server 1000次
  • 需要与Postman保持连接

因此,Mock Server更多的是使用Python代码进行模拟。

例如使用Flask实现Mock Server,操作如下 (仅供参考)

  1. flask安装 在cmd中输入 pip install flask
  2. 验证flask是否安装成功 在cmd中输入:pip show flask
  3. 假设有一个登录接口,地址url后的路径为/login,需要输入用户名和密码来进行登录并获得反馈。基于flask搭建Mock Server,代码如下:
python 复制代码
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/login', methods=['get', 'post'])
def flask_mockserver():
    # 获取客户端传来的账号密码
    data = request.get_json()
    print(data)
    user = data['username']
    pwd = data['password']
    # 账号密码进行登录判断
    if user == 'admin' and pwd == '123456':
        # jsonify()返回响应的json数据
        return jsonify(
            {
                "code": "001",
                "msg": "Login successfully"
            }
        )
    elif user == '' or pwd == '':
        return 'The account or password cannot be empty!'
    else:
        return 'error'


if __name__ == '__main__':
    app.run(debug=True)

对搭建的模拟服务器进行POST请求

python 复制代码
import requests

data = {
    'username': 'admin',
    'password': '123456'
}
url = 'http://127.0.0.1:5000/login'
res = requests.post(url=url, json=data)
print(res)
print(res.text)

结果:(1)账号密码正确, 返回了自行设置的Json,相当于获得了响应体内容。

(2)账号或密码为空

(3)账号或密码错误

Newman(生成测试报告、用于持续集成)

Newman是一款基于Node.js开发的,专为 postman 而生的命令行工具,通过命令行执行的方式执行脚本。此外,Newman可以在 Jenkins 上实现 postman 接口测试持续集成。

  1. 安装Node.js(略)
  2. 安装newman
python 复制代码
//安装命令
npm install -g newman
  1. 验证是否安装成功
python 复制代码
//验证命令
newman -v
  1. 安装newman-reporter-html (用于生成测试报告)
python 复制代码
//安装html报告模板 
npm install -g newman-reporter-html
  1. 导出postman中用于测试的 接口用例集合、环境变量以及全局变量三部分内容(可参考上文的数据导出章节)

导出测试用例集合


环境变量
全局变量

注: 导出文件都为json格式,这里要注意的是,文件命名不要用中文命名,且都在同一文件路径下。

  1. 打开cmd窗口,使用Newman命令,运行导出的测试脚本。在输入命令之前,先了解newman的命令行参数。
参数 用法
-e -- environment 后面跟环境变量文件
-g -- global 后面跟全局变量文件
-n -- iteration-count 后面跟迭代次数
-d -- iteration-data 指定用于迭代的数据源文件
-r -- reporters 后面跟数据结果
html 将结果生成为html文件,指定生成到具体目录需要配合 --reporter-html-export 文件名 使用
python 复制代码
newman run "e:\\newmans\\yongli.json" -e "e:\\newmans\\huanjing.json" -g "e:\\newmans\\quanju.json" -r cli,html,json,junit --reporter-html-export "e:\\newmans\\report.html"

命令行展示测试结果

生成测试报告【report.html】

注:关于Newman用于持续集成,以及Jenkins自动化构建测试部署、美观好用的测试报告模板Allure 会在后续博客中更新(newman-reporter-html生成的测试报告效果一般)。


参考目录

https://blog.csdn.net/whowhowhoisimportant/article/details/124111940

https://blog.csdn.net/Leoon123/article/details/125549812

https://blog.csdn.net/qq_42055933/article/details/139583344

https://blog.csdn.net/qq_45674493/article/details/135413501

https://blog.csdn.net/qq_29180433/article/details/123832025

https://blog.csdn.net/2301_80864686/article/details/135936366

https://blog.csdn.net/whowhowhoisimportant/article/details/124837390

https://blog.csdn.net/whowhowhoisimportant/article/details/123905940

https://www.bilibili.com/video/BV1h54y1L7kz

https://www.bilibili.com/video/BV1tcHCemEx4

https://www.bilibili.com/video/BV11K4y1J7sh

相关推荐
m0_748229992 小时前
Java 进阶面试指南
java·测试工具·面试
程序员小远6 小时前
搭建Appium工具环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
靖节先生1 天前
Wireshark详解
网络·测试工具·wireshark
黄卷青灯772 天前
抓包工具 wireshark
网络·测试工具·wireshark
小白学大数据2 天前
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
python·selenium·测试工具
看,未来2 天前
Apipost 与 Postman 工具实践指南:WebSocket调试与动态参数测试
websocket·测试工具·postman
shimly1234562 天前
tcpdump 用法示例
网络·测试工具·tcpdump
程序员老舅2 天前
C++ Qt项目教程:WebServer网络测试工具
c++·qt·测试工具·webserver·qt项目·qt项目实战