<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://wiki.chinulture.com/index.php?action=history&amp;feed=atom&amp;title=JUNIT</id>
	<title>JUNIT - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.chinulture.com/index.php?action=history&amp;feed=atom&amp;title=JUNIT"/>
	<link rel="alternate" type="text/html" href="https://wiki.chinulture.com/index.php?title=JUNIT&amp;action=history"/>
	<updated>2026-10-20T23:12:55Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.chinulture.com/index.php?title=JUNIT&amp;diff=243118&amp;oldid=prev</id>
		<title>Test 32：1個修訂：HDwiki 数据迁移 批次 - 820</title>
		<link rel="alternate" type="text/html" href="https://wiki.chinulture.com/index.php?title=JUNIT&amp;diff=243118&amp;oldid=prev"/>
		<updated>2014-08-10T23:23:24Z</updated>

		<summary type="html">&lt;p&gt;1個修訂：HDwiki 数据迁移 批次 - 820&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2014年8月10日 (日) 23:23的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;zh&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Test 32</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.chinulture.com/index.php?title=JUNIT&amp;diff=243117&amp;oldid=prev</id>
		<title>2014年8月10日 (日) 23:23 Test 32</title>
		<link rel="alternate" type="text/html" href="https://wiki.chinulture.com/index.php?title=JUNIT&amp;diff=243117&amp;oldid=prev"/>
		<updated>2014-08-10T23:23:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== 基本简介 ==&lt;br /&gt;
