困扰
对于程序员来说,尤其是做业务代码比较多程序员,往往出现这样的情况:需求开发周期为5个工作日,开发仅占2天,但测试和联调竟然需要3天。为什么会出现这样的情况呢?我总结有以下几点:
1、开发业务代码往往不会有什么技术难度,就是业务逻辑复杂些罢了,而程序员对业务理解并不总是完全到位。
2、单测和联调也需要协调各方面的环境,往往也需要从头开始造数据。
例如:如果一个大流程有十个步骤,
1)要开发和测试第十一个的时候,前十个步骤就得先走完(别想用数据库里现成的数据),才能测试第十一个。前十个如果每个都用单测来跑,就恐怖了。
2)如果要对,第四个,第七个,第九个步骤进行修改和测试呢?是不是更麻烦些。
3、每启动一次单元测试,需要加载各种配置文件,初始化spring容器,建立各种连接。一个单测跑下来,一分钟差不多就过去了,而大部分时间都用来准备环境了,“干正事”的时间不到10%。
4、每次运行单测都需要修改代码,需要从数据库中找数据,然后复制粘贴。
被这些繁琐、易出错的各种步骤整的烦死了,宝贵的时间都浪费在这上面了,一天下来干不了多少活!
现在对各行业各企业各职业,最重要的都是一点:时间!如果能够短时间高效率把事情做好,一定是具有竞争力的。
思考
上面的问题,哪里可以优化一下吗?
1、能不能只初始化一次spring容器,然后一直可以运行呢?
2、能不能给单测方法,传入参数,不用经常修改代码了呢?
3、能不能把所有的单测类和方法都集成到一个列表或容器中呢?
答案是肯定的。
解决方案的原则
1、最大限度的利用当前的单测方法,对于现存的单测方法,只通过添加注解即可加入包克斯测试。2、spring容器的加载和各种连接的建立只初始化一次,与启动tomcat容器达到的效果相同。
3、单测的类、方法、参数和输出集中管理,统一入口,可以任意多次调用。支持注释标识其功能。
4、使用maven引入jar包,对现有的业务代码不产生入侵。
实现原理
1、根据参数boxTest.contextLoaction,加载业务系统配置spring文件,初始化的spring容器。2、找到单测所在的路径(test-classpath:默认target/test-classes),自定义类加载器加载所有类。
3、把加载进来的通过BeanDefinitionRegistryPostProcessor包装成RootBeanDefinition,并注册到容器中。
4、启动TestItemCollector从spring容器收集所有@BoxTest的类和@BoxMethod方法,缓存起来
5、调用MethodBox的start方法绘制窗口,把单测类和方法都设置到下拉菜单中
6、操作时,选定单测类、方法和填写参数(如果需要)之后,点击执行会使用反射调用相应类的方法。此时控制台的输出会被劫持到窗口的输出文本域中,做到”一站式服务“。
提问
1、junit单测方法是不可以传参的,如果给方法写上了参数,用作包克斯测试(@BoxTest),是否还能继续用单测(@Test)呢?
答:不能用,想兼容可以写个重载方法,传进去就是了,反正每次单测总是要改代码的。
2、包克斯测试,可以节省多少时间?
答:包克斯测试最好都用原来的单测方法,这样就不要重复的写了。用熟了可以节省80%以上的时间
学到了什么?
1、spring可以自己定义类加载,BeanDefinitionRegistryPostProcessor就是干这个的
2、使用maven编译,target/classes是classpath,target/test-classes是test-classpath,后者可以引用前者的类,反过来不行。
3、一切问题总有变通的方案,就看看咱们愿不愿意花时间和精力了。
后期改进方向
1、支持SpringBoot 自动化配置
2、更改启动方式,用更合理的方式启动Boostrap类
3、界面操作功能优化,提高操作效率,减少误操作
备注:本文根据前面的博文改造而来,改进之处为可配置化更强,可移植性更好。
见:https://blog.youkuaiyun.com/salerzhang/article/details/80079300
包克斯测试,代码见:https://code.aliyun.com/xinfei0804/boxTest.git