hrun4j

Apache
Java
所有
乐马技术 · 2021年07月12日 · 10987 次阅读 · 4 条评论

✨关于 hrun4j

hrun4j是由乐马技术推出的开源一站式接口测试解决方案,它不仅仅只是一个 Java 版的 httprunner,现阶段规划解决方案包括四部分:

  1. hrun4j-core:框架核心,提供完整的运行机制、数据驱动、多种表达式引擎、多种数据检查机制及测试报告生成(已完成)
  2. hrun4j-plugin:Intellij Idea 插件,赋能研发,插件式集成至 IDEA,提供智能补全、快速填充及在线调试运行功能(实现中)
  3. hrun4j-platform: 官方 Web 平台,赋能测试,提供完整的 API 测试生命周期管理(规划中)
  4. hrun4j-sync: 同步中心,增强研发测试协作,采用双向同步机制,支持研发本地接口文档、用例上传或远程用例下载自测(规划中)

✨ 核心特性

  1. 支持以CLIPOM模式集成hrun4j能力,如以POM模式集成,可以无缝融入 Spring 生态链
  2. 集成纯粹且优雅的Okhttps,即使是复杂场景(比如上传/下载进度控制),它都能轻松搞定
  3. 借助TestNG实现 YML 或 JSON 格式数据驱动、测试用例组织与执行
  4. 借助ReportNG,生成优雅详细的测试报告
  5. 支持多种数据提取方式,比如:正则表达式/Jsonpath/Jmespath/对象提取,支持丰富的校验方式,比如:startsWith/endsWith/equalTo/not/containsString
  6. 内置强大的表达式引擎,支持AviatorBeanShell脚本,借助他们即可轻松实现复杂的动态业务逻辑
  7. 测试前后支持完善的hook机制
  8. 提供强大且贴心 CLI 工具集,即瑞士小军刀,目前支持har2yml|jsonviewharrunstartproject CLI/POMswagger2apipostman2case
  9. 插件式集成至 IDEA,提供智能补全、快速填充及在线调试运行功能(实现中)
  10. 内置国际化支持,配置I18N参数即可轻松切换中英文输出
  11. 框架核心实现充分利用 JAVA 语言特性,把面向对象、继承、设计模式及反射机制发挥淋漓尽致

关于项目

开源地址

工程划分

工程模块划分如下:

├── hrun4j-api: 提供api接口方便扩展成平台(纳入平台规划)
├── hrun4j-cli: 提供命令行支持,支持用例录制,可快速创建脚手架、测试用例集运行及调试(已完成)
├── hrun4j-core: 工程核心模块,提供完整的运行机制、数据驱动、表达式引擎及测试报告生成(已完成)
├── hrun4j-plugins: 插件式集成至IDEA,提供智能补全、快速填充及在线调试运行功能(开发中)
├── hrun4j-test-demo: 常用基本、核心、特殊案例使用说明(已完成)
├── hrun4j-test-server:内置测试服务,基于springboot开发,工程规范标准(已完成)

框架秀点

提供多种方式集成 hrun4j 能力

提供多种方式集成hrun4j能力,分别是CLIPOMAPI,其中API可细分为:Idea PluginPlatform,一期主要集中在CLIPOM

  1. Command Line 即为命令行模式,简称为CLI,借助轻量级文本编辑器(Sublime、Editplus)和命令行工具 hrun4j.jar 即可完成用例编写、编排、执行及报告生成。
  2. Maven POM Reference 即为 POM 模式,简称为POM,在 IDEA 下完成用例编写、编排、执行及报告生成,POM 模式本质是以 MAVEN JAR 引入hrun4j,从而集成其能力。

灵活且强大的数据提取机制

hrun4j提供多种响应数据提取方式,支持正则表达式/Jsonpath/Jmespath/对象提取

  1. Jsonpath:可以通过$.对象.属性获取,对象即为框架内置对象
  2. 正则表达式:通过正则获取,值必须以^开头并以$结尾
  3. 对象提取:通过框架提供的内置对象获取,对象或者对象.属性方式获取
  4. Jmespath:和方式三类似,但可以支持更复杂的表达式提取,属Jmespath专有表达式

完善的校验选择器

