Code Monkey home page Code Monkey logo

tommylemon / apiauto Goto Github PK

View Code? Open in Web Editor NEW
1.9K 39.0 242.0 4.96 MB

☔ 敏捷开发最强大易用的接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释,腾讯、华为、SHEIN、传音、工行等使用 ☔ The most advanced tool for HTTP API. Testing with machine learning, generating codes and static analysis, generating comments and floating hints. Used by Tencent, Huawei, SHEIN, TRANSSION, ICBC, etc.

Home Page: http://apijson.cn/api

License: Apache License 2.0

JavaScript 84.99% CSS 9.50% HTML 5.51%
apijson vuejs2 document-database autotesting javascript api api-testing apitesting documentation-tool headless

apiauto's Issues

APIAuto优化建议

image
描述:正常情况鼠标移动至标记圈内时会显示下拉菜单项,但经常会出现鼠标移动到下拉菜单位置时,菜单项就消失了,目测应该是在鼠标经过上面和下拉框菜单有一个很小的边框距离导致失去焦点执行了隐藏,还请优化一下,致谢!

APIJSONBoot-MultiDataSource工程启动报错: !!!! 查询权限配置异常 !!! Unknown column 'apijson' in 'where clause'

【标题】:Unknown column 'apijson' in 'where clause'
【内容】:环境信息
系统: Windows 10 10.0
数据库: MYSQL 5.7.22
JDK: 1.8.0_181 amd64
APIJSON: 5.0.0

问题描述
Unknown column 'apijson' in 'where clause'

2022-04-21 07:46:24.770: APIJSONRouterVerifier.ERROR:
接口映射配置测试未通过!
请修改 Document 表里的记录!
保证前端看到的接口映射配置文档是正确的并且能正常使用!!!

原因:
查询权限配置异常 !

首个 Go 零代码单元测试 unitauto-go 1.1 发布,UnitAuto 的 Go 版

1.1 更新内容:
新增支持 mock 各种 Struct 的成员变量,包括组合等复杂自定义对象;
image

新增支持 static 静态标记字段,传 static: true 时,直接 test.Add 省去 test.Add.Add 中间的虚拟 class Add;
image

完善基本类型及对应数组类型;

兼容 Go 1.18+;
将接口服务逻辑从 main.go 迁移到 unitauto/server.go,并新增默认测试用例;
迁移打包的可执行文件到 TommyLemon/StaticResources/UnitAuto/file;

https://www.oschina.net/news/253251/unitauto-go-1-1-released

视频教程

视频教程有点粗糙呀,等我学会了,补个完整的哈哈

使用教程

TommyLemon你好,这个APIAUTO要怎么样使用来进行接口测试,clone工程到本地后打开index.html,但是不知道应该怎么导入yapi导出的接口,测试管理如何进行?

机器学习零代码单元测试平台 UnitAuto 2.9 新增 Go 版、Mock Java 复杂对象

Go:

新增 Go 版,支持 同步、异步 Func/Mehod,支持基本类型和自定义 Struct, Interface 等:
https://github.com/TommyLemon/UnitAuto/tree/master/UnitAuto-Go

还有单独的仓库 unitauto-go,单独发版:
https://github.com/TommyLemon/unitauto-go/releases

Java:

新增支持 mock 各种对象的成员变量,包括继承、嵌套等复杂自定义对象;

Admin:

新增自动智能补全、环境对比测试、前置与后置脚本等功能;

解决静态检查回调方法报错格式不对;
注释符 // 前空格改为 1 个;
同步前端代码到 Demo;

更多图文内容见
https://www.oschina.net/news/234690/unitauto-2-9-released

【UnitAuto】查看、同步方法文档没有结果

1、下载项目,直接用IDEA打开【UnitAuto-Java-Demo】并运行
2、打开http://localhost:8081/,上传查看文档
image
3、报上图错误,继续上传,只导入了一个类的用例(看了一下这个类是jar包里的,demo里写的方法并没有生成用例)
image
4、试了在外面访问method/list,也失败了
image

请问正确的操作应该是怎么样的(比如将UnitAuto集成到自己的springboot项目,哪些配置是必需的)。