[[File:01300000165488122495070994350.jpg|thumb|junit]][[File:01300000165488122495072645675.jpg|thumb|junit]]JUnit是一个开发源代码的Java测试框架，用于编写和运行可重复的测试。他是用于[[单元测试]]框架体系xUnit的一个实例（用于java语言）。它包括以下特性：&lt;br /&gt;
&lt;br /&gt;
1、用于测试期望结果的断言（Assertion）；2、用于共享共同测试数据的[[测试工具]]；3、用于方便的组织和运行测试的测试套件；4、图形和文本的测试运行器。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试流程：1、扩展TestCase类；2、覆盖runTest()方法（可选）；3、对应测试目标类书写testXXXXX()方法；4、扩展TestSuite类，[[重载]]suite()方法，实现自定义的测试过程；5、运行TestRunner进行测试；&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 功能作用 ==&lt;br /&gt;
[[File:01300000165488122495073644508.jpg|thumb|junit]]junit是在xp编程和重构（refactor）中被极力推荐使用的工具，因为在实现自动单元测试的情况下可以大大的提高开发的效率，但是实际上编写测试[[代码]]也是需要耗费很多的时间和精力的：&lt;br /&gt;
&lt;br /&gt;
1、对于xp编程而言，要求在编写代码之前先写测试，这样可以强制你在写代码之前好好的思考代码（方法）的功能和[[逻辑]]，否则编写的代码很不稳定，那么你需要同时维护测试代码和实际代码，这个工作量就会大大增加。因此在xp编程中，基本过程是这样的：构思－》编写测试代码－》编写代码－》测试，而且编写测试和编写代码都是增量式的，写一点测一点，在编写以后的代码中如果发现问题可以较块的追踪到问题的原因，减小[[回归错误]]的纠错难度。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2、对于重构而言，其好处和xp编程中是类似的，因为重构也是要求改一点测一点，减少回归错误造成的时间消耗。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3、对于非以上两种情况，在开发的时候使用junit写一些适当的测试也是有必要的，因为一般也是需要编写测试的代码的，可能原来不是使用的junit，如果使用junit，而且针对接口（方法）编写测试代码会减少以后的维护工作，例如以后对方法内部的修改（这个就是相当于重构的工作了）。另外就是因为junit有[[断言功能]]，如果测试结果不通过会那个测试不通过，为什么，而如果是想以前的一般做法是写一些测试代码看其输出结果，然后再由自己来判断结果使用正确，使用junit的好处就是这个结果是否正确的判断是它来完成的，只需要看看它告诉结果是否正确就可以了，在一般情况下会大大提高效率。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 框架介绍 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:01300000165488122495074871588.jpg|thumb|junit]]一、TestCase&lt;br /&gt;
测试用例，对每个测试类，都要定义一个测试用例。JUnit支持两种运行单个测试的方法：静态的和动态的方法。 &lt;br /&gt;
&lt;br /&gt;
1、[[静态]]的方法就是覆盖TestCase类的runTest()方法，一般是采用内部类的方式&lt;br /&gt;
&lt;br /&gt;
创建一个测试实例： TestCase test01 = new testCar(&amp;quot;test getWheels&amp;quot;) { public void runTest() { testGetWheels()；} }&lt;br /&gt;
&lt;br /&gt;
采用静态的方法要注意要给每个测试一个名字，这样你就可以区分哪个测试失败了。 &lt;br /&gt;
&lt;br /&gt;
2、动态的方法是用[[内省]]来实现runTest()以创建一个测试实例。这要求测试的名字就是需要调用的测试方法的名字： TestCase test01 = new testCar(&amp;quot;testGetWheels&amp;quot;)；&lt;br /&gt;
&lt;br /&gt;
JUnit会动态查找并调用指定的测试方法。动态的方法很简洁，但如果你键入了错误的名字就会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静态的方法都很好，你可以按照自己的喜好来选择。&lt;br /&gt;
&lt;br /&gt;
二、TestSuite &lt;br /&gt;
&lt;br /&gt;
一旦你创建了一些测试实例，下一步就是要让他们能一起运行。必须定义一个TestSuite。在JUnit中，这就要求你在TestCase类中定义一个静态的suite()方法。suite()方法就像main()方法一样，JUnit用它来执行测试。在suite()方法中，你将测试实例加到一个TestSuite对象中，并返回这个TestSuite对象。一个TestSuite[[对象]]可以运行一组测试。TestSuite和TestCase都实现了Test接口，而Test接口定义了运行测试所需的方法。这就允许你用TestCase和TestSuite的组合创建一个TestSuite。public static Test suite() { TestSuite suite= new TestSuite(); suite.addTest(new testCar(&amp;quot;testGetWheels&amp;quot;)); suite.addTest(new testCar(&amp;quot;testGetSeats&amp;quot;)); return suite; }public static Test suite() { return new TestSuite(testCar.class); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:01300000165488122495076010224.jpg|thumb|junit]]三、TestRunner&lt;br /&gt;
有了TestSuite就可以运行这些测试了，JUnit提供了三种界面来运行测试 [Text UI] junit.textui.TestRunner [AWT UI] junit.awtui.TestRunner [Swing UI] junit.swingui.TestRunner java junit.textui.TestRunner yourTestclass&lt;br /&gt;
&lt;br /&gt;
Fixture&lt;br /&gt;
&lt;br /&gt;
如果需要在一个或若干个的类执行多个测试，这些类就成为了测试的context。在JUnit中被称为[[Fixture]]。当你编写测试代码时，你会发现你花费了很多时间配置/初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不可取，因为要求执行多个测试，我并不希望某个测试的结果意外地影响其他测试的结果。通常若干个测试会使用相同的Fixture，而每个测试又各有自己需要改变的地方。 为此，JUnit提供了两个方法，定义在Test Case类中。 &lt;br /&gt;
&lt;br /&gt;
protected void setUp() throws java.lang.Exception protected void tearDown() throws java.lang.Exception 覆盖setUp()方法，初始化所有测试的Fixture，如建立[[数据库]]连接，将每个测试略有不同的地方在testXXX()方法中进行配置。覆盖tearDown()，释放你在setUp()中分配的永久性资源，如数据库连接。 当JUnit执行测试时，它在执行每个testXXXXX()方法前都调用setUp()，而在执行每个testXXXXX()方法后都调用tearDown()方法，由此保证了测试不会相互影响。 &lt;br /&gt;
&lt;br /&gt;
四、Assert&lt;br /&gt;
&lt;br /&gt;
Assert类中定义了相当多的assert方法，主要有assert(),assertEquals(), assertNull(), assertSame(), assertTrue(), fail()等方法。Faile失败是一个期望的被assert方法检查到的结果。Error错误则是意外的问题引起的，如ArrayIndexOutOfBoundsException。 &lt;br /&gt;
&lt;br /&gt;
== 实践方法 ==&lt;br /&gt;
[[File:01300000165488122495077798243.gif|thumb|junit]]1、不要用TestCase的构造[[函数]]初始化Fixture，而要用setUp()和tearDown()方法。2、不要依赖或假定测试运行的顺序，因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。3、避免编写有副作用的Test Case。例如：如果随后的测试依赖于某些特定的交易数据，就不要提交交易数据。简单的会滚就可以了。4、当继承一个测试类时，记得调用[[父类]]的setUp()和tearDown()方法。5、将测试代码和工作代码放在一起，一边同步编译和更新。（使用Ant中有支持junit的task.）6、测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。7、确保测试与时间无关，不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。8、如果你编写的[[软件]]面向国际市场，编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。9、尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法，可以使代码更为简洁。10、测试要尽可能地小，执行速度快。&lt;br /&gt;
== 和ant结合 ==&lt;br /&gt;
[[File:01300000165488122495079135901.gif|thumb|junit]]ant提供了两个target：junit和junitreport运行所有测试用例，并生成html格式的报表。具体操作如下：&lt;br /&gt;
&lt;br /&gt;
1、将junit.jar放在ANT_HOMElib目录下2、修改build.xml，加入如下内容：--------------One or more tests failed，check the report for detail---------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
运行这个target，ant会运行每个TestCase，在report目录下就有了很多TEST*.xml和一些网页打开report[[目录]]下的index.html就可以看到很直观的测试运行报告，一目了然。在Eclipse中开发、运行JUnit测试相当简单。因为Eclipse本身集成了JUnit相关组件，并对JUnit的运行提成了无缝的支持。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:技術應用]]&lt;/div&gt;</summary>
		<author><name>Test 32</name></author>
		
	</entry>
</feed>