??xml version="1.0" encoding="utf-8" standalone="yes"?>91在线观看视频,免费精品99久久国产综合精品,一区二区三区在线不卡http://www.aygfsteel.com/run2u/category/26927.htmlzh-cnMon, 29 Oct 2007 12:43:15 GMTMon, 29 Oct 2007 12:43:15 GMT60JUnit 4 抢先?/title><link>http://www.aygfsteel.com/run2u/archive/2007/10/29/156712.html</link><dc:creator>I杯</dc:creator><author>I杯</author><pubDate>Mon, 29 Oct 2007 08:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/run2u/archive/2007/10/29/156712.html</guid><wfw:comment>http://www.aygfsteel.com/run2u/comments/156712.html</wfw:comment><comments>http://www.aygfsteel.com/run2u/archive/2007/10/29/156712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/run2u/comments/commentRss/156712.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/run2u/services/trackbacks/156712.html</trackback:ping><description><![CDATA[from: http://www.ibm.com/developerworks/cn/java/j-junit4.html<br /> <br /> <p>JUnit ?Kent Beck ?Erich Gamma 开发,几乎毫无疑问是迄今所开发的最重要的第三方 Java 库。正?Martin Fowler 所_“在Y件开发领域,从来没有如此少的代码vC如此重要的作?#8221;。JUnit 引导q促q了试的盛行。由?JUnitQJava 代码变得更健壮,更可靠,bug 也比以前更少。JUnitQ它本n的灵感来?Smalltalk ?SUnitQ衍生了许多 xUnit 工具Q将单元试的优势应用于各种语言。nUnit (.NET)、pyUnit (Python)、CppUnit (C++)、dUnit (Delphi) 以及其他工具Q媄响了各种q_和语a上的E序员的试工作?/p> <p>然而,JUnit 仅仅是一个工兯已。真正的优势来自?JUnit 所采用的思想和技术,而不是框架本w。单元测试、测试先行的~程和测试驱动的开发ƈ非都要在 JUnit 中实玎ͼM比较 GUI 的编E都必须?Swing 来完成。JUnit 本n的最后一ơ更新差不多是三q以前了。尽它被证明比大多数框架更健壮、更持久Q但是也发现?bugQ而更重要的是QJava 不断在发展。Java 语言现在支持泛型、枚举、可变长度参数列表和注释Q这些特性ؓ可重用的框架设计带来了新的可能?/p> <p>JUnit 的停滞不前ƈ没有被那些想要废弃它的程序员所打|。挑战者包?Bill Venners ?Artima SuiteRunner 以及 Cedric Beust ?TestNG {。这些库有一些可圈可点的Ҏ,但是都没有达?JUnit 的知名度和市场占有䆾额。它们都没有在诸?Ant、Maven ?Eclipse 之类的品中hq泛的开即用支持。所?Beck ?Gamma 着手开发了一个新版本?JUnitQ它利用 Java 5 的新Ҏ(其是注释)的优势,使得单元试比v用最初的 JUnit 来说更加单。用 Beck 的话来说Q?#8220;JUnit 4 的主题是通过q一步简?JUnitQ鼓励更多的开发h员编写更多的试?#8221;JUnit 4 管保持了与现有 JUnit 3.8 试套g的向后兼容,但是它仍然承诺是?JUnit 1.0 以来 Java 单元试斚w最重大的改q?/p> <p><strong>注意Q?/strong>该框架的改进是相当前沿的。尽?JUnit 4 的大轮廓很清晎ͼ但是其细节仍然可以改变。这意味着本文是对 JUnit 4 抢先看,而不是它的最l效果?/p> <p><a name="N10088"><span id="wmqeeuq" class="atitle">试Ҏ</span></a></p> <p>以前所有版本的 JUnit 都用命名约定和反射来定位测试。例如,下面的代码测?1+1 {于 2Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import junit.framework.TestCase; public class AdditionTest extends TestCase { private int x = 1; private int y = 1; public void testAddition() { int z = x + y; assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>而在 JUnit 4 中,试是由 <code>@Test</code> 注释来识别的Q如下所C:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import org.junit.Test; import junit.framework.TestCase; public class AdditionTest extends TestCase { private int x = 1; private int y = 1; @Test public void testAddition() { int z = x + y; assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>使用注释的优Ҏ不再需要将所有的Ҏ命名?<code>testFoo()</code>?code>testBar()</code>Q等{。例如,下面的方法也可以工作Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import org.junit.Test; import junit.framework.TestCase; public class AdditionTest extends TestCase { private int x = 1; private int y = 1; @Test public void additionTest() { int z = x + y; assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>下面q个Ҏ也同栯够工作:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import org.junit.Test; import junit.framework.TestCase; public class AdditionTest extends TestCase { private int x = 1; private int y = 1; @Test public void addition() { int z = x + y; assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>q允许您遵@最适合您的应用E序的命名约定。例如,我介l的一些例子采用的U定是,试cd其测试方法用与被测试的cȝ同的名称。例如,<code>List.contains()</code> ?<code>ListTest.contains()</code> 试Q?code>List.add()</code> ?<code>ListTest.addAll()</code> 试Q等{?/p> <p><code>TestCase</code> cM然可以工作,但是您不再需要扩展它了。只要您?<code>@Test</code> 来注释测试方法,可以将试Ҏ攑ֈMcM。但是您需要导?<code>junit.Assert</code> cM讉K各种 assert ҎQ如下所C:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import org.junit.Assert; public class AdditionTest { private int x = 1; private int y = 1; @Test public void addition() { int z = x + y; Assert.assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>您也可以使用 JDK 5 中新Ҏ(static importQ,使得与以前版本一L单:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">import static org.junit.Assert.assertEquals; public class AdditionTest { private int x = 1; private int y = 1; @Test public void addition() { int z = x + y; assertEquals(2, z); } }</pre> </td> </tr> </tbody> </table> <br /> <p>q种Ҏ使得试受保护的Ҏ非常ҎQ因为测试案例类现在可以扩展包含受保护方法的cM?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N100E6"><span id="wmqeeuq" class="atitle">SetUp ?TearDown</span></a></p> <p>JUnit 3 试q行E序Qtest runnerQ会在运行每个测试之前自动调?<code>setUp()</code> Ҏ。该Ҏ一般会初始化字D,打开日志记录Q重|环境变量,{等。例如,下面是摘?XOM ?<code>XSLTransformTest</code> 中的 <code>setUp()</code> ҎQ?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">protected void setUp() { System.setErr(new PrintStream(new ByteArrayOutputStream())); inputDir = new File("data"); inputDir = new File(inputDir, "xslt"); inputDir = new File(inputDir, "input"); }</pre> </td> </tr> </tbody> </table> <br /> <p>?JUnit 4 中,您仍然可以在每个试Ҏq行之前初始化字D和配置环境。然而,完成q些操作的方法不再需要叫?<code>setUp()</code>Q只要用 <code>@Before</code> 注释来指C即可,如下所C: </p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@Before protected void initialize() { System.setErr(new PrintStream(new ByteArrayOutputStream())); inputDir = new File("data"); inputDir = new File(inputDir, "xslt"); inputDir = new File(inputDir, "input"); }</pre> </td> </tr> </tbody> </table> <br /> <p>甚至可以?<code>@Before</code> 来注释多个方法,q些Ҏ都在每个试之前q行Q?</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@Before protected void findTestDataDirectory() { inputDir = new File("data"); inputDir = new File(inputDir, "xslt"); inputDir = new File(inputDir, "input"); } @Before protected void redirectStderr() { System.setErr(new PrintStream(new ByteArrayOutputStream())); }</pre> </td> </tr> </tbody> </table> <br /> <p>清除Ҏ与此cM。在 JUnit 3 中,您?<code>tearDown()</code> ҎQ该ҎcM于我?XOM 中ؓ消耗大量内存的试所使用的方法:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">protected void tearDown() { doc = null; System.gc(); } </pre> </td> </tr> </tbody> </table> <br /> <p>对于 JUnit 4Q我可以l它取一个更自然的名Uͼq用 <code>@After</code> 注释它: </p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@After protected void disposeDocument() { doc = null; System.gc(); } </pre> </td> </tr> </tbody> </table> <br /> <p>?<code>@Before</code> 一P也可以用 <code>@After</code> 来注释多个清除方法,q些Ҏ都在每个试之后q行?/p> <p>最后,您不再需要在类中显式调用初始化和清除方法,只要它们不被覆盖卛_Q测试运行程序将Ҏ需要自动ؓ您调用这些方法。超cM?<code>@Before</code> Ҏ在子cM?<code>@Before</code> Ҏ之前被调用(q反映了构造函数调用的序Q?code>@After</code> Ҏ以反方向q行Q子cM的方法在类中的Ҏ之前被调用。否则,多个 <code>@Before</code> ?<code>@After</code> Ҏ的相寚w序就得不C证?/p> <p><a name="N10151"><span id="wmqeeuq" class="smalltitle">套g范围的初始化</span></a></p> <p>JUnit 4 也引入了一?JUnit 3 中没有的新特性:c范围的 <code>setUp()</code> ?<code>tearDown()</code> Ҏ。Q何用 <code>@BeforeClass</code> 注释的方法都在该类中的试Ҏq行之前刚好q行一ơ,而Q何用 <code>@AfterClass</code> 注释的方法都在该类中的所有测试都q行之后刚好q行一ơ?/p> <p>例如Q假讄中的每个试都用一个数据库q接、一个网l连接、一个非常大的数据结构,或者还有一些对于初始化和事情安排来说比较昂늚其他资源。不要在每个试之前都重新创建它Q您可以创徏它一ơ,q还原它一ơ。该Ҏ得有些测试案例运行v来快得多。例如,当我试调用W三方库的代码中的错误处理时Q我通常喜欢在测试开始之前重定向 <code>System.err</code>Q以便输Z被预期的错误消息打ؕ。然后我在测试结束后q原它,如下所C:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">// This class tests a lot of error conditions, which // Xalan annoyingly logs to System.err. This hides System.err // before each test and restores it after each test. private PrintStream systemErr; @BeforeClass protected void redirectStderr() { systemErr = System.err; // Hold on to the original value System.setErr(new PrintStream(new ByteArrayOutputStream())); } @AfterClass protected void tearDown() { // restore the original value System.setErr(systemErr); }</pre> </td> </tr> </tbody> </table> <br /> <p>没有必要在每个测试之前和之后都这样做。但是一定要心对待q个Ҏ。它有可能会q反试的独立性,q引入非预期的؜乱。如果一个测试在某种E度上改变了 <code>@BeforeClass</code> 所初始化的一个对象,那么它有可能会媄响其他测试的l果。它有可能在试套g中引入顺序依赖,q?bug。与M优化一P只在剖析和基准测试证明您h实际的问题之后才实现q一炏V这是_我看C不止一个测试套件运行时间如此之长,以至不能像它所需要的那样l常q行Q尤其是那些需要徏立很多网l和数据库连接的试。(例如QLimeWire 试套gq行旉过两小时。)要加快这些测试套Ӟ以便E序员可以更加经常地q行它们Q您可以做的是减少 bug?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N1017C"><span id="wmqeeuq" class="atitle">试异常</span></a></p> <p>异常试?JUnit 4 中的最大改q。旧式的异常试是在抛出异常的代码中攑օ <code>try</code> 块,然后?<code>try</code> 块的末尾加入一?<code>fail()</code> 语句。例如,该方法测试被雉抛出一?<code>ArithmeticException</code>Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">public void testDivisionByZero() { try { int n = 2 / 0; fail("Divided by zero!"); } catch (ArithmeticException success) { assertNotNull(success.getMessage()); } }</pre> </td> </tr> </tbody> </table> <br /> <p>该方法不仅难看,而且试图挑战代码覆盖工具Q因Z测试是通过q是p|QL一些代码不被执行。在 JUnit 4 中,您现在可以编写抛出异常的代码Qƈ使用注释来声明该异常是预期的Q?</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@Test(expected=ArithmeticException.class) public void divideByZero() { int n = 2 / 0; }</pre> </td> </tr> </tbody> </table> <br /> <p>如果该异常没有抛出(或者抛Z一个不同的异常Q,那么试将p|。但是如果您惌试异常的详l消息或其他属性,则仍焉要用旧式的 <code>try-catch</code> 样式?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N101A7"><span id="wmqeeuq" class="atitle">被忽略的试</span></a></p> <p>也许您有一个测试运行的旉非常地长。不是说q个试应该q行得更快,而是说它所做的工作从根本上比较复杂或缓慢。需要访问远E网l服务器的测试通常都属于这一cR如果您不在做可能会中断该类试的事情,那么您可能想要蟩q运行时间长的测试方法,以羃短编?试-调试周期。或者也许是一个因出您的控制范围的原因而失败的试。例如,W3C XInclude 试套g试 Java q不支持的一?Unicode ~码的自动识别。不必老是被迫盯住那些U色波浪U,q类试可以被注释ؓ <code>@Ignore</code>Q如下所C:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">// Java doesn't yet support // the UTF-32BE and UTF32LE encodings @Ignore public void testUTF32BE() throws ParsingException, IOException, XIncludeException { File input = new File( "data/xinclude/input/UTF32BE.xml" ); Document doc = builder.build(input); Document result = XIncluder.resolve(doc); Document expectedResult = builder.build( new File(outputDir, "UTF32BE.xml") ); assertEquals(expectedResult, result); }</pre> </td> </tr> </tbody> </table> <br /> <p>试q行E序不q行q些试Q但是它会指些测试被跌了。例如,当用文本界面时Q会输出一?#8220;I”Q代?ignoreQ,而不是ؓ通过的测试输出所l历的时_也不是ؓp|的测试输?#8220;E”Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">$ java -classpath .:junit.jar org.junit.runner.JUnitCore nu.xom.tests.XIncludeTest JUnit version 4.0rc1 .....I.. Time: 1.149 OK (7 tests)</pre> </td> </tr> </tbody> </table> <br /> <p>但是一定要心。最初编写这些测试可能有一定的原因。如果永q忽略这些测试,那么它们期望试的代码可能会中断Qƈ且这L中断可能不能被检到。忽略测试只是一个权宜之计,不是M问题的真正解x案?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N101C2"><span id="wmqeeuq" class="atitle">旉试</span></a></p> <p>试性能是单元测试最为痛苦的斚w之一。JUnit 4 没有完全解决q个问题Q但是它对这个问题有所帮助。测试可以用一个超时参数来注释。如果测试运行的旉过指定的毫U数Q则试p|。例如,如果试p过半秒旉L找以前设|的一个文档中的所有元素,那么该测试失败:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@Test(timeout=500) public void retrieveAllElementsInDocument() { doc.query("http://*"); } </pre> </td> </tr> </tbody> </table> <br /> <p>除了单的基准试之外Q时间测试也对网l测试很有用。在一个测试试图连接到的远E主机或数据库宕机或变慢Ӟ您可以忽略该试Q以便不d所有其他的试。好的测试套件执行得_快,以至E序员可以在每个试发生重大变化之后q行q些试Q有可能一天运行几十次。设|一个超时得这一Ҏ加可行。例如,如果解析 http://www.ibiblio.org/xml p了超q?2 U,那么下面的测试就会超Ӟ</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">@Test(timeout=2000) public void remoteBaseRelativeResolutionWithDirectory() throws IOException, ParsingException { builder.build("http://www.ibiblio.org/xml"); } </pre> </td> </tr> </tbody> </table> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N101D6"><span id="wmqeeuq" class="atitle">新的断言</span></a></p> <p>JUnit 4 为比较数l添加了两个 <code>assert()</code> ҎQ?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">public static void assertEquals(Object[] expected, Object[] actual) public static void assertEquals(String message, Object[] expected, Object[] actual) </pre> </td> </tr> </tbody> </table> <br /> <p>q两个方法以最直接的方式比较数l:如果数组长度相同Q且每个对应的元素相同,则两个数l相{,否则不相{。数lؓI的情况也作了考虑?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N101EA"><span id="wmqeeuq" class="atitle">需要补充的地方</span></a></p> <p>JUnit 4 基本上是一个新框架Q而不是旧框架的升U版本。JUnit 3 开发h员可能会扑ֈ一些原来没有的Ҏ?</p> <p>最明显的删节就?GUI 试q行E序。如果您惛_试通过时看到赏心悦目的l色波浪U,或者在试p|时看Co人焦虑的U色波浪U,那么您需要一个具有集?JUnit 支持?IDEQ比?Eclipse。不是 Swing q是 AWT 试q行E序都不会被升或捆l到 JUnit 4 中?</p> <p>下一个惊喜是Q失败(assert Ҏ到的预期的错误Q与错误Q异常指出的非预期的错误Q之间不再有M差别。尽?JUnit 3 试q行E序仍然可以区别q些情况Q?JUnit 4 q行E序不再能够区分?</p> <p>最后,JUnit 4 没有 <code>suite()</code> ҎQ这些方法用于从多个试cLZ个测试套件。相反,可变长参数列表用于允许将不确定数量的试传递给试q行E序?</p> <p>我对消除?GUI 试q行E序q不感到太高_但是其他更改g有可能增?JUnit 的简单性。只要考虑有多文和 FAQ 当前专门用于解释q几点,然后考虑对于 JUnit 4Q您不再需要解释这几点了?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10203"><span id="wmqeeuq" class="atitle">~译和运?JUnit 4</span></a></p> <p>当前Q还没有 JUnit 4 的库版本。如果您惌体验新的版本Q那么您需要从 SourceForge 上的 CVS 知识库获取它。分支(branchQ是“Version4”Q参?<a >参考资?/a>Q。注意,很多的文档没有升U,仍然是指以旧式的 3.x 方式做事。Java 5 对于~译 JUnit 4 是必需的,因ؓ JUnit 4 大量用到注释、泛型以?Java 5 语言U的其他Ҏ?</p> <p>?JUnit 3 以来Q从命o行运行测试的语法发生了一点变化。您现在使用 <code>org.junit.runner.JUnitCore</code> c:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">$ java -classpath .:junit.jar org.junit.runner.JUnitCore TestA TestB TestC... JUnit version 4.0rc1 Time: 0.003 OK (0 tests)</pre> </td> </tr> </tbody> </table> <br /> <p><a name="N1021B"><span id="wmqeeuq" class="smalltitle">兼容?/span></a></p> <p>Beck ?Gamma 努力l持向前和向后兼宏VJUnit 4 试q行E序可以q行 JUnit 3 试Q不用做M更改。只要将您想要运行的每个试的全限定cd传递给试q行E序Q就像针?JUnit 4 试一栗运行程序够智能,可以分L出哪个测试类依赖于哪个版本的 JUnitQƈ适当地调用它?</p> <p>向后兼容要困难一些,但是也可以在 JUnit 3 试q行E序中运?JUnit 4 试。这一点很重要Q所以诸?Eclipse 之类h集成 JUnit 支持的工具可以处?JUnit 4Q而不需要更新。ؓ了 JUnit 4 试可以q行?JUnit 3 环境中,可以它们包装在 <code>JUnit4TestAdapter</code> 中。将下面的方法添加到您的 JUnit 4 试cM应该p够了Q?</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">public static junit.framework.Test suite() { return new JUnit4TestAdapter(AssertionTest.class); }</pre> </td> </tr> </tbody> </table> <br /> <p>但是׃ Java 比较多变Q所?JUnit 4 一炚w不向后兼宏VJUnit 4 完全依赖?Java 5 Ҏ。对?Java 1.4 或更早版本,它将不会~译或运行?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" ><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10232"><span id="wmqeeuq" class="atitle">前景</span></a></p> <p>JUnit 4 q没有结束。很多重要的斚w没有提及Q包括大部分的文。我不推荐现在就您的测试套件{换成注释?JUnit 4。即使如此,开发仍在快速进行,q且 JUnit 4 前景非常看好。尽?Java 2 E序员在可预见的未来仍然需要?JUnit 3.8Q但是那些已l{Ud Java 5 的程序员则应该很快考虑使他们的试套g适合于这个新的框Ӟ以便匚w?/p> <img src ="http://www.aygfsteel.com/run2u/aggbug/156712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/run2u/" target="_blank">I杯</a> 2007-10-29 16:09 <a href="http://www.aygfsteel.com/run2u/archive/2007/10/29/156712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Session in Test 及自动Rollbackhttp://www.aygfsteel.com/run2u/archive/2007/10/29/156704.htmlI杯I杯Mon, 29 Oct 2007 08:00:00 GMThttp://www.aygfsteel.com/run2u/archive/2007/10/29/156704.htmlhttp://www.aygfsteel.com/run2u/comments/156704.htmlhttp://www.aygfsteel.com/run2u/archive/2007/10/29/156704.html#Feedback0http://www.aygfsteel.com/run2u/comments/commentRss/156704.htmlhttp://www.aygfsteel.com/run2u/services/trackbacks/156704.htmlfrom: http://www.aygfsteel.com/rain1102/articles/117541.html

