在上一篇文章中,我们通过TestRunner调用核心模型来整理调用核心模型的过程。
本文是“如何读取源代码”主题的第十一个。我们可以回答在梳理过程中遇到的一些问题,并考虑为什么这样的设计。
在上一篇文章中,我们提出了一些问题:
在本节中回答这些问题。
实际上,如果您熟悉设计模式,则应该能够立即识别它。语句实现命令模式。
首先,ChildrenVoker方法(请参见下图)直接构建一个匿名实现语句类别,以在执行类中包装所有条件测试方法。
然后通过IF判断中的四个方法添加其他执行逻辑。
仅限于长度,我们仅查看第一个with bebeforeclasses方法。从这个名称看,我们应该能够猜测这种方法来处理被Beforeclass注释的方法。
在查看其实施之前,我们可以考虑一下,如果我们要实现它?我们应该如何实现它?还是可以改变方式,有什么方法可以确保在另一种方法之前执行一种方法?您是否有有什么想法吗?(在低头之前,最好自己考虑一下)
例如,我们可以使用语句包装类,即装饰模式。在执行此语句之前,请先执行beforeclass;或者,我们还可以使用组合模式来构建父亲陈述,贝福克拉斯(Beforeclass)和原始陈述为叶子节点,但请注意此处的顺序。
现在让我们看一下Junit的实现方式?
首先,通过testClass对象通过getAnnotatedMethods方法找到所有beforeclass注释。如果没有相应的注释方法,请直接返回原始语句,否则构建runbefores对象返回。显然,这个runbefores也是陈述的子类。
让我们看看如何实现此RunBefores类,以确保首先在测试方法中执行BeforeClass注释方法。
请注意评估方法,首先穿越执行Beforeclass注释的方法,然后执行测试方法语句对象的评估方法。
显然,这里使用了装饰模式。
装饰模式:动态添加一些额外的责任
换句话说,Junit通过装饰模式动态地向测试方法添加了其他职责。我相信其他方法不需要查看它,您可能知道它是如何实现的?
RunnoTifier的实现更加明显:观察者模型!
观察者模式:定义对象之间的一个-to -to -to -to -many依赖关系。当对象的状态更改时,所有依赖于其的对象都会通知并自动更新。
观察者模式的作用是去耦测试的执行和测试结果。LET看一下Junit的工作方式。
让我们遵循上述ChildrenInvoker方法进行鄙视,并在ChildrenInvoker中发表声明,该声明实际上称为parentrunner中的runchildren方法。
您为什么使用线程在此处执行?实际上,原因很简单。在此处执行测试方法。每种测试方法之间没有关系,因此线程的使用可以提高测试的执行效率。
注意:尽管每种测试方法都是独立的,但结果是公开的,并且在这里涉及竞争。Junit保证线程安全如何将其留在这里以在源代码中找到答案。启动,首先了解CopyOnwritearRaylist listrist
线程方法由Runchild方法执行,这是一个抽象方法,该方法由subClass实施。它有两个实现类,一个是BlockJunit4ClassRunner类,另一个是Suite类。显然,套件用于执行一批测试方法。这种关系是组合模式的例程!组合模式绝对是在套件和blockjunit4classrunner之间使用的。如果您不相信它,您可以自己验证它,并且可以自己验证它,并且您不会在这里解决。
让我们看一下BlockJunit4Classrunner的Runchild方法。
请注意,MethodBlock方法是考虑上面的ClassBlock方法。你能猜到这里的逻辑吗?
最后,Runleaf方法,即最终执行方法,让我们看看Notifier做了什么工作。
这等同于监视语句执行的开始,结束和错误报告阶段,并调用不同的方法。这些方法最终将其委托给了testListener注册到testNotifier。例如,AddFailure方法,TestListener的最后一个调用方法。
现在,我们只看了哪些类已继承了TSTListener类,我们可以知道测试结果已处理了什么。(稍后,整个执行过程将以串联连接))
我们以最简单的文本列表为例。
可以看出,这里只是将其输出到命令行。
如果您需要其他结果处理方法,则只需要编写类即可实现TestListener类。
我们依次考虑。如果您不使用侦听器模式,那么在此处进行测试执行和结果处理是否没有可扩展性?
在本文中,为了回答上面提出的问题,我们整理了核心代码过程,并理解了为什么这样设计的问题,以及如果不设计它会带来什么问题。
同时,您还应该体验到熟悉设计模式可以极大地提高阅读源代码的效率。请您不了解设计模式,您需要首先放弃班级之间的关系,例如上面的Runnotifier和testListener,然后考虑一下为什么设计它,您可以在Internet上找到信息以确认两者之间的关系。了解观察者模式。当您再次看到类似的结构时,您可以快速阐明逻辑。
在下面,我们将结合弹簧以整理Junit的跑步者,以完成整个测试过程的最后一部分。
原始:https://juejin.cn/post/7097413444494957599