hrun4j是通过反射机制构造org.hamcrest.Matchers对象进行断言代码生成的,因此Matchers类型所有方法均可以使用,现只支持预期和实际参数断言,方法非常多,列罗常用方法如下:

  1. equalTo:比较两个对象相同,可缩写成eq
  2. startsWith:某字符串以某某开始
  3. endsWith:某字符串以某某结束
  4. not:不相等,可缩写成ne
  5. containsString:某字符串包含某某
  6. lessThan:小于,可缩写成lt
  7. greaterThan:大于,可缩写成gt
  8. lessThanOrEqualTo:小于或等于,可缩写le
  9. greaterThanOrEqualTo:大于或等于,可缩写成ge

更多方法及使用查看org.hamcrest.Matchers

小巧而细腻的命令行工具集

hrun4j提供一套完整的命令工具集,统称为瑞士小军刀`,小巧而细腻,功能又强大。

-w910

后期会扩展更多命令行支持。

内置强大的表达式引擎

内置强大的表达式引擎,支持 Aviator 和 BeanShell 脚本,借助他们即可轻松实现复杂的动态业务逻辑。

  1. Aviator 是一门高性能、轻量级寄宿于 JVM 之上的脚本语言,非常轻量级、好使,支持数字、字符串、正则表达式、布尔值、正则表达式等基本类型,完整支持所有 Java 运算符及优先级等,更多用法这里
  2. BeanShell is dynamically interpreted Java, plus a scripting language and flexible environment all rolled into one clean package,更多用法这里

关于表达式使用,在实际接口测试过程中有很多的业务场景需要进行动态运算或者业务定制化功能开发。如果框架只支持简单数据报文发送、接收以及结果校验,远远无法解决问题,因此需要引入表达式的支持。hrun4j支持 Aviator 和 BeanShell 脚本,使用方法非常简单:${Aviator表达式内容|内置方法},更多用法参考:更多用法这里

丰富的内置属性

内置对象

框架响应数据内置对象有: 1. status_code:Integer 类型,用于存储响应码

  1. headers:Map 类型,用于存储响应头信息
  2. time:Double 类型,用于存储响应时间
  3. body:对象类型,用于存储响应体信息
  4. cookies:Map 类型,用于存储 cookie 信息信息
  5. contentLength:Long 类型,用于存储响应长度

内置方法

框架提供多个内置方法,方法引用方式:${方法名 (方法参数)}:

  1. helloWorld:用于输出 hello,hrun4j
  2. ENV:用于提取.env 文件中某个变量值
  3. BSH:用于执行指定 BSH 脚本并完成赋值的
  4. P:用于读取指定目录下的数据文件

贴心国际化支持

hrun4j支持中英文切换,只需要一个参数即可轻松切换。

  1. CLI 模式下,其中国际化支持可通过 i18n 设置,如果想使用英文,运行时加入--i18n=us 参数即可
  2. POM 模式下设置中英文非常简单,在初始化运行配置时,通过代码设置 i18n 方法参数即可

备注:i18n 全称为 internationalization

使用文档

限于篇幅,该文主要是概览性介绍hrun4j核心知识,如果想对项目深入了解可访问

乐马技术

参与开源共建

-w376
如果入群方式已关闭,框架使用上若有疑问,可先加微信【wytest】(请备注 hrun4j)再入群交流

鸣谢

感谢 DebugTalk(李隆),为行业带来这么优秀的测试框架 HttpRunner。

问答

强烈推荐阅读 《提问的智慧》《如何向开源社区提问题》《如何有效地报告 Bug》《如何向开源项目提交无法解答的问题》,更好的问题更容易获得帮助。

评论列表
乐马技术 发表于 2021年07月16日

已支持 Windows cli 命令支持。
注意:如果出现 java complie null pointer exception,需要配置 java jdk 环境。

徐汪成 发表于 2021年07月16日

接口自动化能否支持多协议接口,多格式的报文混合测试呢?

北京 发表于 2021年07月12日

E:\develop\hrun4japidemo>java -jar hrun4j.jar run --testcase_path apis/get.yml
15:35:01,893 |-INFO in ch.qos.logback.classic.LoggerContext[hrun4j] - Could NOT find resource [logback-test.xml]
15:35:01,893 |-INFO in ch.qos.logback.classic.LoggerContext[hrun4j] - Could NOT find resource [logback.groovy]
15:35:01,893 |-INFO in ch.qos.logback.classic.LoggerContext[hrun4j] - Found resource [logback.xml] at [jar:file:/E:/develop/hrun4japidemo/hrun4j.jar!/logback.xml]
15:35:01,902 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@22f71333 - URL [jar:file:/E:/develop/hrun4japidemo/hrun4j.jar!/logback.xml] is not of type file
15:35:01,930 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
15:35:01,934 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - Setting logger context name as [hrun4j]
15:35:01,935 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
15:35:01,936 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
15:35:01,969 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
15:35:01,969 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE-WITH-COLOR]
15:35:01,970 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
15:35:01,972 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
15:35:01,979 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@328638398 - No compression will be used
15:35:01,980 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@328638398 - Will use the pattern logs/hrun4j.%d.%i.log for the active file
15:35:01,981 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@6aaa5eb0 - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs/hrun4j.%d.%i.log'.
15:35:01,981 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@6aaa5eb0 - Roll-over at midnight.
15:35:01,983 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@6aaa5eb0 - Setting initial period to Mon Jul 12 15:35:01 CST 2021
15:35:01,983 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@6aaa5eb0 - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
15:35:01,983 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@6aaa5eb0 - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
15:35:01,984 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:35:01,985 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: logs/hrun4j.2021-07-12.0.log
15:35:01,985 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [null]
15:35:01,985 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
15:35:01,985 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE-WITH-COLOR] to Logger[ROOT]
15:35:01,986 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
15:35:01,986 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.example.logbackdemo.IndexAction] to INFO
15:35:01,986 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.example.logbackdemo.IndexAction] to false
15:35:01,986 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[com.example.logbackdemo.IndexAction]
15:35:01,986 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
15:35:01,986 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@3498ed - Registering current configuration as safe fallback point

?[33m2021-07-12 15:35:01.994?[0;39m [main] ?[34mINFO ?[0;39m ?[32mvip.lematech.hrun4j.helper.LogHelper?[0;39m - ?[34mRun mode: CLI?[0;39m
?[33m2021-07-12 15:35:02.003?[0;39m [main] ?[34mINFO ?[0;39m ?[32mvip.lematech.hrun4j.helper.LogHelper?[0;39m - ?[34mThe workspace path:E:\develop\hrun4japidemo?[0;39m
?[33m2021-07-12 15:35:02.005?[0;39m [main] ?[31mWARN ?[0;39m ?[32mvip.lematech.hrun4j.helper.LogHelper?[0;39m - ?[31mThe .env file E:\develop\hrun4japidemo.env does not exist?[0;39m
?[33m2021-07-12 15:35:02.010?[0;39m [main] ?[1;31mERROR?[0;39m ?[32mvip.lematech.hrun4j.helper.LogHelper?[0;39m - ?[1;31mThe test case file E:\develop\hrun4japidemo\apis\get.yml does n
ot exist?[0;39m
?[33m2021-07-12 15:35:02.010?[0;39m [main] ?[1;31mERROR?[0;39m ?[32mvip.lematech.hrun4j.helper.LogHelper?[0;39m - ?[1;31mThe test case file E:\develop\hrun4japidemo\apis\get.yml does n
ot exist?[0;39m
Exception in thread "main" vip.lematech.hrun4j.common.DefinedException
at vip.lematech.hrun4j.cli.commands.Run.execute(Run.java:102)
at vip.lematech.hrun4j.Hrun4j.execute(Hrun4j.java:77)
at vip.lematech.hrun4j.Hrun4j.main(Hrun4j.java:90)

看到官网https://www.lematech.vip/docs/react/faq-cn的常见问题举例了这个问题,但是没有依然没有解决这个报错,等待您的回复
POM 模式下载资源路径下找不到用例文件 #
异常报错信息:The file /testcases/getToken.yml was not found under the resources

解决方案: 1. 检查包名是否配置的包名一致 2. 检查 testcases 资源和测试代码路径是否一致 3. 检查文件名是否符合 Java 方法命名规范 4. 检查方法名和文件名是否一致

北京 发表于 2021年07月12日

有个问题向您请教 :
1 windows 设备下载了 hrun4j.jar
2 用脚手架命令 java -jar hrun4j.jar startproject CLI_PROJECT 快速生成了项目
3 cd 进入项目
4 将 hrun4.jar 复制进项目根路径
以上步骤都执行成功,然后执行 命令 java -jar hrun4j.jar run --testcase_path apis/get.yml
提示错误信息截图如下: