手搓一个node测试接口小工具!

简介: 这些库需要安装,我想着搞一个命令行交互式的,可以快捷测试接口,类似于curl那种,只不过我的工具更加傻瓜式。

image.png


嗨嗨嗨,又到了写轮子环节了,为什么要写这个东西呢?


这次带来的还是一个库,我们之前测试接口会使用一些工具,postManapiFox 等。

这些库需要安装,我想着搞一个命令行交互式的,可以快捷测试接口,类似于curl那种,只不过我的工具更加傻瓜式。


文档地www.npmjs.com/package/xmw…


安装


npm i xmwc -g


安装完成之后会有一个命令叫wc


wc -h


可以查看帮助


Usage: wc [options] [command]
请求API
Options:
  -V, --version  output the version number
  -h, --help     display help for command
Commands:
  get            快捷发起get请求
  post           快捷发起post请求
  ws             socket套接字测试


使用方法


直接调用wc命令


wc


1.wc


选择是否从缓存读取Y读取N取消 如果没有使用过建议N


2.选择请求方式 GET POST 等.....


3.选择请求头 application/x-www-form-urlencoded application/json 等


4.输入请求资源路径 也就是url


5.输入参数如果是get可以忽略


6.选择返回格式(默认json) text blob buffer


7.是否缓存 Y 缓存 N 取消 缓存起来可以下次直接使用


成功返回success


失败error


image.png


采用选项式操作,如果添加到缓存里面可以下次直接发起请求


image.png


2.快捷发起请求


如果不想繁琐的去选择也可以使用快捷发送请求


wc get 命令


image.png


wc post


image.png


wc ws 


image.png


支持测试webSocket


源码