又是来自Springq个奇国度的东西, 你可以让testCasel承于AbstractTransactionalDataSourceSpringContextTestsQ就可以做到Open Session in Test Q解决Hibernate的lazy-load问题Q而且接管原来的DAO里的事务控制定义Q通过setDefaultRollback(boolean)Ҏ控制最后回滚还是提交,如果默认为回滚,则测试生数据变动不会媄响数据库内数据?br />  
如果不能l承于这个基c,可以自己单编写,代码是这LQ?br />    protected PlatformTransactionManager transactionManager;
   protected TransactionStatus transactionStatus;
   protected boolean defaultRollback = true;
   public void setUp()
   {
        transactionManager = (PlatformTransactionManager) ctx.getBean("transactionManager");
        transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
   }
   public void tearDown()
   {
        if (defaultRollback)
            transactionManager.rollback(this.transactionStatus);
        else
           transactionManager.commit(this.transactionStatus);
    }
(注,hibernate太奸诈了Q如果全部默认回滚,只会在session里干z,一点不写数据库Q达不到完全的测试效果?

I杯 2007-10-29 16:00 发表评论
]]>
վ֩ģ壺 ƽ| ˮ| ӱʡ| ˳| | | ¸| | «Ϫ| | | ʲ| | | Ϻ| ¡| | | ̰| DZ| | ˮ| ̩| ĺ| | ɽ| | | ̩| Ϫ| ֶ| ƺ| ӱ| | ˼é| | | Ȫ| ӱ| | |