墨测,全自动化接口测试平台

1. 自动化测试面临的挑战

在软件开发周期中,测试是保障产品质量至关重要的一环,但也是往往容易被忽视的一环,测试的工期置后、重复回归执行等各种因素都影响着测试的效率,影响着高质量的产品发布。

自动化测试被认为是提高测试质量和效率的法宝,通过自动化测试平台,可以实现用例的编写、数据的准备、测试执行、结果验证,将测试工作通过脚本的方式重复执行,但是仅仅如此是不够的,测试还面临着如下的挑战,

  1. 用例的编写:测试在软件开发周期中,由于处于项目排期偏后,经常导致测试只有时间来了解新功能,却没有足够的时间来写自动化用例脚本,工期紧,自动化只能等下一次排期,进而一拖再拖。
  2. 用例的维护:软件产品的功能繁多、变化频繁,用例不是写一次就结束,用例的维护也需要花费测试人员相当多的时间,即使对一个资深软件测试工程师,也难以记住所有需要测试的功能接口,上个月刚测完的功能接口,本月再看,估计又需要大半天来上手的时间。
  3. 问题的定位:在微服务系统中,一不小心就会拆分出上百个应用,每个功能接口涉及的应用多、调用链路长。自动化测试跑完后,需要对失败的用例进行查看,其到底是不是软件bug?是用例的数据问题、或环境应用部署问题?面对失败的用例一个个调查时,查看运行日志,有时候还得需要开发人员的加入,一起来定位问题。自动化测试执行容易,用例失败问题定位困难重重。
  4. 环境的稳定性:测试环境本身就是不稳定的,每天需要测试的产品部署配置频繁,加上团队对测试环境的共享,会造成很多由于测试环境的不稳定导致的无效测试,很多时候等到测试到一半的时候,才发现环境不对。

一个统计Git代码仓库签入代码行数的批量统计脚本

图片来自pixabay.com的hansbenn会员

本文介绍一个统计Git代码仓库签入代码行数的批量统计脚本。

1. 单个Git代码仓库

对单个Git代码仓库,按提交者进行归类统计代码提交行数。

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --numstat --author="$name" | awk 'BEGIN{add=0;subs=0;loc=0} {if($1~/^[0-9]+/){add += $1; subs += $2; loc += $1 + $2 }} END {printf "%s\t%s\t%s\n", add, subs, loc }'; done;

请cd到指定代码仓库目录下,然后运行上面的命令,可以看到如下输出,

peipeihh    13594   275 13869

每列的数字意义如下,

  1. 第一列:代码提交人
  2. 第二列:提交的新增代码行数
  3. 第三列:提交的删除代码行数
  4. 第四列:所有提交的代码行数

Java Agent中使用fastjson导致宿主应用出现找不到类的异常问题

图片来自pixabay.com的designerpoint会员

fastjson是一个目前应用广泛、高性能的Java JSON开发类库,本文记录一个在Java Agent中由于引用了fastjson,进而导致宿主应用(sprint boot)在启动过程中出现找不到类的问题。

1. 问题现象

最近在进行Java Agent的相关开发工作,某天发现在其中一个spring boot应用中报如下异常(在对宿主应用加载了Java Agent情况下),

[main] ERROR org.springframework.boot.SpringApplication 858 | Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testHttpController': Unsatisfied dependency expressed through field 'xxxHttpClientManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxHttpClientManager' defined in URL [jar:file:/xxx/xxxHttpClientManager.class]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/http/converter/GenericHttpMessageConverter

Caused by: java.lang.NoClassDefFoundError: org/springframework/http/converter/GenericHttpMessageConverter
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.xxx.http.client.xxxHttpClientManager.<>(xxxHttpClientManager.java:63)

若不加载Java Agent,单独启动Spring Boot应用则能够正常运行,只要加载Java Agent就会报如上错误,除此之外,日志中并无其它的特别错误报告。

通过上述日志,分析相关代码,获悉到如下的执行顺序,

  1. Spring Boot应用启动。
  2. Spring Boot应用通过BeanInitializer (spring web 5.1.x)尝试初始化Bean。
  3. Spring Boot应用注入 @Autowired testHttpController。
  4. Spring Boot应用注入 @Autowired xxxHttpClientManager。
  5. 在xxxHttpClientManager中有执行new FastJsonHttpMessageConverter,这个类来自fastjson版本1.2.x。