参见原文:http://junit.sourceforge.net/doc/cookstour/cookstour.htm
我在这里写一点学习心得,这篇不是翻译。
JUnit是一个设计良好的测试框架,学习的过程让我再次感受到模式所带来的好处。
Command
JUnit适合给开发人员做单元测试(白盒子),这也是JUnit的目标。一个单元测试用例可以代表一个测试步骤,具有原子性的特点。在开发过程中,我们常常把这样的用例封装成一个类,实例化后就代表了一个单元实体。这样做的好处就是让一个测试用例独立出来而不受其他逻辑干扰(我发现这样的想法在现实生活中也是非常合理的)。
Command模式很好的解决了这个问题。对于一个测试用例来说,它可以看成是一个执行体(说白了就是做事步骤)。Command建议将这样具有多个而类似的执行体封装执行类,并遵守一定的规范(Interface)。看下图:
java 代码
- public abstract class TestCase implements Test {
- private final String fName;
-
- public TestCase(String name) {
- fName= name;
- }
-
- public abstract void run();
- …
- }
TestCase代表一个Command模板,它被设计成abstract,需要在实际运用中继承它,实现run()。
Template Mothod
有了TestCase还不行,从源码来看,执行测试的逻辑交给run()是远远不够的,因为实际情况复杂的多。在实践过程中,我认为这样一个测试用例是比较合理的:建立一个测试对象->测试它->清除这个测试对象。这三个步骤应该是连续的(它应该理解为一个测试用例而不是三个)。对大多数测试来说这个用例模板是适用的(哦,终于可以用模板这个词了)。
扯了半天终于可以把Template Method模式带出来了,先来看看它的简介:
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
在这个模式中,run()定义了算法(如下面代码),而具体的算法实现则交给子类处理。这样做的好处是,你在写测试用例的时候不必再关注框架的算法了,只需要关注测试内容。
java 代码
- public void run() {
- setUp();
- runTest();
- tearDown();
- }
-
- protected abstract void setUp();
- protected abstract void runTest();
- protected abstract void tearDown();
Collecting Parameter
Collecting Parameter不是GoF所涉及的模式类型。它的作用呢,还是先看看原文好了:
It suggests that when you need to collect results over several methods, you should add a parameter to the method and pass an object that will collect the results for you.
为了收集测试结果(别告诉我不需要啊),定义一个收集器当作参数传给run(),看看源码:
java 代码
- public void run(TestResult result) {
- result.startTest(this);
- setUp();
- try {
- runTest();
- }
- catch (AssertionFailedError e) {
- result.addFailure(this, e);
- }
-
- catch (Throwable e) {
- result.addError(this, e);
- }
- finally {
- tearDown();
- }
- }
TestResult就充当一个测试结果收集器。
我觉得这样做有如下一些好处:
- 隐藏了测试收集的逻辑:对于开发者来说,测试逻辑才是主题。
- 如果TestResult设计成单例,则能将测试结果集中处理,最大限度的重用代码。
(忙活了两天,差点忘了。今天是圣诞)
Adapter And Pluggable Selector
回到先前的Command模式。每个Command代表一个TestCase类,而实际情况是,每个TestCase会有多个测试方法(想象一下,如果一些测试方法使用的是同一个测试对象,那么些多个TestCase就显得很浪费了)。测试的某一时间段内,我们只用一个测试方法。JUnit提供了两个模式来实现--Adapter And Pluggable Selector(我一直觉得这两个方法差不多)。下面介绍Pluggable Selector,Pluggable Selector就是在实例化的时候给定一个参数,比如某个测试方法的字符串名称,这样在实例化TestCase的时候就知道要运行什么测试方法了(用反射就能做到)。看代码
java 代码
- public simpleTest(String testMethodName)
- {
- fName = testMethodName;
- }
-
- protected void runTest() throws Throwable {
- Method runMethod= null;
- try {
- runMethod= getClass().getMethod(fName, new Class[0]);
- } catch (NoSuchMethodException e) {
- assertTrue("Method \""+fName+"\" not found", false);
- }
- try {
- runMethod.invoke(this, new Class[0]);
- }
-
- }
这个模式跟Adapter非常的相似。每次测试的时候,只要指定参数,就能实例化出不同特性的TestCase。
Composite
下面就该看到有多个TestCase的情况了。对于这种情况,使用者希望有跟TestCase一致的处理方式。该Composite登场啦。比较简单,就不啰嗦了。
分享到:
相关推荐
其次,JUnit运用了“装饰者模式”(Decorator Pattern)。这种模式允许在运行时向对象添加新的行为或责任,例如`TestWatcher`就是一个装饰器,它可以在测试开始前和结束后执行特定操作,如记录测试日志,而无需改变...
《Junit设计模式应用》是基于作者业余时间的翻译成果,旨在通过设计模式的角度深入剖析JUnit的内在原理,以此促进读者对单元测试框架理解和运用能力的提升。设计模式是软件工程中的宝贵经验总结,它为解决常见问题...
这些模式的运用使得JUnit具有高度的可扩展性和可维护性。 【关键人物】 - Kent Beck:他是极限编程(XP)的创始人,倡导测试优先的编程模式,以及CRC卡片和xUnit测试框架的使用。他的著作如《Extreme Programming ...
总之,JUnit的成功在于其灵活且强大的设计,它巧妙地运用了多种设计模式,使得测试编写变得简单而富有弹性。对于任何Java开发者来说,理解和掌握JUnit框架及其设计模式是提高工作效率和代码质量的重要一环。
1. 工厂模式:在JUnit中,`TestSuite`类运用了工厂模式,它可以根据传入的类或测试用例动态创建测试集。这种模式允许我们灵活地组合和运行不同的测试,提高测试的可扩展性和复用性。 2. 单例模式:JUnit的`Test...
5. 装饰者模式:JUnit通过断言类(如Assert)实现了装饰者模式,允许在不改变原有接口的情况下添加新的功能或改变现有行为。例如,JUnit5引入了assertAll()方法,它允许在一个断言中检查多个条件。 6. 抽象工厂模式...
JUnit是Java编程语言中广泛使用的单元测试框架,它为开发者提供了编写可重复执行、易于维护的测试用例的工具。这个框架的诞生得益于Erich ...了解并熟练运用这些模式可以帮助开发者更高效地利用JUnit进行软件质量保证。
JUnit,作为Java编程语言中广泛使用的单元测试框架,巧妙地运用了多种设计模式来实现其功能。本文将深入探讨JUnit中应用到的两种主要设计模式:适配器模式和命令模式。 首先,适配器模式在JUnit中的应用主要体现在...
本书对此提供了实用的解决方案,指导读者如何在这些复杂场景下有效地运用JUnit,确保测试的可靠性和准确性。 通过阅读《JUnit in Action 中文版》,读者不仅可以提升在JUnit上的技能,还能进一步理解测试的重要性,...
JUnit是一个开源的测试框架,它遵循xUnit测试模式,支持编写和执行针对Java类的方法级别的测试。在JUnit 4.7.0版本中,引入了许多新特性,如注解(Annotations)、测试套件(Test Suites)和参数化测试...
总的来说,通过对"junit-4.8.2.jar"包的学习,我们可以深入理解单元测试的重要性,以及如何在实际项目中有效地运用设计模式来构建可扩展和易维护的测试框架。此外,它还为我们提供了学习Java新特性和设计模式的实践...
JUnit是Java编程语言中最常用的单元测试框架之一,它为开发者提供了编写和运行可重复测试的便利工具。在本文中,我们将深入探讨JUnit的...在实际项目中,熟练运用JUnit将极大地提升团队的开发效率和软件产品的质量。
《Junit实战第二版》是一本专注于Java编程领域中单元测试技术的专业指南,它详尽地阐述了如何利用Junit框架进行...通过学习这本书,你将能够熟练运用Junit进行有效的单元测试,从而打造出更加健壮、可靠的软件系统。
《JUnit in Action中文版》是一本深入探讨Java单元测试框架JUnit的专业书籍,旨在帮助开发者熟练掌握使用JUnit...通过学习本书,你将能够更加高效地运用JUnit进行单元测试,确保代码质量,为项目的成功奠定坚实基础。
通过理解和熟练运用这些JUnit4特性,你可以构建出一套健壮且易于维护的单元测试体系,提高软件开发的质量和效率。阅读《单元测试利器JUnit4.pdf》文档将更深入地理解这些概念,并提供实践指导。
### JUnit单元测试使用方法详解 #### 一、JUnit简介及意义 JUnit 是一个流行的 Java 编程语言的单元测试框架。它最初由 Erich Gamma 和...在实际项目开发中合理运用 JUnit,可以帮助提高代码质量,减少后期维护成本。
10. **最佳实践与实战案例**:书中会提供许多实际项目中的测试场景,展示如何运用JUnit的最佳实践来编写高效、可靠的测试代码。 通过《JUnit+Recipes中文版》的学习,读者不仅能掌握JUnit的基本用法,还能深入了解...
JUnit是Java编程语言中最常用的单元测试框架之一,用于编写和运行可重复的自动化测试用例。...通过理解并熟练运用这些资源,开发者能够更好地进行测试驱动开发(TDD),确保代码的质量和可维护性。