1.背景
最近公司自动化测试报告准备修改, 看到了开源Allure报告不错, 整个项目修改使用, 使用中研究修改Allure源码, 发现了以前没研究过的一个东西, 虽然用到的地方很多, 就是SPI机制, java中需要学习的地方真的很多啊
2.概念原理
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件;
Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制;
就是一个接口, 具体实现谁都可以写, 只要遵循我这个加载的固定写法就行, 这也就是Allure为什么, 不需要任何的单独加载引入具体方法, 只要在pom中把allure-java包依赖写入, 通过SPI机制, Allure实现注册了testng等测试套件的Listener方法, 所以就实现了无缝的报告插件, 可谓巧妙;
常见例子: JDBC, SLF4J等
3.SPI规则约束
-
当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
-
接口实现类所在的jar包放在主程序的classpath中;
-
主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;
-
SPI的实现类必须携带一个不带参数的构造方法;
4.Allure中具体实现
io.qameta.allure.testng.AllureTestNg 就是Allure实现的入口类, 通过这个实现具体的报告记录细节
org.testng.ITestNGListener 就是listener, 不同的测试框架有不同的, 比如最常见的junit的, 只要能提供入口的框架 , 理论上都可以allure
