??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲色大成网站www永久网站,亚洲国产一区二区三区在线观看,亚洲欧洲日产国码一级毛片http://www.tkk7.com/hhhaaawwwkkk/category/36169.html学习W记 努力奋斗 zh-cnFri, 28 Nov 2008 10:54:47 GMTFri, 28 Nov 2008 10:54:47 GMT60Junit单例?/title><link>http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242596.html</link><dc:creator>向前走的螃蟹</dc:creator><author>向前走的螃蟹</author><pubDate>Tue, 25 Nov 2008 09:22:00 GMT</pubDate><guid>http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242596.html</guid><wfw:comment>http://www.tkk7.com/hhhaaawwwkkk/comments/242596.html</wfw:comment><comments>http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hhhaaawwwkkk/comments/commentRss/242596.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hhhaaawwwkkk/services/trackbacks/242596.html</trackback:ping><description><![CDATA[     摘要: 本例是加减乘除计?先看一个简单的cCalculator.javaQ? 1package com.test.junit;  2/** *//**  3 *   4 * 数学计算  5 *  6 */  7public cla...  <a href='http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242596.html'>阅读全文</a><img src ="http://www.tkk7.com/hhhaaawwwkkk/aggbug/242596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hhhaaawwwkkk/" target="_blank">向前走的螃蟹</a> 2008-11-25 17:22 <a href="http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit 入门实例http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242415.html向前走的螃蟹向前走的螃蟹Mon, 24 Nov 2008 16:25:00 GMThttp://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242415.htmlhttp://www.tkk7.com/hhhaaawwwkkk/comments/242415.htmlhttp://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/25/242415.html#Feedback0http://www.tkk7.com/hhhaaawwwkkk/comments/commentRss/242415.htmlhttp://www.tkk7.com/hhhaaawwwkkk/services/trackbacks/242415.htmlJUnit 4是JUnit框架有史以来的最大改q,其主要目标便是利用Java 5的AnnotationҎ(gu)简化测试用例的~写。让我们看看如何使用JUnit 4来进行Unit试?/p>

我们使用的开发环境是Eclipse 3.2Q它已经自带了JUnit 4.1Q你需要将JUnit 4 Libraryd到项目用到的Library中。另外,必须使用JDK 5.0或更高版本?/p>

要在Eclipse环境之外q行JUnitQ需要下载JUnit 4.1?/p>

我们先看一个简单的Mathc:

package com.javaeedev.junit4;
public class
 Math {

    
public int abs(int
 value) {
        
return value>=0 ? value : (-
value);
    }

    
public int div(int a, int
 b) {
        
return a /
 b;
    }

    
/**

     * BUG: if b less than 0!
     
*/
    
public float exp(int a, int b) {
        
float r = 1
;
        
for(int i=0; i<b; i++
)
            r 
= r *
 a;
        
return
 r;
    }
}

注意exp()Ҏ(gu)是有Bug的,如果传入参数2, -1Q则期待的返回值应?.5FQ但实际q回gؓ1.0F?/p>

下面我们看看传统的JUnit的TestCaseQ?/p>

public class MathTest extends TestCase {

    
public void setUp() { super
.setUp(); }
    
public void tearDown() { super
.tearDown(); }

    
public void testAbs() { assertTrue(true
); }
    
public void
 testDiv() {...}
    
public void
 testExp() {...}

}

JUnit依赖反射来执行每个以test开头的Ҏ(gu)。然而,在最新的JUnit 4中,׃有了Annotation的支持,我们的测试方法不需要再以testXxx标识了,而是写上一个@Test标注卛_。例如:

@Test public void doAbs() {...}

甚至MathTestcM不必l承自TestCase。你也许会想刎ͼ不承自TestCase无法调用assertXxxҎ(gu)了,正因为如此,所有的assertXxxҎ(gu)全部以静态方法被攑օ了Assertc,使用Assert.assertXxx()调用。如果?/p>

import static org.junit.Assert.*;

则原有的代码不必改动?/p>

setUp()和tearDown()Ҏ(gu)也依赖@Before和@After标记Q这样做的最大的好处是在l承体系内不必担心忘C在setUp()Ҏ(gu)中调用父cȝsuper.setUp()Ҏ(gu)QJUnit框架会自动处理父cȝ@Before和@After标记的方法?/p>