如何快速接入APIAuto

您好,我想问一下APIAuto是否可以本地私有化部署,如果可以,如何在公司接入ApiAuto

前端页面请求404

把项目下了下来,后端启动的是springboot demo项目,前端页面的数据库配置也改了,为啥请求错误
看路径请求的是/delegate,没有这个接口所以报错404
image

下面是通过idea请求,是正常的
image

能力不足,折腾一下午,也没有跑通 go 的 UnitAuto

  1. 是不是现在还不能私有部署?
  2. UI 的各种问题(比如 cookies 共用)能不能想办法修复一下。。
  3. 扫描 Go 的代码在哪个组件完成的?
  4. 看文档说不用手动注册能够用 Admin 自动生成,实际上还是要手动录入 package struct 的吧?
  5. 机器学习如何解决 go 函数内的异步,数据 Mock 之类的问题的?文档上说对函数本身没什么要求。
  6. 这个比 LLM 生成的 UT 靠谱吗?
  7. 最后一个问题:如何证明这个项目不是一个噱头项目?现在从文档上看没有使用上的帮助,大部分都在吹,Google 也搜不到使用的文章,都在吹。。。包括这里:#36
  8. 老是在 issues 发 XXXX 连接了 ApiAuto,又不是小孩子了。。真好用,别人就发技术博客了。这边引用博客链接比什么都好使。

都放在 github 了,大家都在看的。

请问机器学习在这其中做了什么

您好,请问ApiAuto这个项目中,机器学习采用什么算法,它起到了哪些作用,或者说哪些功能用到了机器学习的什么,多谢
另外,可否提供更方便的联系方式,方便沟通

【UnitAuto+APIJSON前后端本地部署问题】-查看用例列表,远程共享数据数据没有展示出来

本地后端部署代码:
1、后端部署了APIJSONBoot5.4.0的代码
2、前端用的是UnitAuto-Admin最新的代码
3、sql执行的是5.4.0版本包里面的sql文件

查看、同步方法文档上传单元测试用例这个问题是正常的,存在以下几个问题点,望指教
1、未登录-点击查用例列表,远程共享数据数据没有展示出来
image

2、已登录-点击查看用例列表,提示登录用户不能get请求
image

解决 无法访问非同域名下的接口 或 登录后 Cookie 马上失效且自动退出登录

Chrome 80+ 强制 same-site Cookie 的策略导致。

Chrome 94+ 可以以下方式 或 使用旧版(偶尔失效)

打开 tab 页面 chrome://flags/#block-insecure-private-network-requests
将其 Block insecure private network requests 设置为 Disabled, 然后重启就行了, 这样子就相当于把这个功能禁用掉。
image

Chrome 90+ 其它版本可以用以下方式(推荐,目前每次测试都有效)

先完全退出 Chrome,然后终端命令启动

open -n /Applications/Google\ Chrome.app/ --args --disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure --disable-web-security --user-data-dir=~/MyChromeDevUserData/

会有一个报错弹窗:Chrome 无法对目录 MyChromeDevUserData 进行写入操作。
点击确定会启动开发调试模式的 Chrome,浏览器地址栏下会多出一栏:

image

然后再按以下方式修改 Chrome 设置

Chrome 87 以下可以修改 Chrome 设置

https://www.cnblogs.com/jingmo0319/p/13402645.html
还不行再试试把设置项 Reduce default 'referer' header granularity 改为 Enabled。
image

或安装和使用浏览器插件 Access-Control-Allow-Origin

https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf

Chrome 87-89 目前经测试只能以关闭安全验证模式启动 Chrome(推荐,目前每次测试都有效)

Windows

Chrome.exe 文件快捷方式中属性 目标 添加

--disable-web-security --user-data-dir

具体见 https://www.cnblogs.com/q149072205/p/12162233.html

MacOS

终端输入命令

open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security

具体见 https://www.jianshu.com/p/2db73311fcbe/

如果以上都不行,或者还存在登录态总是失效问题

可以把 APIAuto 源码部署到和被测服务同一域名(最好是同一机器,SpringBoot 项目可放在 static 目录),
参考 APIAuto 使用的后端 APIJSONBoot-MultiDataSource
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource

