多层或者额外的中间层永远是解决软件设计中的一个有效手段,可以有效的实现隔离变化,内部封装的功能。
当前参与的一个项目就是这样的一个多层的软件架构,这并不是指MVC的多层,因为这个软件并没有V,也可以说没有M,只有C,而这个C在设计中也是多层分级的。
每一层我们可以简单的定义为一个模块,每一个模块都有其对应的测试模块.
对这个项目的痛点是单次测试的时间要很长,一般需要2~3个小时才能运行完,在某些设备上,需要7~8个小时。而且这是一个一旦有问题,可能是会导致进不了系统的软件。
问题就归结于:如何在保证可靠性的情况下,更有效的测试?
解决的思路,与上篇的智能编译(smart build)类似,同样检测每次commit的change log文件,解析得出哪些模块的更改,根据这些被改动模块的相互依赖性,可以得出需要运行的测试模块。这里面的一个特别之处是,一旦有一个底层模块的改动,所有上层模块都需要被测试。这有点违背通常的认识,只要保证本模块对外接口的准确性,上层模块不需要再被测试。请参考本项目的第二个痛点,潜台词就是这是一个和操作系统紧密相关的软件,而操作系统的源码?对不起,黑盒子。
而这个解决方案中,有三个需要前置解决的因素,1), change log file的获得,请参考上篇。 2),预定义的模块依赖性,请问软件的开发人员或架构师。 3)模块和change log的对应性,请详细比较各模块在SVN中的文件目录。
这个解决法案带来的一个效果,就是在保证有效性的情况下,可以大大缩短整个的测试时间,给每一个的commit以尽快的feedback。
因为在这样一个特殊的软件中,不能轻视每一个commit,因为每一个commit的潜在破坏性极大,查找regression的代价极大。