q且QJUnit框架对@Before和@After的调用顺序类gcȝ构造方法和析构Ҏ(gu)Q即@Before按照父类到子cȝ序调用Q@After则相反,q样保证了资源的正确获取和释放?/p>

当然Q不再强q必M用setUp和tearDown作ؓҎ(gu)名,可以使用更有意义的方法名Q例如:initDatabase()和closeDatabase()Q只要它们被标注了@Before和@After卛_?/p>

来看看用Annotation的MathTestQ?/p>

package com.javaeedev.junit4;

import static org.junit.Assert.*
;

import org.junit.*
;

public class
 MathTest {

    
public
 MathTest() {
        System.out.println(
"new MathTest instance."
);
    }

    @Before
    
public void setUp() throws
 Exception {
        System.out.println(
"call @Before before a test method"
);
    }

    @After
    
public void tearDown() throws
 Exception {
        System.out.println(
"call @After after a test method"
);
    }

    @Test
    
public void
 doAbs() {
        Math math 
= new
 Math();
        assertEquals(
200, math.abs(200
));
        assertEquals(
100, math.abs(-100
));
        assertEquals(
0, math.abs(0
));
    }

    @Test
    
public void
 doDiv() {
        Math math 
= new
 Math();
        assertEquals(
5, math.div(10020
));
        assertEquals(
4, math.div(10021
));
    }

    @Test(expected
=ArithmeticException.class
)
    
public void
 doDiv0() {
        
new Math().div(1270
);
    }

    @Test(timeout
=1
)
    
public void
 doLongTimeTask() {
        
double d = 0
;
        
for(int i=1; i<10000000; i++
)
            d
+=
i;
    }

    @Test
    
public void
 testExp() {
        Math math 
= new
 Math();
        assertEquals(32f, math.exp(
25), 0.001f
);
        assertEquals(1f, math.exp(
20), 0.001f
);
        assertEquals(
0.5f, math.exp(2, (-1)), 0.001f
);
    }

}

Ҏ(gu)试异常,JUnit 4可以?font face="Courier New" color="#ff0000">expected=Exception.class来期待一个预期的异常Q而不必编?/p>

try {
  ...
  fail(
"No exception"
);
}
catch
(Exception e) {
  
// OK!

}

来看看doDiv0试Q我们期待一个除Cؓ0的ArithmeticExceptionQ因此编写如下测试方法:

@Test(expected=ArithmeticException.class)
public void
 doDiv0() {
    
new Math().div(1270
);
}

对于非常耗时的测试,@Testq有一个timeout来标识该Ҏ(gu)最长执行时_过此时间即表示该测试方法失败:

@Test(timeout=1)
public void
 doLongTimeTask() {
    
double d = 0
;
    
for(int i=1; i<10000000; i++
)
        d
+=
i;
}

以上Ҏ(gu)若执行时间超q?ms则测试失败,׃依赖CPU的执行速度Q在不同的机器上试l果也不同?/p>

JUnit 4另一个较大的变化是引入了@BeforeClass和@AfterClassQ它们在一个Testcȝ所有测试方法执行前后各执行一ơ。这是ؓ了能在@BeforeClass中初始化一些昂늚资源Q例如数据库q接Q然后执行所有的试Ҏ(gu)Q最后在@AfterClass中释放资源?/p>

正如你能惛_的,׃@BeforeClass和@AfterClass仅执行一ơ,因此它们只能标记静态方法,在所有测试方法中׃n的资源也必须是静态引用:

private static Object dbConnection;

@BeforeClass
public static void setUpBeforeClass() throws
 Exception {
    System.out.println(
"call @BeforeClass and init database connection"
);
    dbConnection 
= new
 Object();
}

@AfterClass
public static void tearDownAfterClass() throws
 Exception {
    System.out.println(
"call @AfterClass to release database connection"
);
    dbConnection 
= null
;
}

最后执行测试用例,可以看到l果Q?/p>

各个Ҏ(gu)执行序如下Q?/p>

call @BeforeClass and init database connection

new MathTest instance.
call @Before before a test method
call @After after a test method

new MathTest instance.
call @Before before a test method
call @After after a test method

