手搓一个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)


目录
相关文章
|
1月前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
26天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
149 17
Selenium:强大的 Web 自动化测试工具
|
18天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
70 11
|
2月前
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
46 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
2月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
52 3
|
2月前
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
57 2
|
2月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
2月前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
227 2
|
2月前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
2月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
70 3