或者直接用旧版 Chrome(80 以下)
https://www.slimjet.com/chrome/google-chrome-old-version.php

【UnitAuto+APIJSON前后端本地部署问题】上传用例报错 POST请求,请在 内传 TestRecord:{} !

本地后端部署代码:
1、后端部署了APIJSONBoot6.0.0的代码
2、前端用的是UnitAuto-Admin 2.9.0最新的代码
3、sql执行的是6.0.0版本包里面的sql文件

POST http://localhost:8080/post
Content-Type: application/json
Cookie: Hm_lvt_965ec968d2d53b729b90efc7ffb3ead2=1682177888; Hm_lpvt_965ec968d2d53b729b90efc7ffb3ead2=1682178312; JSESSIONID=8A2C0C39A5D76046FC399A7D9AC962EB
Host: apijson.cn:9090

{
"format":false,
"Method":{
"userId":82001,
"language":"Java",
"package":"unitauto.test",
"class":"TestUtil",
"method":"plus",
"this":null,
"constructor":null,
"classArgs":null,
"genericClassArgs":null,
"methodArgs":[
{
"type":"Number",
"value":97.66362
},
{
"type":"Number",
"value":93.2855
}
],
"genericMethodArgs":[
{
"type":"Number",
"value":97.66362
},
{
"type":"Number",
"value":93.2855
}
],
"type":"double",
"genericType":"double",
"static":1,
"ui":0,
"exceptions":null,
"genericExceptions":null,
"detail":"plus"
},
"TestRecord":{
"randomId":0,
"host":"unitauto.test.TestUtil.",
"response":""
},
"tag":"Method"
}