...

call @AfterClass to release database connection

可以看到Q@BeforeClass是在实例化MathTest之前调用的,因此不能在构造方法中初始化共享资源?/p>

最后需要注意的是由于Java 5的自动Box/UnboxҎ(gu),在调用assertEquals()时要特别注意Q如果你传入Q?/p>

assertEquals(100F, 100);

则按照自动Box变ؓQ?/p>

assertEquals(new Float(100F), new Integer(100));

试p|Q因为FloatcdIntegercM是同一cd?/p>

因此要特别注意float和double的测试。事实上对float和double应?/p>

assertEquals(float, float, float delta);
assertEquals(double, double, double delta);

delta指定了两个作比较的QҎ(gu)的相差范_在此范围内的两个点数将认ؓ相等。可以传入一个很的C?.0001F?nbsp;

JUnit 4非常适合使用Java 5的开发h员,但是无法在Java 1.4中获得这些好处,q且Q也不与以前的版本兼宏V因此,如果你正在用Java 5Q就可以考虑使用JUnit 4来编写测试?br />
此文章来自:http://www.javaeedev.com/blog/article.jspx?articleId=ff80808112e766ee011312f144520061



向前走的螃蟹 2008-11-25 00:25 发表评论
]]>
JUnit、TDD 单介l?剪切优秀的文?http://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/23/242160.html向前走的螃蟹向前走的螃蟹Sun, 23 Nov 2008 13:57:00 GMThttp://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/23/242160.htmlhttp://www.tkk7.com/hhhaaawwwkkk/comments/242160.htmlhttp://www.tkk7.com/hhhaaawwwkkk/archive/2008/11/23/242160.html#Feedback0http://www.tkk7.com/hhhaaawwwkkk/comments/commentRss/242160.htmlhttp://www.tkk7.com/hhhaaawwwkkk/services/trackbacks/242160.html一、一些概忉|问题:

白盒试——把试对象看作一个打开的盒子,E序内部的逻辑l构和其他信息对试人员是公开的?
回归试——Y件或环境的修复或更正后的“再测?#8221;Q自动测试工具对q类试其有用?
单元试——是最粒度的试Q以试某个功能或代码块。一般由E序员来做,因ؓ它需要知道内部程序设计和~码的细节?br />
二、单元测试的好处 Q?/span>

A、提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率?
B、提高Y件代码质量——它使用版本发布至集成Q便于实Ch员除错。同时引入重构概念,让代码更q净和富有弹性?
C、提升系l的可信赖度——它是回归测试的一U。支持修复或更正后的“再测?#8221;Q可保代码的正性?

三、单元测试的针对对象 Q?br />
A、面向过E的软g开发针对过E?
B、面向对象的软g开发针对对象?
C、可以做cL试,功能试Q接口测试(最常用于测试类中的Ҏ(gu)Q?

四、下面是JUnit一些特性的ȝQ?br />  
1) 提供的API可以让你写出试l果明确的可重用单元试用例
2) 提供了三U方式来昄你的试l果Q而且q可以扩?
3) 提供了单元测试用例成批运行的功能
4) 轻量而且使用单,没有商业性的ƺ骗和无用的向导
5) 整个框架设计良好Q易扩展Q对不同性质的被对象,如ClassQJspQServletQEjb{,Junit有不同的使用技巧?br /> 6) 使用断言Ҏ(gu)判断期望值和实际值差异,q回Boolean倹{?br /> 7) 试驱动讑֤使用共同的初始化变量或者实例?br /> 8) 试包结构便于组l和集成q行?br /> 9) 支持囑֞交互模式和文本交互模式?br />
五、JUnit的好处和JUnit单元试~写原则Q?/span>

好处Q?A、可以ɋ试代码与品代码分开?nbsp;
              B、针Ҏ(gu)一个类的测试代码通过较少的改动便可以应用于另一个类的测试?nbsp;
              C、易于集成到试人员的构E中QJUnit和Ant的结合可以实施增量开发?nbsp;
              D、JUnit是公开源代码的Q可以进行二ơ开发?nbsp;
              E、可以方便地对JUnitq行扩展?