#!/usr/bin/env node
import { program } from 'commander' //命令工具
import http from 'node-fetch' //发送请求
import inquirer from 'inquirer' //命令行交互工具
import { Result } from './type'
import chalk from 'chalk' //变颜色
import fs from 'fs'
import path from 'path'
import ws from 'ws' //socket
const cacheJson = require('../cache.json')
const PKG = require('../package.json')
program.version(PKG.version).description('查看版本')
program.description('请求API').action(async () => {
    const { isCache } = await inquirer.prompt([
        {
            type: "confirm",
            name: "isCache",
            message: "是否从缓存中读取"
        },
    ])
    if (isCache) {
        const keys = Object.keys(cacheJson)
        if (keys.length === 0) {
            console.log(chalk.red('暂无缓存'))
        } else {
            const res = await inquirer.prompt([
                {
                    type: "list",
                    name: "cache",
                    choices: keys,
                    message: "请选择缓存的请求"
                }
            ])
            const value = cacheJson[res.cache];
            sendHttp(value)
        }
    } else {
        const result = await inquirer.prompt<Result>([
            {
                type: "list",
                name: "method",
                choices: ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH', 'OPTIONS'],
                default: "GET"
            },
            {
                type: "list",
                name: "header",
                message: "选择请求头",
                choices: [
                    "application/x-www-form-urlencoded",
                    "application/json",
                    "multipart/form-data",
                    "text/plain"
                ]
            },
            {
                type: "input",
                name: "url",
                message: "请求资源路径",
                default: "http:// |  https://"
            },
            {
                type: "input",
                name: "params",
                message: "请输入参数(GET忽略)",
                default: ""
            },
            {
                type: "list",
                name: "response",
                message: "请选择返回格式(默认json)",
                choices: ['json', 'text', 'blob', 'buffer'],
                default: ['json']
            },
            {
                type: "confirm",
                message: "是否缓存",
                name: "cache"
            }
        ])
        sendHttp(result)
    }
})
//读写json文件添加缓存
const cache = <T extends Result>(params: T) => {
    cacheJson[params.method + '-' + params.url.substring(0, 30)] = params;
    fs.writeFileSync(path.join(__dirname, '../cache.json'), JSON.stringify(cacheJson, null, 4))
}
const sendHttp = async <T extends Result>(result: T) => {
    try {
        const response = await http(result.url, {
            method: result.method,
            body: result.params || undefined,
            headers: {
                'Content-Type': result.header
            }
        })
        const val = await response[result.response]()
        if (result.cache) {
            cache(result)
        }
        console.log(chalk.green('success'))
        console.log(val)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
}
//get命令
program.command('get').description('快捷发起get请求').action(async () => {
    const { url } = await inquirer.prompt<{ url: string }>([
        {
            type: "input",
            name: "url",
            message: "快捷请求get请输入url",
            validate(v) {
                if (!v) {
                    return 'url不能为空'
                }
                return true
            }
        }
    ])
    try {
        const response = await http(url).then(res => res.json())
        console.log(chalk.green('success'))
        console.log(response)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
})
//post命令
program.command('post').description('快捷发起post请求').action(async () => {
    const { url, params } = await inquirer.prompt<{ url: string, params: string }>([
        {
            type: "input",
            name: "url",
            message: "快捷请求post请输入url",
            validate(v) {
                if (!v) {
                    return 'url不能为空'
                }
                return true
            }
        },
        {
            type: "input",
            name: "params",
            message: "请输入参数(没有请忽略)",
            default: ""
        }
    ])
    try {
        const response = await http(url, {
            method: "post",
            body: JSON.stringify(params) || undefined,
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(res => res.json())
        console.log(chalk.green('success'))
        console.log(response)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
})
//ws命令
program.command('ws').description('socket套接字测试').action(async () => {
    const { url } = await inquirer.prompt<{url:string}>({
        type: "input",
        message: "请输入ws | wss 协议地址",
        name: "url"
    })
    const socket = new ws(url)
    socket.on('open', () => {
        console.log('socket 已连接')
    })
    socket.on('message', (e) => {
        console.log('result:' + e.toString())
    })
    socket.on('error', (e) => {
        console.log('error', e)
    })
    socket.on('close', () => {
        console.log('socket 已断开')
    })
})
program.parse(process.argv)


目录
相关文章
|
8月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
713 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
8月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
690 6
|
9月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
1939 10
|
9月前
|
监控 Java 数据挖掘
利用Jmeter工具进行HTTP接口的性能测试操作
基础上述步骤反复迭代调整直至满足预期目标达成满意水平结束本轮压力评估周期进入常态监控阶段持续关注系统运转状态及时发现处理新出现问题保障服务稳定高效运作
1250 0
|
10月前
|
人工智能 数据可视化 测试技术
UAT测试排程工具深度解析:让验收测试不再失控,项目稳稳上线
在系统交付节奏加快的背景下,“测试节奏混乱”已成为项目延期的主因之一。UAT测试排程工具应运而生,帮助团队结构化拆解任务、清晰分配责任、实时掌控进度,打通需求、测试、开发三方协作闭环,提升测试效率与质量。本文还盘点了2025年热门UAT工具,助力团队选型落地,告别靠表格和群聊推进测试的低效方式,实现有节奏、有章法的测试管理。
|
10月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
11月前
|
数据可视化 测试技术 Go
Go 语言测试与调试:`go test` 工具用法
`go test` 是 Go 语言内置的测试工具,支持单元测试、基准测试、示例测试等功能。本文详解其常用参数、调试技巧及性能测试命令,并提供实际项目中的应用示例与最佳实践。
|
11月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1537 23
|
11月前
|
弹性计算 JavaScript Ubuntu
WebSocket协议相关的测试命令工具使用简介
本文介绍了针对WebSocket的测试工具wscat和websocat的基本使用方法,以及通过curl命令测试HTTP/HTTPS协议的方式。对于WebSocket,直接使用curl测试较为复杂,推荐使用wscat或websocat。文中详细说明了这两种工具的安装步骤、常用参数及连接示例,例如在ECS上开启8080端口监听并进行消息收发测试。此外,还提供了curl命令的手动设置头部信息以模拟WebSocket握手的示例,但指出curl仅能作为客户端测试工具,无法模拟服务器。
3594 5
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
2040 24