需求

需求如这里所描述的:https://www.yuque.com/liueleven/oddxi4/iyp3d0

代码仓库:https://github.com/liueleven/lite-junit

功能细分

通过继承指定的类来检测哪些类是可能需要执行单元测试的,通过指定的方法命名规则(test*)来判断该方法是需要执行单元测试的。

和 JUnit 一样,需要支持 setUp 和 tearDown 功能。

还需要提供 JUnit 一样的断言工具类。

设计细分

执行入口

在 TestCaseStater 中,声明一个 start 方法,需要传入测试类的路径,来扫描包下的类,它是单元测试启动的入口:

  1. public void run(Class cls) {
  2. // todo
  3. }

扫描规则

需要定义一套规则,来判断哪些类方法是需要测试的,在 cn.liueleven.junit.core.rule 路径下,作为一个工具类框架,并且考虑到后面的扩展,这个规则需要可扩展,对于日后新增规则的感知很弱,不会引起代码太大的改动。

定义一个规则接口,里面有一个规则执行方法,一个规则名称key,用来标识规则:

  1. public interface Rule {
  2. String getRuleName();
  3. void execute(Object info);
  4. }
  5. public class RulePipeline {
  6. private Map<String,Rule> ruleMap;
  7. // todo 执行
  8. }

测试类信息收集

通过这个方法,我们去扫描 TestCase 的所有子类,每扫描到一个子类,需要将它的类元数据保存起来,所以要定一个模型 ClassMetaData 来存储类元数据信息,同理也要建一个 MethodMetaData 存储方法元数据信息。这个类类似 BeanDefintion。

  1. public class ClassMetaData {
  2. private String className;
  3. private Map<String,MethodMetaData> methodMap;
  4. // json 格式,用于扩展预留
  5. private String extInfo;
  6. // ignore getter setter
  7. }
  8. public class MethodMetaData {
  9. private String methodName;
  10. private Object outputParam;
  11. private List<Object> inputParam;
  12. // json 格式,用于扩展预留
  13. private String extInfo;
  14. // ignore getter setter
  15. }

hook 处理

用来处理当前类上下文信息,直接用模板方法模式,就可以了。

断言工具

cn.liueleven.junit.unit 路径下添加断言工具。

测试数据

idea 集成了 Junit 框架,一般都可以生成测试报告,例如多少失败,多少成功,行覆盖率等等,我们也需要设计一下,统计执行多少个类,多少个方法,成功失败等数据信息