~写原则Q?br />               A、是化测试的~写Q这U简化包括测试框架的学习和实际测试单元的~写?nbsp;
              B、是使测试单元保持持久性?nbsp;
              C、是可以利用既有的测试来~写相关的测试?

六、JUnit框架l成 Q?/span>

A、对试目标q行试的方法与q程集合Q可UCؓ试用例(TestCase)?
B、测试用例的集合Q可容纳多个试用例(TestCase)Q将其称作测试包(TestSuite)?
C、测试结果的描述与记录?TestResult) ?
D、测试过E中的事件监听?TestListener)?
E、每一个测试方法所发生的与预期不一致状늚描述Q称其测试失败元?TestFailure)
F、JUnit Framework中的出错异常QAssertionFailedErrorQ?

JUnit框架是一个典型的Composite模式QTestSuite可以容纳Mz自Test的对象;当调用TestSuite对象的run()Ҏ(gu)是,会遍历自己容U的对象Q逐个调用它们的run()Ҏ(gu)

七、JUnit中常用的接口和类 Q?/span>

1QTest接口——运行测试和攉试l果
Test接口使用了Composite设计模式Q是单独试用例 QTestCaseQ,聚合试模式QTestSuiteQ及试扩展QTestDecoratorQ的共同接口?
它的public int countTestCasesQ)Ҏ(gu)Q它来统计这ơ测试有多少个TestCaseQ另外一个方法就是public void runQ?TestResult Q,TestResult是实例接受测试结果, runҎ(gu)执行本次试?

2QTestCase抽象cZ—定义测试中固定Ҏ(gu)
TestCase是Test接口的抽象实玎ͼQ不能被实例化,只能被承)其构造函数TestCase(string name)Ҏ(gu)输入的测试名Uname创徏一个测试实例。由于每一个TestCase在创建时都要有一个名Uͼ若某试p|了,便可识别出是哪个试p|?
TestCasecM包含的setUp()、tearDown()Ҏ(gu)。setUp()Ҏ(gu)集中初始化测试所需的所有变量和实例Qƈ且在依次调用试cM的每个测试方法之前再ơ执行setUp()Ҏ(gu)。tearDown()Ҏ(gu)则是在每个测试方法之后,释放试E序Ҏ(gu)中引用的变量和实例?
开发h员编写测试用例时Q只需l承TestCaseQ来完成runҎ(gu)卛_Q然后JUnit获得试用例Q执行它的runҎ(gu)Q把试l果记录在TestResult之中?

