java

位置:IT落伍者 >> java >> 浏览文章

Junit4功能介绍


发布日期:2022年09月11日
 
Junit4功能介绍

JUnit 是JAVA语言事实上的标准测试库JUnit 是三年以来最具里程碑意义的一次发布它的新特性主要是针对JAVA中的标记(annotation)来简化测试而不是利用子类反射或命名机制本文将讲述如何使用JUnit 当前前提是你最好具有JUnit的使用经验.

JUnit 由Kent Beck 和 Erich Gamma开发几乎是JAVA开发最重要的第三方工具正如Martin Fowler 所说在软件开发领域从来就没有如此少的代码起到了如此重要的作用由于JUnitJAVA代码变得更健壮更可靠BUG也比以前更少由于JUnit (由Smalltalks的SUnit得来) 的出现随后产生了许多xUnit的测试工具如nUnit (NET) pyUnit (Python) CppUnit (C++) dUnit (Delphi) 和其它不同平台及语言的测试相关的工具

虽然JUnit也只是一个工具但其产生的思想和技术却较其架构更意义重大单元测试测试先行的编程方式测试驱动的开发方式并非必须由JUNIT实现也不一定要用SWing实现GUI界面JUNIT最近的一次更新是在三年前但它比其它大多数有BUG的框架都要健壮更重要的是JAVA一直在改进现在JAVA支持泛型枚举可变长度参数以及标记语言(开创了开发可重用框架的新局面)

JUnits的停滞不前使得那些想要变革的开发人员换其它测试工具.挑战者有Bill Venners的Artima SuiteRunner和Cedric Beust的TestNG.这些工具库虽然有值得推荐的功能但没有任何一款的地位能与JUNIT相比没有任何一款工具被其它业界产品如Ant Maven Eclipse广泛支持.因此Beck 和Gamma双开始利用JAVA的新特性来开发新版的JUNIT目的是利用JAVA中的标记特性使得单元测试开发更容易Beck说JUNIT的主要目的是通过简化JUNIT的使用鼓励更多的开发人员写更多的测试虽然会与以前的版本兼容但JUNIT与从JUNIT就开始的版本相比会有一个非常大的变化.

注意: 修改基本框架是一把双刃剑虽然JUNIT的目的是清晰的但细节仍有许多不同因此本文只是一个简单的介绍并不是最终文档.

测试方法

以前所有版本的JUNIT都使用命名机制和反射来定位测试下面的代码测试+=

import junitframeworkTestCase; public class AdditionTest extends TestCase { private int x = ; private int y = ; public void testAddition() { int z = x + y; assertEquals( z); } }

而在JUNIT 测试方法由 @Test 标记说明如下

import orgjunitTest; import junitframeworkTestCase; public class AdditionTest extends TestCase { private int x = ; private int y = ; @Test public void testAddition() { int z = x + y; assertEquals( z); } }
使用标记的好处是你不用将所有测试方法命名为 testFoo() testBar()等等以test\开头的方法下面的方法也同样可以工作 import orgjunitTest; import junitframeworkTestCase; public class AdditionTest extends TestCase { private int x = ; private int y = ; @Test public void additionTest() { int z = x + y; assertEquals( z); } }

下面的代码也同样正确

import orgjunitTest; import junitframeworkTestCase; public class AdditionTest extends TestCase { private int x = ; private int y = ; @Test public void addition() { int z = x + y; assertEquals( z); } }

这种命名机制最大的优点是更适合你的待测试类或方法名称例如你可以使用ntains()测试 ntains() ;使用ListTestaddAll()测试 Listadd()等等.

TestCase 还可以继续使用但你没有必须再扩展为子类只要你声明了@Test你可以将测试方法放在任何类中当然如要访问assert等方法你必须要引用junitAssert类如下

import orgjunitAssert; public class AdditionTest { private int x = ; private int y = ; @Test public void addition() { int z = x + y; AssertassertEquals( z); } }

你也可以使用JDK中的新特性(static import)使得跟以前版本一样简单

import static orgjunitAssertassertEquals; public class AdditionTest { private int x = ; private int y = ; @Test public void addition() { int z = x + y; assertEquals( z); } }

这种方法测试受保护的方法非常容易因为你可以在测试类中继承有受保护方法的类.

SetUp 和TearDown

JUnit 中 test runners 会在每个测试之前自动调用 setUp()方法此方法主要用于初始化变量打开日志重置环境变量等下面是XOMs XSLTransformTest中的 setUp()方法

protected void setUp() { SystemsetErr(new PrintStream(new ByteArrayOutputStream())); inputDir = new File(data); inputDir = new File(inputDir xslt); inputDir = new File(inputDir input); }

在JUnit 你仍然可以在每个测试前初始化变量和配置环境然而这些操作可以不用在Setup()中完成你可以在初始化方法前面添加 @Beforer 来表示如下

@Before protected void initialize() { SystemsetErr(new PrintStream(new ByteArrayOutputStream())); inputDir = new File(data); inputDir = new File(inputDir xslt); inputDir = new File(inputDir input); }

你也可以有多个方法标记有@Before所有方法都会在每个测试之前执行

@Before protected void findTestDataDirectory() { inputDir = new File(data); inputDir = new File(inputDir xslt); inputDir = new File(inputDir input); } @Before protected void redirectStderr() { SystemsetErr(new PrintStream(new ByteArrayOutputStream())); }

清除环境与JUNIT 差不多在JUNIT中使用 tearDown()方法下面的代码是结束测试时回收内存

protected void tearDown() { doc = null; Systemgc(); }

在JUnit 你还可以使用 @After 标记来说明

@After protected void disposeDocument() { doc = null; Systemgc(); }

与 @Before一样你也可以有多个标记有 @After的清除方法每个都会在执行完每个测试后执行

最后你不需要在父类中明确调用这些初始化或清除方法.test runner会自动调用这些标记的方法.子类中的@Before方法在父类的@Before方法之后执行(这与构造函数的执行顺序一样)而@After方法刚好相反子类中的@After方法先执行.然而多个@Before和@After方法的执行顺序就是未知的.

上一篇:Nhibernate与代码生成器介绍

下一篇:Spring MVC 框架方法入参的介绍