`
liuqi8839
  • 浏览: 8446 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

TDD总结

TDD 
阅读更多

TDD(测试驱动开发)是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。

TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。

TDD的重要目的不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,而且是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。

————摘自《百度百科》

刚刚接触TDD,感觉就是个坑啊,还没有掌握好之前学习的东西,又硬生生改变的思维去写测试,每一步都反复琢磨,才勉强写完一个测试。

现在测试工具有很多,我这里用的是Jasmine,Jasmine项目主页:https://github.com/pivotal/jasmine

Jasmine的基本的用法:

describe('pos', function () {

}

 describe表示一个测试组。接写来的测试都写在里面:it('should print correct text', function () {

        spyOn(console, 'log');

        printInventory(inputs);

        var currentDate = new Date(),
            year = dateDigitToString(currentDate.getFullYear()),
            month = dateDigitToString(currentDate.getMonth() + 1),
            date = dateDigitToString(currentDate.getDate()),
            hour = dateDigitToString(currentDate.getHours()),
            minute = dateDigitToString(currentDate.getMinutes()),
            second = dateDigitToString(currentDate.getSeconds()),
            formattedDateString = year + '年' + month + '月' + date + '日 ' + hour + ':' + minute + ':' + second;

        var expectText =
            '***<没钱赚商店>购物清单***\n' +
            '打印时间:' + formattedDateString + '\n' +
            '----------------------\n' +
            '名称:雪碧,数量:5瓶,单价:3.00(元),小计:12.00(元)\n' +
            '名称:荔枝,数量:2斤,单价:15.00(元),小计:30.00(元)\n' +
            '名称:方便面,数量:3袋,单价:4.50(元),小计:9.00(元)\n' +
            '----------------------\n' +
            '挥泪赠送商品:\n' +
            '名称:雪碧,数量:1瓶\n' +
            '名称:方便面,数量:1袋\n' +
            '----------------------\n' +
            '总计:51.00(元)\n' +
            '节省:7.50(元)\n' +
            '**********************';

        expect(console.log).toHaveBeenCalledWith(expectText);
    });

 其中:

it('should print correct text', function () {

}

 每一个这样的it语句块就是一个单元测试的内容,我们在‘ ’中写下这个单元的名称,一般是写我们想要得到的结果,然后再function里面得到我们想要的内容,在这里,我们用spyon模拟printInventory(inputs)中的console.log()函数,而

expect(console.log).toHaveBeenCalledWith(expectText);

 就是将console.log输出的值与expectText匹配,如果匹配成功,测试才会通过,现在

printInventory(inputs);

 还没有实现,所以肯定会报错的,新手可以在函数中写入:

       var currentDate = new Date(),
            year = dateDigitToString(currentDate.getFullYear()),
            month = dateDigitToString(currentDate.getMonth() + 1),
            date = dateDigitToString(currentDate.getDate()),
            hour = dateDigitToString(currentDate.getHours()),
            minute = dateDigitToString(currentDate.getMinutes()),
            second = dateDigitToString(currentDate.getSeconds()),
            formattedDateString = year + '年' + month + '月' + date + '日 ' + hour + ':' + minute + ':' + second;

        var expectText =
            '***<没钱赚商店>购物清单***\n' +
            '打印时间:' + formattedDateString + '\n' +
            '----------------------\n' +
            '名称:雪碧,数量:5瓶,单价:3.00(元),小计:12.00(元)\n' +
            '名称:荔枝,数量:2斤,单价:15.00(元),小计:30.00(元)\n' +
            '名称:方便面,数量:3袋,单价:4.50(元),小计:9.00(元)\n' +
            '----------------------\n' +
            '挥泪赠送商品:\n' +
            '名称:雪碧,数量:1瓶\n' +
            '名称:方便面,数量:1袋\n' +
            '----------------------\n' +
            '总计:51.00(元)\n' +
            '节省:7.50(元)\n' +
            '**********************';

        printInventory = function(inputs) {

            console.log('expectText');
        };

以让测试成功通过,保证测试本身不是错的。

接下来我们可以删掉不必要的代码了,然后真正实现功能。

再多说一点关于测试的东西,前面说到describe表示一个测试组,在describe中可以写无数个it语句块用来测试每一个单元,如果有一个it语句块提示错误,那么就不是哪一个实现模块出错,有可能是实现代码整体就出错了,其他的it语句块碰巧通过了而已,所以当测试报错之后,首先看提示,如果expect的期望值和实际值匹配不一致,可以用倒推的思想,逐步检查到底哪一步出错了,如果是代码本身的问题,可能你就要重写代码了。这样的倒推效率也是比较低的,所以当我们写测试的时候,首先要根据功能确定好测试框架,保证整体的思维不是错的,测试可以小步小步的进行,保证每一个小的实现都有测试与之对应。这样,测试提示错误的时候,我们就很容易找到错误的源头。

0
0
分享到:
评论

相关推荐

    GSM_TDD板振说明及分析解决方法总结.docx

    在移动通信领域,GSM TDD(Time Division Duplexing,时分双工)系统是一种广泛应用的技术,其中“板振”或“板震”问题是一个常见的工程挑战。本文将深入探讨GSM TDD板振的成因、分析方法以及解决策略。 首先,板...

    phpunit-TDD驱动开发

    #### 五、总结 通过上述步骤,我们成功地使用TDD方法论编写了一个简单的转换器类。TDD不仅帮助我们编写出高质量的代码,还能确保代码符合预期的行为。在实际项目中,建议结合持续集成等最佳实践进一步提高代码质量...

    UMTS-TDD手册

    #### 总结 综上所述,《UMTS-TDD手册》不仅为读者提供了关于NS2中UMTS-TDD系统仿真的全面指南,而且还深入探讨了该领域的关键技术挑战和解决方案。无论是对于正在从事相关研究的学生还是工程师来说,都是一份非常有...

    单元测试与TDD实践

    **五、总结** 单元测试与TDD实践是现代软件开发中不可或缺的部分,它们不仅能显著提升软件质量,还能提高开发效率和代码的可维护性。通过将测试融入开发流程的早期阶段,可以预防潜在的缺陷,减少后期的修复成本。...

    手机TDD引起电流声问题理论和经验总结

    ### 手机TDD引起电流声问题理论和经验总结 #### 一、TDD基本概念与原理 **TDD(Time Division Duplexing)**,即时分双工技术,在移动通信领域应用广泛,尤其在GSM系统中,TDD机制是实现频率资源高效利用的关键。...

    嵌入式 TDD

    8. **最佳实践**:最后,本书总结了一系列TDD的最佳实践,帮助开发者避免常见错误,提升代码质量和开发效率。 #### 结语 通过《嵌入式TDD》,读者不仅能够深入了解TDD的核心原理,还能学习到如何将其有效地应用于...

    TDD-CDMA_for_Wireless_Communications

    #### 五、总结与展望 TDD-CDMA作为一种高效的无线通信技术,在移动通信领域发挥着重要作用。未来,随着5G技术的普及和发展,TDD-CDMA将在更高的数据速率、更低的延迟等方面展现出更大的潜力。同时,对于TDD-CDMA的...

    tdd_by_example.pdf

    ### 测试驱动开发 (TDD) 知识点解析 #### 一、TDD概念与原理 **测试驱动开发(Test-Driven Development, TDD)** 是一种软件开发方法论,其核心思想是在编写功能代码之前先编写测试用例。这种方法能够确保软件的...

    测试驱动开发TDD(1-3)

    总结来说,测试驱动开发TDD是一种以测试为指导的开发模式,它通过编写测试来驱动功能代码的实现,强调代码的可测试性、可读性和可维护性。在实际应用中,TDD能够帮助开发者发现设计上的问题,提前预防错误,并提高...

    LTE_TDD与LTE_FDD技术简介和比较

    在本文中,我们将对LTE_TDD和LTE_FDD技术进行比较分析,并对TD-LTE系统的特有技术进行总结。 LTE_TDD技术是一种基于时分双工的LTE技术,具有灵活的频率配置能力,能够支持非对称业务,具有上下行信道一致性,能够...

    TDD源码下载

    总结来说,这个资源提供了一个在Ubuntu平台上基于TDD原则开发的深度学习框架,特别关注双流卷积神经网络,可用于手写数字识别等任务。用户需要具备一定的编程和深度学习知识,以便于编译安装、理解和使用这个框架。

    (TDD) Technical Design Document 模版

    通过以上知识点的总结,我们可以看到(TDD) Technical Design Document模版对于IDA项目的系统设计和开发工作具有重要的指导意义。它不仅有助于确保项目团队遵循一致的标准和流程,还能够促进不同角色之间的有效沟通和...

    FDD与TDD的综合比较

    #### 六、基本差异总结 - **FDD**:基于配对频谱工作,上行和下行链路使用独立的频率,支持同时双向通信,降低了上行和下行之间的干扰。 - **TDD**:基于未配对频谱工作,同一频率既用于上行也用于下行,适用于非...

    重构?测试?TDD?Ant?

    总结来说,这个主题涵盖了软件开发中的关键环节,从代码的优化到测试的实施,再到自动化构建。掌握这些技能对于提升软件质量和开发效率至关重要。通过对Ant的深入理解和使用,开发者能够创建出更可靠、更易于维护的...

    基于FPGA的LTE-TDD接收系统设计与实现.pdf

    总结来说,文档详细阐述了一种利用FPGA为核心的LTE-TDD接收系统的设计方案,并解释了为何采用FPGA以及相关的电路设计考虑。关键技术点包括中频带通采样技术的运用、A/D转换器的选择和FPGA内部信号处理的实现,这些...

Global site tag (gtag.js) - Google Analytics