3QAssert静态类——一pd断言Ҏ(gu)的集?
Assert包含了一l静态的试Ҏ(gu)Q用于期望值和实际值比Ҏ(gu)否正,x试失败,Assertcd会抛Z个AssertionFailedError异常QJUnit试框架这U错误归入Failesq加以记录,同时标志为未通过试。如果该cL法中指定一个Stringcd的传参则该参数将被做为AssertionFailedError异常的标识信息,告诉试人员改异常的详细信息?
JUnit 提供?大类31l断aҎ(gu)Q包括基断言、数字断a、字W断a、布?yu)断a、对象断a?
其中assertEqualsQObject expcted,Object actual)内部逻辑判断使用equals()Ҏ(gu)Q这表明断言两个实例的内部哈希值是否相{时Q最好用该Ҏ(gu)对相应类实例的D行比较。而assertSameQObject expected,Object actualQ内部逻辑判断使用了Javaq算W?#8220;==”Q这表明该断a判断两个实例是否来自于同一个引用(ReferenceQ,最好用该Ҏ(gu)对不同类的实例的D行比寏VasserEquals(String message,String expected,String actual)该方法对两个字符串进行逻辑比对Q如果不匚w则显C着两个字符串有差异的地斏VComparisonFailurecL供两个字W串的比对,不匹配则l出详细的差异字W?

4QTestSuite试包类——多个测试的l合
TestSuitec负责组装多个Test Cases。待得cM可能包括了对被测cȝ多个试Q而TestSuit负责攉q些试Q我们可以在一个测试中Q完成全部的对被类的多个测试?
TestSuitecdCTest接口Q且可以包含其它的TestSuites。它可以处理加入Test时的所有抛出的异常?
TestSuite处理试用例?个规U(否则会被拒绝执行试Q?
A 试用例必须是公有类QPublicQ?
B 试用例必须l承与TestCasec?
C 试用例的测试方法必L公有的( Public Q?
D 试用例的测试方法必被声明为Void
E 试用例中测试方法的前置名词必须是test
F 试用例中测试方法误M传递参?

5QTestResultl果cd其它cM接口
TestResultl果c集合了L试累加l果Q通过TestResult实例传递个每个试的RunQ)Ҏ(gu)。TestResult在执行TestCase是如果失败会异常抛出
TestListener接口是个事g监听规约Q可供TestRunnercM用。它通知listener的对象相关事ӞҎ(gu)包括试开始startTest(Test test)Q测试结束endTest(Test test),错误Q增加异常addError(Test test,Throwable t)和增加失败addFailure(Test test,AssertionFailedError t)
TestFailurep|cL?#8220;p|”状况的收集类Q解释每ơ测试执行过E中出现的异常情c其toString()Ҏ(gu)q回“p|”状况的简要描q?br />
八、JUnit的扩展应?nbsp;Q?br />
JUnit + HttpUnit=WEB功能试工具
JUnit + hansel =代码覆盖试工具
JUnit + abbot =界面自动回放试工具
JUnit + dbunit =数据库测试工?
JUnit + junitperf=性能试工具

?ji)、测试的U类Q?/span>

单元试Q检模块(也就是类Q的正确性。如果对象需要访问外部的数据资源Q例如数据库Q就需要模拟一个mock objectsQ但在实际中真实数据与测试环境是不同的?客户试Q这是功能性、系l、和验收试。用来测试整体的pȝҎ(gu)。在XP中,q些试qL写?
l合试Q介于用h试和单元试之间的桥梁。综合测试帮助测试应?a class="UBBWordLink" style="color: #000000" target="_blank">E序的交互性。一般情况下Qmock objects不被用于l合试Q它会增加测试时间。同Pl合?br />                     试经怾赖特D的试环境Q例如数据库送来的测试数据。综合测试也需要用到外部类库。例如ؓJ2EE应用E序q行l合试的类库Cactus?br /> 开发h员测试:q是用来让开发h员检验自׃码或新函数的。对于每一个开发h员,只要有可能,需要有更多的测试来验代码。组l这些测试和l织E序?/span>码一?br />                             重要?br />

十、测试驱动开发(TDDQ优势:

TDD的基本思\是通过试来推动整个开发的q行。而测试驱动开发技术ƈ不只是单U的试工作?/span>

需求向来就是Y件开发过E中感觉最不好明确描述、易变的东西。这里说的需求不只是指用L需求,q包括对代码的用需求。很多开发h员最x的是后期q要修改某个cL者函数的接口q行修改或者扩展,Z么会发生q样的事情就是因部分代码的用需求没有很好的描述。测试驱动开发就是通过~写试用例Q先考虑代码的用需求(包括功能、过E、接口等Q,而且q个描述是无二义的,可执行验证的?/span>

通过~写q部分代码的试用例Q对其功能的分解、用过E、接口都q行了设计。而且q种从用角度对代码的设计通常更符合后期开发的需求。可试的要求,对代码的内聚性的提高和复用都非常有益。因此测试驱动开发也是一U代码设计的q程?/span>

开发h员通常对编写文档非常厌烦,但要使用、理解别人的代码旉常又希望能有文档进行指对{而测试驱动开发过E中产生的测试用例代码就是对代码的最好的解释?/span>

快乐工作的基是对自己有信心Q对自己的工作成果有信心。当前很多开发h员却l常在担心:“代码是否正确Q?#8221;“辛苦~写的代码还有没有严重bugQ?#8221;“修改的新代码对其他部分有没有影响Q?#8221;。这U担心甚臛_致某些代码应该修改却不敢修改的地步。测试驱动开发提供的试集就可以作ؓ你信心的来源?/span>

当然试驱动开发最重要的功能还在于保障代码的正性,能够q速发现、定位bug。而迅速发现、定位bug是很多开发h员的梦想。针对关键代码的试集,以及不断完善的测试用例,速发现、定位bug提供了条件?/span>

我的一D功能非常复杂的代码使用TDD开发完成,真实环境应用中只发现几个bugQ而且很快被定位解冟뀂?zhn)在应用后Q也一定会为那U自信的开发过E,功能不断增加、完善的感觉Q迅速发现、定位bug的能力所感染Q喜Ƣ这个技术的?/span>


十一、测试驱动开发(TDDQ?font style="background-color: #ffffff">原理Q?/span>

试驱动开发的基本思想是在开发功能代码之前,先编写测试代码。也是说在明确要开发某个功能后Q首先思考如何对q个功能q行试Qƈ完成试代码的编写,然后~写相关的代码满些测试用例。然后@环进行添加其他功能,直到完全部功能的开发?/span>

我们q里把这个技术的应用领域从代码编写扩展到整个开发过E。应该对整个开发过E的各个阶段q行试驱动Q首先思考如何对q个阶段q行试、验证、考核Qƈ~写相关的测试文档,然后开始下一步工作,最后再验证相关的工作。下图是一个比较流行的试模型QV试模型?/span>


【图 V试模型?/span>
【图 V试模型? src=

在开发的各个阶段Q包括需求分析、概要设计、详l设计、编码过E中都应该考虑相对应的试工作Q完成相关的试用例的设计、测试方案、测试计划的~写。这里提到的开发阶D只是D例,Ҏ(gu)实际的开发活动进行调整。相关的试文档也不一定是非常详细复杂的文档,或者什么Ş式,但应?span style="background-color: yellow">L试驱动的习?/span>?/span>

关于试模型Q还有X试模型。这个测试模型,我认为,是对详细阶段和编码阶D进行徏模,应该说更详细的描qC详细设计和编码阶D늚开发行为。及针对某个功能q行对应的测试驱动开发?/span>


【图 X试模型?/span>
【图 X试模型? src= 


十一、测试驱动开发(TDDQ过E:

软g开发其他阶D늚试驱动开发,Ҏ(gu)试驱动开发的思想完成对应的测试文档即可。下面针对详l设计和~码阶段q行介绍。测试驱动开发的基本q程如下Q?br /> 1Q?明确当前要完成的功能。可以记录成一?TODO 列表?br /> 2Q?快速完成针Ҏ(gu)功能的测试用例编写?br /> 3Q?试代码~译不通过?br /> 4Q?~写对应的功能代码?br /> 5Q?试通过?br /> 6Q?对代码进行重构,q保证测试通过?br /> 7Q?循环完成所有功能的开发?/p>

开发过E中Q通常把测试代码和功能代码分开存放Q这里提供一个简单的试框架使用例子Q?zhn)可以通过它了解测试框架的使用。下面是文g列表?/span>

	project/				目ȝ?
project/test			        试目ȝ?
project/test/testSeq.cpp		试seq_t 的测试文Ӟ对其他功能文件的试文g复制后修改即?
project/test/testSeq.h
project/test/Makefile			试目?Makefile
project/test/main.cpp			试目的主文gQ不需要修?
project/main.cpp		        目的主文g
project/seq_t.h			        功能代码Q被试文g
project/Makefile		        目?Makefile
十二、测试驱动开发(TDDQ原则:

试隔离。不同代码的试应该怺隔离。对一块代码的试只考虑此代码的试Q不要考虑其实现细节(比如它用了其他cȝ边界条gQ?/span>

一帽子。开发h员开发过E中要做不同的工作,比如Q编写测试代码、开发功能代码、对代码重构{。做不同的事Q承担不同的角色。开发h员完成对应的工作时应?br />                     保持注意力集中在当前工作上,而不要过多的考虑其他斚w的细节,保证头上只有一帽子。避免考虑无关l节q多Q无谓地增加复杂度?/span>

试列表。需要测试的功能点很多。应该在M阶段x加功能需求问题时Q把相关功能点加到测试列表中Q然后l手头工作。然后不断的完成对应的测试用例、功?br />                     代码、重构。一是避免疏漏,也避免干扰当前进行的工作?/span>

试驱动。这个比较核心。完成某个功能,某个c,首先~写试代码Q考虑其如何用、如何测试。然后在对其q行设计、编码?/span>

先写断言。测试代码编写时Q应该首先编写对功能代码的判断用的断a语句Q然后编写相应的辅助语句?/span>

可测试性。功能代码设计、开发时应该h较强的可试性。其实遵循比较好的设计原则的代码都具备较好的试性。比如比较高的内聚性,量依赖于接口等?/span>

及时重构。无论是功能代码q是试代码Q对l构不合理,重复的代码等情况Q在试通过后,及时q行重构?/span>

步前进。Y件开发是个复杂性非帔R的工作,开发过E中要考虑很多东西Q包括代码的正确性、可扩展性、性能{等Q很多问题都是因为复杂性太大导致的。极限编E?br />                     提出了一个非常好的思\是步前进。把所有的规模大、复杂性高的工作,分解成小的Q务来完成。对于一个类来说Q一个功能一个功能的完成Q如果太?br />                     隑ְ再分解。每个功能的完成p试代码Q功能代码-试Q重?/span>的@环。通过分解降低整个pȝ开发的复杂性。这L效果非常明显。几个小的功能代?br />                     完成后,大的功能代码几乎是不用调试就可以通过。一个个cL法的实现Q很快就看到整个cd快就完成啦。本来感觉很多特性需要增加,很快׃看到没有
                    几个啦。你甚至会ؓq个速度感到震惊。(我理解,是大q度减少调试、出错的旉产生的这U速度感)

十三、测试驱动开发(TDDQ测试技术:

1. 试范围、粒?br />
对哪些功能进行测试?会不会太J琐Q什么时候可以停止测试?q些问题比较常见。按大师 Kent Benk 的话Q对那些你认为应该测试的代码q行试。就是说Q要怿自己的感觉,自己的经验。那些重要的功能、核心的代码应该重Ҏ(gu)试。感到疲力_应该停下来休息一下。感觉没有必要更详细的测试,停止本轮测试?/span>

试驱动开发强调测试ƈ不应该是负担Q而应该是帮助我们减轻工作量的Ҏ(gu)。而对于何时停止编写测试用例,也是应该Ҏ(gu)你的l验Q功能复杂、核心功能的代码应该编写更全面、细致的试用例Q否则测试流E即可?/span>

试范围没有静态的标准Q同时也应该可以随着旉改变。对于开始没有编写够的试的功能代码,随着bug的出玎ͼҎ(gu)bug补齐相关的测试用例即可?/span>

步前进的原则,要求我们对大的功能块试Ӟ应该先分拆成更小的功能块q行试Q比如一个类A使用了类B、CQ就应该~写到A使用B、C功能的测试代码前Q完成对B、C的测试和开发。那么是不是每个类或者小函数都应该测试哪Q我认ؓ没有必要。你应该q用你的l验Q对那些可能出问题的地方重点试Q感觉不可能出问题的地方q它真正出问题的时候再补测试吧?br />
2. 怎么~写试用例

试用例的编写就用上了传l的试技术?/span>

  • 操作q程量模拟正常使用的过E?
  • 全面的测试用例应该尽量做到分支覆盖,核心代码量做到路径覆盖?
  • 试数据量包括Q真实数据、边界数据?
  • 试语句和测试数据应该尽量简单,Ҏ(gu)理解?
  • Z避免对其他代码过多的依赖Q可以实现简单的桩函数或桩类QMock ObjectQ?
  • 如果内部状态非常复杂或者应该判断流E而不是状态,可以通过记录日志字符串的方式q行验证?/span>

 



]]>
վ֩ģ壺 պƵ| ˾Ʒ޾Ʒ| лGAYƬվWWW| ˳վ18ֹһ | һպƵ| պþþþþ| ޾Ʒ| ձһ | 59paoɹƵ| ޾Ʒþ| о߹ۿͬ| ƷרëƬ| պ߹ۿƵ| ޾Ʒպרsilk| ޹Ʒ˾þ| hƵ߹ۿ| պƷվ| ޹˾Ʒþ | AV鶹Ʒ| һƵ߲| պƷƬҹѹ| ߹ۿ˳Ƶڵ | avһ| AVר߹ۿ | һ͵| ۺϾƷ㽶þ97| ձvƬһ| AVѿ| йëƬѹۿƵ| պƷרӰ| һ岻 | þþþAV| ձվ| 4455߹ѿ| Թ24 | ԶƵ߹ۿѲ | | Ļ| һۺƵ| www.avѹۿ| ޾Ʒר|