2023-04-23 01:05:01.455: AbstractVerifier.INFO: verifyRequest method = POST; name = ; target =
{"Method":{"INSERT":{"@ROLE":"OWNER"},"MUST":"method,class,package","REFUSE":"id"},"TestRecord":{"INSERT":{"@ROLE":"OWNER"},"UPDATE":{"documentId@":"Method/id"},"MUST":"response","REFUSE":"id,documentId"}}
request =
{"Method":{"userId":82001,"language":"Java","package":"unitauto.test","class":"TestUtil","method":"plus","methodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"genericMethodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"type":"double","genericType":"double","static":1,"ui":0,"detail":"plus","@method":"POST"}}
2023-04-23 01:05:01.457: AbstractVerifier.INFO: verifyRequest method = POST; name = Method; target =
{"INSERT":{"@ROLE":"OWNER"},"MUST":"method,class,package","REFUSE":"id"}
request =
{"userId":82001,"language":"Java","package":"unitauto.test","class":"TestUtil","method":"plus","methodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"genericMethodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"type":"double","genericType":"double","static":1,"ui":0,"detail":"plus","@method":"POST"}
2023-04-23 01:05:01.457: AbstractVerifier.INFO: parse return real = {"userId":82001,"language":"Java","package":"unitauto.test","class":"TestUtil","method":"plus","methodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"genericMethodArgs":[{"type":"Number","value":97.66362},{"type":"Number","value":93.2855}],"type":"double","genericType":"double","static":1,"ui":0,"detail":"plus","@method":"POST","@ROLE":"OWNER"}
java.lang.IllegalArgumentException: POST请求,请在 内传 TestRecord:{} !
at apijson.orm.AbstractVerifier$1.onParseJSONObject(AbstractVerifier.java:651)
at apijson.orm.AbstractVerifier.parse(AbstractVerifier.java:964)
at apijson.orm.AbstractVerifier.parse(AbstractVerifier.java:878)
at apijson.orm.AbstractVerifier.verifyRequest(AbstractVerifier.java:643)
at apijson.orm.AbstractVerifier.verifyRequest(AbstractVerifier.java:599)
at apijson.orm.AbstractVerifier.verifyRequest(AbstractVerifier.java:548)
at apijson.orm.AbstractParser.objectVerify(AbstractParser.java:2340)
at apijson.orm.AbstractParser.batchVerify(AbstractParser.java:2243)
at apijson.orm.AbstractParser.parseCorrectRequest(AbstractParser.java:574)
at apijson.orm.AbstractParser.parseCorrectRequest(AbstractParser.java:882)
at apijson.orm.AbstractParser.onVerifyContent(AbstractParser.java:525)
at apijson.framework.APIJSONParser.onVerifyContent(APIJSONParser.java:180)
at apijson.orm.AbstractParser.parseResponse(AbstractParser.java:418)
at apijson.framework.APIJSONParser.parseResponse(APIJSONParser.java:117)
at apijson.orm.AbstractParser.parseResponse(AbstractParser.java:391)
at apijson.orm.AbstractParser.parse(AbstractParser.java:363)
at apijson.framework.APIJSONController.parse(APIJSONController.java:93)
at apijson.framework.APIJSONController.post(APIJSONController.java:175)
at apijson.boot.DemoController.post(DemoController.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)

关于机器学习测试

您好 这个工具很不错
不过有一个意见机器学习测试中没有使用任何机器学习的算法,直接说是机器学习测试这样很不严谨

首个 Python 零代码单元测试 unitauto-py 开源,UnitAuto Python 版

百度、搜狗、抖音公网接口调用演示

因为这些接口不支持 CORS 跨域,所以需要开启托管服务代理。
可以复制 Chrome 等浏览器、Charles 等抓包工具的请求文本,
粘贴到 APIAuto 的 URL 输入框,会自动填充 URL, JSON, Header 等。

百度
APIAuto_request_thirdparty_api_baidu

搜狗
APIAuto_request_sogou_api

抖音
APIAuto_request_douyin_api

咱们这个apiauto有生成sql的功能吗

比如以下配置应该生成 2个sql
{
"User[]": {
"User": {
"id|{}": "<30000,>80000"
}
},
"s[]": {
"B_stone": {
"@column": "id"
}
}
}

select * from User where id < 30000 or id > 80000
select id from B_stone limit等

点击“查看、同步方法文档:可先编辑再上传”-“上传”之后,显示成功了,但是没有拉取到用例,数据库中也没有发现记录

我用的是"APIJSON-Demo-6.0.0"
我在UnitAuto-Java-Demo原来的基础上新增了一个类包含3个方法
我上传的时候,没有异常,并且UnitAuto-Java-Demo中也没有异常,页面也提示上传成功。但是在/APIJSONBoot的控制台显示数据库错误
image
image
我在APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java中配置了我本地的数据库并且能登录成功和之前的用例(所以数据库的配置应该是正确的),请问这个错误是我需要从哪里修改配置吗

页面虽然显示了上传成功,但是我从“远程共享用例列表”没有找到我新建的类方法请问下,是不是和上面数据库报错有关系呢,请帮忙给点建议意见
image

机器学习零代码单元测试 UnitAuto 3 新增 Python&更新 Java, Go•优化算法

Admin

兼容 Go, Python 等语言的 多返回类型、指针 等场景;针对 Go, Python 设置默认用例;
前后对比新增支持深入数组子项;
机器学习测试:新增支持值重复断言,可通过前后置脚本 JSONResponse.COMPARE_VALUE_REPEAT = 1 或 2 开启;
Node:支持 CORS 跨域;新增 /test/compare 前后对比断言接口 和 /test/ml 机器学习断言接口,可脱离 UI 使用;
Headless 无 UI 后台测试:解决 Vue 版本兼容问题、document.cookie 报错 document undefnied;
随机与顺序测试:在用例列表项新增统计结果;在没有上传过对比标准时使用默认参数对应的 response 和 standard,也能比较精准地断言;

SDK

Java: 更新 jar 包;
Go: 新增支持 mock 各种 Struct 的成员变量,包括组合等复杂自定义对象;
Python: 新增 Python 版,还有单独的仓库 unitauto-py;

文档

新增支持的 Kotlin 版本说明;
新增关于新增测试用例 4 种方式的说明文档;
常见问题新增 5. 如何统计行覆盖率 / 分支覆盖率?

更多图文内容见
https://www.oschina.net/news/253259/unitauto-3-0-0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.