精华内容
下载资源
问答
  • 相信大部分开发团队都在使用TDD,...实际上,测试驱动开发模式确实有效,它将可能发生的问题用测试代码预先解决,只有通过测试代码后的代码才是可以接受。当前有很多公司都在应用 TDD,但 TDD 并不是一个开发者友...

    相信大部分开发团队都在使用TDD,并且还有很多开发团队都 对外声明 在使用 TDD 开发模式。

    之所以说是“对外声明”,是因为很多开发团队虽然号称使用的是 TDD 开发模式,实际开发过程中却无法满足 TDD 的要求。

    实际上,测试驱动的开发模式确实有效,它将可能发生的问题用测试代码预先解决,只有通过测试代码后的代码才是可以接受。当前有很多公司都在应用 TDD,但 TDD 并不是一个开发者友好的开发模式,只是一个理想化的开发模式。

    为什么 TDD 不是一个开发者友好的开发方式?

    大家都知道 TDD 是什么,可是试问所有的开发者能保证每次开发过程中会满足 TDD 的要求吗?

    听听大家的声音:

    • 测试也只是保证脑内想法转成代码的时候,逻辑自洽
    • Lots of people on the internet talk about how good TDD is, but people were afraid to say it wasn’t working for them.
    • 没有 deadline 的威胁,我很喜欢 TDD,但是过度测试是存在
    • 大多数程序员还不会写测试用例
    • 看起来容易,但是做起来难
    • Yes. TDD 该死。TDD 死了,T 才能正常 T,程序员做正常人,团队做正常团队。TDD 死,不是因为程序员达不到它的要求,是它没打算尊重程序员,尊重开发实际。TDD 本末倒置的价值观,非生产代码统治生产代码,没理解问题就想对问题高屋建瓴,TDD 是码农界的纳粹,流程方法论原教旨主义。
    • TDD 是否已死先不说,很多程序员连写出基本的整洁代码都做不到,还能指望他先写测试吗
    • 新手看到 TDD 会欢欣鼓舞,但是他们没有能力来实践。老手们在项目的压力下,早就麻木了,先写 case 还不如写好代码再补 case 呢,很多东西我还没时间想清楚,怎么写 case?不如先写个小功能先,边写边改
    • 其实我们所有一切的目的是为了快速的交付有价值,有质量的产品或者服务,赢得公司的生存和发展空间。为了达到这个目的,我们有很多种的手段。但手段不是目的。
    • 以国内的敏捷实践来讲,完全达不到 TDD 的要求
    • TDD 力量和问题都源自 test first。要能 test first,写代码之前要想得更清楚;代码得要有良好的可测试性
    • 导致其写的代码是为了满足测试的,而忽略了代码质量和实际需求
    • 不过,我还真是见过使用 TDD 开发的不错的项目,只不过那个项目比较简单了。更多的情况下,我看到的是教条式的生硬的 TDD,所以,不奇怪地听到了程序员们的抱怨——“自从用了 TDD,工作量更大了”。当然,这也不能怪他们,TDD 本来就是很难把控的方法。
    • 等等等等

    来自于网络

    我相信很多人都做不到,现在更多的开发者做的更多的是 Unit Test,就是写业务代码完了之后再写(单元)测试,而这个 Unit Testing 单元测试与 TDD 测试驱动开发 的结果一致,即两者都保证了功能通过了测试,两者结果一样为什么还给自己添麻烦,提前写测试代码呢?

    还有些开发者由于水平不足;或是不会测试;有些项目非常紧急根本没时间做测试。

    很多开发者都很反感 TDD,至少是在潜意识中很反感(除了自身每天用不着 TDD 那些人); 试想你在小时候,每天上学前妈妈都会在耳边絮叨都要你小心,然后告诉你每一步的步骤,每一步都要正确,有时候真的很烦,于是我们左耳朵进右耳朵出,就会不耐烦的说“好了,好了,我知道了”;程序员也是一样的,对于很繁琐的一些开发模式他们会糊弄过去,方法之一就是先写完业务代码,完成业务再说测试,写完后再写单元测试,把 TDD 给搪塞过去。

    可是你知道你妈妈对你是好的,而且她在养你,所以就没说什么;程序员和公司的关系与之很相似,公司也在养你,它希望你写的代码是好的,是可靠的,所以它要求你用 TDD 的方式编写代码。

    TDD 看似有效,但是开发者的普遍不愿意做,并且很容易造假(很多人都是先写完代码,再写测试代码),而且无法监督开发者是否采用 TDD 这种开发模式,也就是说 TDD 是理想化的开发模式,如果要执行起来是最好不过的,但是真正严格执行的团队又有多少呢?确定所有的开发人员都严格执行吗?

    由此得知,TDD 是非常理想化的开发模式,只有特定的程序员、团队、产品和公司才适合这种理想化的开发模式

    除了 TDD,我们还有哪些替代方案?

    有,目前有种开发模式正在被一些公司的部门使用,就是 Test Plan Driven Development,即测试计划驱动开发模式,或是 Test Pre-Requisition Driven Development,即测试前提驱动开发。

    TPDD 到底是什么?

    相比每次开发之前先写测试代码,我们可以让开发人员参与编写测试计划,也就是说,在收到项目需求时,开发者需要帮助测试人员根据项目需求思考测试计划,并起草 测试计划 A (或者叫做开发承诺 -Development Promise),然后再进行开发。

    如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

    由于开发者需要跟测试人员合作,开发者相对于测试人员更加了解项目需求,测试计划更多的依赖于开发者,而测试计划、开发承诺是受到审查的;所以也造不了假,对于团队 lead 负责人而言是可监控、可调查的。

    适用对象

    • 不喜欢怎么 TDD 开发模式的开发者,和相关的团队和企业
    • 没有严格要求按照 TDD,然而对外声称使用 TDD 开发模式的开发者,和相关团队和企业
    • 执行了 TDD 这种开发模式,然而质量没有明显的提高的团队和企业
    • 使用 TDD 导致开发效率降低的团队和企业
    • 开发者不喜欢 TDD 这种开发模式,嫌麻烦,但是还想要保证代码质量的团队或企业
    • 开发者没有足够的能力进行 TDD 的团队和企业
    • 产品的截止日期很紧张的企业
    • 初创团队和企业
    • 正在上升期的团队和企业
    • 还没有应用 TDD 这种开发模式,但是准备使用 TDD 的团队或企业

    什么是开发承诺和测试计划 A

    开发承诺类似于 design doc,不过其中讲述了开发者必须完成的功能,需要做的功能以及可选做的功能,并且还提供了测试人员需要做的事情。

    开发承诺 — 测试计划 A 如下所示:

    • Must Have – Critical Check Points
      • 必须要全部完成的功能点,不完成工作没有完成
        • 测试人员重点测试的功能点,并且 adhoc test,有能力的团队需要加入自动化测试
    • Need Have – Important Check Points
      • 重要的功能点,必须要完成绝大部分的功能,没有完成绝大部分,工作没有完成
        • 测试人员重点测试的功能点
    • Should Have – Optional Check Points
      • 可选的功能,开发者可选
        • 测试人员手动测试

    开发承诺和测试计划 A 有什么作用?

    • 开发承诺 测试计划 A 的第一个作用是,开发者 (测试者) 对于任务的优先级有很清晰的认识

      • 为了给开发者自己看的(或是其他开发者,假如开发者离职或是请假,其他开发者就可以看测试计划迅速开发),作为开发时的指导手册,这样开发者的头绪就更加清晰,也知道任务的优先级 ---- 先做什么,后做什么。

      • 为了给测试人员看的,作为测试的指导手册,这样测试人员就知道什么功能需要重点测试、什么东西需要进行实验性的测试,以及什么功能需要实现测试自动化以便于加入到 CI 和 CD 之中。

    • 开发承诺 测试计划 A 的第二个作用是,承诺使开发者的开发过程更加小心

      • 将测试计划 A 交给测试人员和开发组长,利用心理学中“承诺”作用,使自己的言行和承诺一致。这样的话,开发人员就知道自己的 code 至少要满足什么条件,至少要过什么样的测试,所以开发时会更加小心,代码的质量和可靠性也会得到很高的提升。
    • 开发承诺 测试计划 A 的第三个作用是,促进测试人员的工作进度,使测试人员有更多的时间进行自动化、adhoc 测试或是运维方面的工作

      • 测试人员会根据测试计划 A 起草测试计划 B,只需要在测试计划 B 中添加如何进行测试即可。

    参考:一旦我们做出了某种承诺,或是选择了某种立场,就会在个人和外部环境的压力下,迫使自己的言行与承诺保持一致,尽管这种行为有悖于自己的意愿。

    TDD 和 TPDD 有什么区别?

    TDD 的优缺点

    TDD 是先写测试代码,判断业务代码是否可以通过测试代码。看似有效,但是开发者的普遍不愿意做,或是完成度很差,或是做了之后导致没有按时完成任务;并且很容易造假,很多人都是先写完代码,再写测试代码;或者测试代码质量不高;或是测试用例不好。

    对于管理者而言,他们无法监督开发者是否有效的沿用 TDD 这种开发模式,完全体现不了 TDD 的优势。

    TPDD 的优缺点

    1. 提高代码质量

      • TPDD 是先写开发承诺,使开发者对测试用例和测试环境有清晰的认识,思维会更加清晰有条理;并且由于承诺的心理作用,开发者会潜移默化的提高代码质量。
    2. 可监控和不可造假

      • 因为测试人员需要根据开发者的开发承诺编写测试计划,可以使管理者很直接的监督开发者是否采用 TPDD 这种开发模式(通过审查开发承诺),所以不可能造假。
    3. 有时间进行其他方面的提升,例如自动化、运维等

      • 由于开发者和测试者已经将基本的开发承诺—测试计划 B 写出来了,对于测试者来说将会用更少的时间做功能的理解和测试的准备,这将给测试人员更多的时间进行 adhoc 测试、自动化测试或是运维功能的开发和维护。
    4. 更好的接受 TDD

      • 由于开发者已经接触了测试,使用 TPDD 后的团队会更好的接受 TDD,这时 TPDD 又可以被称为 Test pre-requisition Driven Development
    5. 对开发者友好

      • 相对于每次开发之前写测试代码,只需要与测试人员想出测试用例,对于开发者来说这是更加容易的
    6. 对测试人员友好

      • 因为与开发者的直接合作,测试的准备的难度大大的降低,测试计划和测试用例的思考时间缩短,并且有时间空余去做一些自动化或是运维方面的工作。
    7. 对管理人员友好

      • 由于开发承诺和测试计划的实体化,管理人员就可以提前进行审查,而不是等待开发结束后进行代码审查(code review)
    展开全文
  • 你所在的开发团队使用TDD吗?...实际上,测试驱动开发模式确实有效,它将可能发生的问题用测试代码预先解决,只有通过测试代码后的代码才是可以接受。当前有很多公司都在应用TDD,但TDD并不是一个开发者...

    你所在的开发团队使用TDD吗?

    ——想必很多人的回答是肯定的,与此同时,还有很多开发团队都 对外声明 在使用TDD开发模式。

    之所以说是“对外声明”,是因为很多开发团队虽然号称使用的是TDD开发模式,实际开发过程中却无法满足TDD的要求。

    实际上,测试驱动的开发模式确实有效,它将可能发生的问题用测试代码预先解决,只有通过测试代码后的代码才是可以接受。当前有很多公司都在应用TDD,但TDD并不是一个开发者友好的开发模式,只是一个理想化的开发模式。

    为什么TDD不是一个开发者友好的开发方式?

    大家都知道TDD是什么,可是试问所有的开发者能保证每次开发过程中会满足TDD的要求吗?

    听听大家的声音:

    • 测试也只是保证脑内想法转成代码的时候,逻辑自洽
    • Lots of people on the internet talk about how good TDD is, but people were afraid to say it wasn’t working for them.
    • 没有deadline的威胁,我很喜欢TDD,但是过度测试是存在
    • 大多数程序员还不会写测试用例
    • 看起来容易,但是做起来难
    • Yes. TDD该死。TDD死了,T才能正常T,程序员做正常人,团队做正常团队。TDD死,不是因为程序员达不到它的要求,是它没打算尊重程序员,尊重开发实际。TDD本末倒置的价值观,非生产代码统治生产代码,没理解问题就想对问题高屋建瓴,TDD是码农界的纳粹,流程方法论原教旨主义。
    • TDD是否已死先不说,很多程序员连写出基本的整洁代码都做不到,还能指望他先写测试吗
    • 新手看到TDD会欢欣鼓舞,但是他们没有能力来实践。老手们在项目的压力下,早就麻木了,先写case还不如写好代码再补case呢,很多东西我还没时间想清楚,怎么写case?不如先写个小功能先,边写边改
    • 其实我们所有一切的目的是为了快速的交付有价值,有质量的产品或者服务,赢得公司的生存和发展空间。为了达到这个目的,我们有很多种的手段。但手段不是目的。
    • 以国内的敏捷实践来讲,完全达不到TDD的要求
    • TDD 力量和问题都源自 test first。要能 test first,写代码之前要想得更清楚;代码得要有良好的可测试性
    • 导致其写的代码是为了满足测试的,而忽略了代码质量和实际需求
    • 不过,我还真是见过使用TDD开发的不错的项目,只不过那个项目比较简单了。更多的情况下,我看到的是教条式的生硬的TDD,所以,不奇怪地听到了程序员们的抱怨——“自从用了TDD,工作量更大了”。当然,这也不能怪他们,TDD本来就是很难把控的方法。
    • 等等等等

    来自于网络

    我相信很多人都做不到,现在更多的开发者做的更多的是Unit Test,就是写业务代码完了之后再写(单元)测试,而这个Unit Testing 单元测试与TDD 测试驱动开发 的结果一致,即两者都保证了功能通过了测试,两者结果一样为什么还给自己添麻烦,提前写测试代码呢?

    还有些开发者由于水平不足;或是不会测试;有些项目非常紧急根本没时间做测试。

    很多开发者都很反感TDD,至少是在潜意识中很反感(除了自身每天用不着TDD那些人); 试想你在小时候,每天上学前妈妈都会在耳边絮叨都要你小心,然后告诉你每一步的步骤,每一步都要正确,有时候真的很烦,于是我们左耳朵进右耳朵出,就会不耐烦的说“好了,好了,我知道了”;程序员也是一样的,对于很繁琐的一些开发模式他们会糊弄过去,方法之一就是先写完业务代码,完成业务再说测试,写完后再写单元测试,把TDD给搪塞过去。

    可是你知道你妈妈对你是好的,而且她在养你,所以就没说什么;程序员和公司的关系与之很相似,公司也在养你,它希望你写的代码是好的,是可靠的,所以它要求你用TDD的方式编写代码。

    TDD看似有效,但是开发者的普遍不愿意做,并且很容易造假(很多人都是先写完代码,再写测试代码),而且无法监督开发者是否采用TDD这种开发模式,也就是说TDD是理想化的开发模式,如果要执行起来是最好不过的,但是真正严格执行的团队又有多少呢?确定所有的开发人员都严格执行吗?

    由此得知,TDD是非常理想化的开发模式,只有特定的程序员、团队、产品和公司才适合这种理想化的开发模式

    除了TDD,我们还有哪些替代方案?

    有,目前有种开发模式正在被一些公司的部门使用,就是 Test Plan Driven Development,即测试计划驱动开发模式,或是Test Pre-Requisition Driven Development,即测试前提驱动开发。

    TPDD到底是什么?

    相比每次开发之前先写测试代码,我们可以让开发人员参与编写测试计划,也就是说,在收到项目需求时,开发者需要帮助测试人员根据项目需求思考测试计划,并起草 测试计划 A (或者叫做开发承诺-Development Promise),然后再进行开发。

    \"image\"

    由于开发者需要跟测试人员合作,开发者相对于测试人员更加了解项目需求,测试计划更多的依赖于开发者,而测试计划、开发承诺是受到审查的;所以也造不了假,对于团队lead负责人而言是可监控、可调查的。

    适用对象

    • 不喜欢怎么TDD开发模式的开发者,和相关的团队和企业
    • 没有严格要求按照TDD,然而对外声称使用TDD开发模式的开发者,和相关团队和企业
    • 执行了TDD这种开发模式,然而质量没有明显的提高的团队和企业
    • 使用TDD导致开发效率降低的团队和企业
    • 开发者不喜欢TDD这种开发模式,嫌麻烦,但是还想要保证代码质量的团队或企业
    • 开发者没有足够的能力进行TDD的团队和企业
    • 产品的截止日期很紧张的企业
    • 初创团队和企业
    • 正在上升期的团队和企业
    • 还没有应用TDD这种开发模式,但是准备使用TDD的团队或企业

    什么是开发承诺和测试计划A

    开发承诺类似于design doc,不过其中讲述了开发者必须完成的功能,需要做的功能以及可选做的功能,并且还提供了测试人员需要做的事情。

    开发承诺 — 测试计划A 如下所示:

    • Must Have – Critical Check Points
      • 必须要全部完成的功能点,不完成工作没有完成
        • 测试人员重点测试的功能点,并且adhoc test,有能力的团队需要加入自动化测试
    • Need Have – Important Check Points
      • 重要的功能点,必须要完成绝大部分的功能,没有完成绝大部分,工作没有完成
        • 测试人员重点测试的功能点
    • Should Have – Optional Check Points
      • 可选的功能,开发者可选
        • 测试人员手动测试

    开发承诺和测试计划A有什么作用?

    • 开发承诺 测试计划A的第一个作用是,开发者(测试者)对于任务的优先级有很清晰的认识

      • 为了给开发者自己看的(或是其他开发者,假如开发者离职或是请假,其他开发者就可以看测试计划迅速开发),作为开发时的指导手册,这样开发者的头绪就更加清晰,也知道任务的优先级----先做什么,后做什么。

      • 为了给测试人员看的,作为测试的指导手册,这样测试人员就知道什么功能需要重点测试、什么东西需要进行实验性的测试,以及什么功能需要实现测试自动化以便于加入到CI和CD之中。

    • 开发承诺 测试计划A的第二个作用是,承诺使开发者的开发过程更加小心

      • 将测试计划A交给测试人员和开发组长,利用心理学中“承诺”作用,使自己的言行和承诺一致。这样的话,开发人员就知道自己的code至少要满足什么条件,至少要过什么样的测试,所以开发时会更加小心,代码的质量和可靠性也会得到很高的提升。
    • 开发承诺 测试计划A的第三个作用是,促进测试人员的工作进度,使测试人员有更多的时间进行自动化、adhoc测试或是运维方面的工作

      • 测试人员会根据测试计划A起草测试计划B,只需要在测试计划B中添加如何进行测试即可。

    参考:一旦我们做出了某种承诺,或是选择了某种立场,就会在个人和外部环境的压力下,迫使自己的言行与承诺保持一致,尽管这种行为有悖于自己的意愿。

    TDD和TPDD有什么区别?

    TDD的优缺点

    TDD是先写测试代码,判断业务代码是否可以通过测试代码。看似有效,但是开发者的普遍不愿意做,或是完成度很差,或是做了之后导致没有按时完成任务;并且很容易造假,很多人都是先写完代码,再写测试代码;或者测试代码质量不高;或是测试用例不好。

    对于管理者而言,他们无法监督开发者是否有效的沿用TDD这种开发模式,完全体现不了TDD的优势。

    TPDD的优缺点

    1. 提高代码质量

      • TPDD是先写开发承诺,使开发者对测试用例和测试环境有清晰的认识,思维会更加清晰有条理;并且由于承诺的心理作用,开发者会潜移默化的提高代码质量。
    2. 可监控和不可造假

      • 因为测试人员需要根据开发者的开发承诺编写测试计划,可以使管理者很直接的监督开发者是否采用TPDD这种开发模式(通过审查开发承诺),所以不可能造假。
    3. 有时间进行其他方面的提升,例如自动化、运维等

      • 由于开发者和测试者已经将基本的开发承诺—测试计划B写出来了,对于测试者来说将会用更少的时间做功能的理解和测试的准备,这将给测试人员更多的时间进行adhoc测试、自动化测试或是运维功能的开发和维护。
    4. 更好的接受TDD

      • 由于开发者已经接触了测试,使用TPDD后的团队会更好的接受TDD,这时TPDD又可以被称为 Test pre-requisition Driven Development
    5. 对开发者友好

      • 相对于每次开发之前写测试代码,只需要与测试人员想出测试用例,对于开发者来说这是更加容易的
    6. 对测试人员友好

      • 因为与开发者的直接合作,测试的准备的难度大大的降低,测试计划和测试用例的思考时间缩短,并且有时间空余去做一些自动化或是运维方面的工作。
    7. 对管理人员友好

      • 由于开发承诺和测试计划的实体化,管理人员就可以提前进行审查,而不是等待开发结束后进行代码审查(code review)

    参考链接

    TDD is dead. Long live testing.

    Is TDD Dead?

    TDD(测试驱动开发)是否已死?

    TDD并不是看上去的那么美

    心理学参考 之 承诺和一致原理

    作者介绍

    臧嘉玮 Vigor Zang,TPDD的发明者和布道者,主要研究方向为自动化系统和Web Development。曾就职于IBM Watson Commerce组,主要负责自动化测试和前端开发,任职期间受Watson Commerce Insight组的邀请,负责测试流程和测试基础设施的建设,包括测试框架、测试工具和性能检测和预警系统的架构、开发和维护。

    展开全文
  • 测试驱动开发tdd 测试驱动开发(TDD)是一种软件工程实践,要求在应该验证的代码之前编写单元测试。 TDD源自敏捷世界,它是极限编程(XP)方法的基本实践,如今,TDD本身已被视为一门学科,并已在敏捷环境之外使用。...

    测试驱动开发tdd

    测试驱动开发(TDD)是一种软件工程实践,要求在应该验证的代码之前编写单元测试。 TDD源自敏捷世界,它是极限编程(XP)方法的基本实践,如今,TDD本身已被视为一门学科,并已在敏捷环境之外使用。 如果没有概述,那么您将无法做到!

    在过去的15年中,敏捷运动不断发展,从而导致了新的,更务实的实践,旨在为客户提供能够尽快满足其需求的计划。 针对此问题, 基于V模型的传统方法提供了“最后测试”方法,并在应用程序代码之后编写了单元测试。 这种方法已清楚地显示了其随时间的局限性,因为充其量,书面测试适合于代码,而不是相反,从而引入了确认偏差。 在最坏的情况下,由于代码似乎正常工作,甚至没有编写这些测试,为什么还要浪费时间编写它们?

    对于TDD支持者来说,这个问题的答案是显而易见的,他们清楚地知道,今天在测试上进行的投资将来会在添加新功能或重构操作时在很大程度上退还。 因此, TDD采用“测试优先”的方法,即在代码之前编写单元测试 ,唯一的原因将是成功执行这些测试。 这个想法可以追溯到远古时代,由肯特·贝克Kent Beck )在1990年代中期正式提出,他将其作为极限编程(XP)方法论的Struts之一 然后有必要等到2003年,并出版《 测试驱动的开发:通过示例 》这本书,才能看到它完成了实践的编纂。 后者在“测试优先”方法中增加了连续重构的概念,以改善产品代码。

    TDD原则

    通过将编程,单元测试编写和重构相结合TDD是一种结构化实践,它允许获得干净的代码 ,易于修改和满足所表达的需求,而这在开发应用程序时仍然是首要任务。 TDD分为三个阶段

    1. 首先编写失败的单元测试。 不可能进行编译是失败的。
    2. 绿色的 尽早编写足以通过此单元测试的生产代码,即使这意味着允许“最差”的解决方案。 当然,如果立即出现一个干净,简单的解决方案,则必须实现它,否则并不严重,在重构阶段将逐步改进代码。 目的是尽快获得单元测试成功的绿色标准。
    3. REFACTOR 这个阶段通常被忽略,但是是必不可少的,因为它消除了可能的代码重复,而且还使得可以在体系结构,因数分解,表示形式上进行更改……此重构涉及生产代码和测试代码,并且不得修改程序的外部行为,这由保持绿色的测试执行栏实现。

    这三个阶段的实现在构成TDD周期的5个主要阶段内完成(图1)。

    图1:TDD周期

    此周期很短(最多10分钟),重复执行直到成功完成涉及功能的所有单元测试 这些步骤看似很简单,但是必须极其严格地应用它们才能充分利用TDD。 对规则的这种严格监视使得可以获得符合一定数量的良好开发实践的质量代码成为可能。 因此,在考虑代码重复( DRY原则— 不需要 )时,所获得的代码对基本的( KISS原则-保持简单,愚蠢 )不寻求实现不必要的服务( YAGNI原则-您将不再需要 )感到满意。 重复自己 ),这要归功于它的不断重构。 这样,程序的实现遵循增量逻辑,从而允许出现灵活的模块化体系结构。

    清洁测试

    TDD并不是一个毫不费力地拥有最佳单元测试套件的奇迹解决方案 重要的是要记住,在这种实践中, 测试代码比生产代码重要,甚至同样重要! 因此,随着时间的流逝,维护测试代码至关重要。 为了有效, 测试必须是干净的,其特点是可读性强 这是通过执行尽可能简单,清晰和尽可能密集的测试而获得的,即使他用最少的代码说出尽可能多的内容。 因此, 单元测试应该只代表一个概念,并且只包含一个断言

    最后, 干净的测试还必须遵循其他5条规则 ,可以使用首字母缩写FIRST轻松记住这些规则

    • 快速 :测试必须快速才能经常执行。
    • 独立性 :测试不得相互依赖。
    • 可重复的 :测试在任何环境下都必须具有可重复性。
    • 自我验证 :测试必须具有二进制结果(失败或成功),才能快速而轻松地得出结论。
    • 及时 :必须在适当的时间编写测试,即在即将验证的生产代码之前编写测试。

    范式转变

    TDD方法是开发人员的范式转变。 学习阶段是必要的,在此阶段中,随着开发人员技能的增加,收益将越来越多。 因此,将TDD视为未来的投资。 更改还涉及文档存储库,其中包含代表可执行规范和应用程序文档的单元测试。 确实,如果使用测试来验证需求,它们也可以描述需求。 基于此观察,主要困难将在于开发人员以计划的测试形式开发复杂功能路线图的能力,并能够在必要时提出质疑。

    TDD允许尽早发现问题 ,从而降低了解决成本,并减少了错误数量。 单元测试系列提供的代码覆盖范围旨在最大,最小覆盖80%以上。 该安全网使开发人员有信心进行重构和持续改进工作 ,这对于该方法的成功至关重要。 实际上,可以通过促进添加新功能的灵活,可维护和可重用代码更好地控制技术债务

    最后, TDD的ROI也反映在开发人员生产率的整体提高中 确实,如果它推动一般的写入速度快两倍,那么它将在重构阶段导致真正的浪费搜寻,从而导致一半的代码。 一旦掌握了学习内容,我们就会发现开发人员的工作方式发生了范式转变,从调试器转向一系列单元测试,而著名的绿色标语则是成功执行后者的代名词。

    选择好的工具

    为了获得最佳实践,TDD必须与良好的工具结合在一起。 像Eclipse这样的具有本地JUnit支持的IDE是必不可少的。 强烈建议使用插件来促进单元测试的管理,例如MoreUnit和Infinitest。 后者在每次代码更改时自动执行所有单元测试,这减少了反馈周期,这也为连续的单元测试奠定了基础。 另一方面,将代码模板用于单元测试在重复的TDD周期中节省了重要的时间。 在代码级别,对于生成可读和灵活的业务对象,设计模式构建器至关重要。 最后,精通键盘快捷键可以节省宝贵的时间。

    TDD在实践中

    就像在武术中一样, 技术的实践可以在片中完成,在片中开发者必须从头解决特定的问题。 网站http://sites.google.com/site/tddproblems/all-problems-1提供了很多问题,这些问题特别适合使用TDD方法解决。 在我们的示例中,我们选择一个程序将阿拉伯格式的数字转换为罗马格式的等效数字。

    请注意,您可以在YouTube视频中的阿拉伯数字TDD Kata中找到罗马数字转换器

    根据TDD方法的要求,我们首先编写RomanNumeralTest类,其中将包含程序的单元测试系列。 后者的第一个要求是输入数字1给出输出罗马数字I,其实现如下:

    我们运行第一个测试是为了使其失败(图2)。

    图2:TDD周期中的RED步骤

    如果编译错误失败,我们将继续编写满足此测试要求的生产代码。 为此,我们将自己放在RomanNumeral类所在的行上,并使用Eclipse的键盘快捷键Ctrl + 1提供了“快速修复”功能,以生成空的RomanNumeral类。 然后,我们总是通过此菜单生成此intToRoman方法。 在这个阶段,我们编写最简单的代码来满足单元测试。 在这种情况下,需要在intToRoman方法的输出中返回字符串“ I”:

    然后可以成功执行测试,以在TDD周期中继续前进(图3)。

    图3:TDD周期中的绿色步骤

    我们现在进入重构阶段,由于代码中没有重复且没有改进,因此重构阶段非常快。 通过添加新测试再次开始该循环:

    一旦测试失败,我们将修改RomanNumeral类的intToRoman方法,以成功通过此测试,从而为我们提供以下代码:

    随着单元测试变成绿色,我们继续进行重构。 一种方法最好只有一个出口点,并且即使有一条指令,也建议对if条件使用花括号。 这给了我们:

    测试保持绿色,我们在数字3的附加要求上进行了扩展,必须将罗马数字III作为输出。 这项新要求使我们的单元测试失败了,有必要编写以下生产代码来对其进行验证:

    重构步骤强调了使用循环进行优化的可能性,该循环会减小在输入处传递的阿拉伯数字的值,并因此向输出处呈现的罗马数字添加罗马条:

    测试总是成功通过,我们现在对数字10感兴趣,该数字必须在输出中给出罗马数字X:

    测试失败后,将编写生产代码。 在这里,我们意识到我们的先前算法没有被改编,因为我们存在一个新的罗马数字X。为解决这个问题,我们添加了一个测试以特定方式处理阿拉伯数字10:

    测试正确通过,并且重构阶段不需要任何特殊的工作。 我们添加了一个附加测试,其值为20,必须给出罗马数字XX。 此新要求确实会导致关联的单元测试失败。 然后编写以下生产代码:

    此代码足以通过我们的一系列单元测试。 重构阶段使我们可以退后一步,看到可以针对包含X的罗马数字优化我们的算法。很容易看出,循环比if / else if更有效。 因此,代码修改如下:

    JUnit测试栏始终为绿色,重构未更改方法的外部行为。 对生产代码的研究使我们可以观察到,对于图X和I,所执行的工作基本上是相同的,即一个递减的循环,这表明分解的可能性。 因此,我们的算法出现了一条新的设计路径,其中包括引入2个表,这些表的索引分别包含罗马数字和阿拉伯数字。

    我们的单元测试验证了此重构,并保持数字30的正确性。由于不可能用30击败单元测试,因此无需更改生产代码。 基于罗马数字X和I,使用数字11和33重复此操作,对于该罗马数字X和I,算法仍可运行。 另一方面,罗马数字V导致关联的单元测试失败。 因此,我们将从完整的TDD周期开始 最简单的解决方案是在表中添加罗马数字V及其等效的阿拉伯数字,以检查当前算法是否可以运行。 测试正在绿色进行,就是这种情况。 对于重构, 会出现一个问题,即替换由Java映射链接的2个索引表是否更好? 由于表中包含的值是通过2个相互连接的回路按路径递减的顺序排列的,因此当前的解决方案是更可取的,因为它更简单并且遵循KISS原理

    我们使用数字4(对应的罗马数字为IV)完成单元测试。 测试失败,这导致我们修改生产代码以使其通过。 第一种方法是为这种特殊情况添加紫杉,这会使测试变为绿色。 以下重构强调了数字IV本身应被视为符号。 它在数字表中的添加使您可以通过快捷键CTRL + D删除以前添加的紫杉。测试条始终为绿色,可确保程序的外部行为保持不变。

    我们程序的TDD开发工作仍在继续 ,我们将逐步完成一系列单元测试(图4)以及包含所有罗马数字及其阿拉伯等效项的表格。

    图4:获得的一系列单元测试

    这使我们在大约十个增量后可以得到下表:

    ARABIC_DIGITS = {1000,900,500,400,100,90,50,40,10,9,5,4,4,1};
    ROMAN_DIGITS = {“ M”,“ CM”,“ D”,“ CD”,“ C”,“ XC”,“ L”,“ XL”,“ X”,“ IX”,“ V”,“ IV” ,“一世”};

    使用阿拉伯数字(例如1954或3949)添加新的单元测试最终将不需要对生产代码的intToRoman方法进行任何更改。 由于在TDD模式下的这种开发而获得的单元测试系列为我们提供了最大的代码覆盖率(图5)。

    图5:我们程序的代码覆盖率

    结论

    有关TDD的介绍性文章将展示每个开发人员必须在其工具箱中拥有的这种实践的力量。 为了充分利用它,正如我们在示例中所展示的,有必要严格应用其规则。 TDD带来的范式转变涉及开发人员完全投入运作并提高生产率之前的学习阶段

    基于本文中从阿拉伯数字到罗马数字的转换示例,一个很好的练习是在TDD中执行反向转换方法。 最后,对本文介绍的站点的TDD问题进行改进是最好的改进方法。 简而言之,您将了解它,以便在TDD中取得一个唯一的口号,对任何技术,实践都有效!

    要发现开发有效的Java单元测试的好书并了解有关TDD的更多信息,可以阅读以下文章:

    发现7本书以开发有效的Java单元测试

    而且,如果您搜索用于学习Java编程的最佳书籍,就可以在这里找到我的选择:

    学习Java编程的6大最佳书籍

    翻译自: https://hackernoon.com/introduction-to-test-driven-development-tdd-61a13bc92d92

    测试驱动开发tdd

    展开全文
  • 通过结合实际的代码应用让大家对领域驱动开发有一个更好的理解。 章节1:基础介绍 课时1课程介绍 课时2创建基础项目结构 章节2:框架设计 课时3聚合根接口设计 课时4聚合抽象基类 课时5查询对象抽象设计5 课时6查询...
  • 模型驱动开发MDD

    2019-01-08 04:59:01
    模型驱动设计承诺带来开发时间的缩短、bug的减少以及更好的可维护性。这是黄粱美梦吗?或许Matthew Overington会说不是。 软件开发行业花了数年功夫经历了大规模成本削减的历程,并开始新的进展。对软件开发过程而...

    模型驱动设计承诺带来开发时间的缩短、bug的减少以及更好的可维护性。这是黄粱美梦吗?或许Matthew Overington会说不是。

    软件开发行业花了数年功夫经历了大规模成本削减的历程,并开始新的进展。对软件开发过程而言,我们需要更好的预测性、透明性和可信性。

    建模并不是一个新的名词。它是软件设计和开发中的重要一环,但企业目前正在进行更聪明和野心勃勃的计划,应用模型来解决很多多年的老问题。

    其中一个问题就是当前的编码方法对建模的依赖-只有当模型经常更新维护时它才是有用的。过时的模型实质上是无用的,实际上有时候还是反生产力的,导致bug……。你觉得模型中应该有的功能在实际代码中没有。而现在的趋势是希望可以得到这么一个框架,允许模型通过各种方式进行转换和应用,允许开发者从这些资源(译注:指这些模型)中得到更多用途。

    Borland APAC产品线的主管Malcolm Groves认为模型驱动开发(MDD, Model Driven Development)是继90年代的RAD和OO之后下一个革新。尽管RAD工具允许开发者快速地开发实际可用的代码,但其中很多生成的代码却很垃圾。也有人认为RAD的困扰在于效率的不够,因此开始使用UML模型,并手工编码来生成结构良好的代码。这样确实可以得到不错的结果,但却损失了速度。MDD承诺搭起这两者之间的桥梁,允许开发人员在快速同时便于维护的基础上开发高质量的代码。

    在RAD中,通常是架构师驱动开发的进行,数据库的结构在很大程度上决定了应用的形式。而使用MDD,开发者可以方便地在数据库和代码之间来回转换。使用今年底将发布的ECO III, Borland将提供MDD for C#, 和MDD for Delphi .NET。

    Borland正在努力用MDD来取代RAD,Grove认为对建模的更多依赖将是现实的途径。开发人员可以在更高抽象级别上工作而无需担心底层细节。模型驱动架构MDA提升了抽象层次,使开发人员可以关注于业务逻辑。

    继在定义UML中扮演了非常重要的角色之后,Rational对MDD也持相同的观点。Rational在1990年左右开始提供Rational Rose和后来的Rational XDE。Eclipse项目目前已经开放源代码,这也再次证明了Rational在该领域的领先地位。

    根据IBM公司Rational分部的售前架构师Davyd Norris的说法,代码生成方面更多图形化工具的开发是很自然的进化方向。“MDD是关于向抽象级别的转换,它允许一个项目中具有不同经验和想法的不同的人在一起工作,而不管他们更适应于哪个抽象层次的工作”。

    Norris认为企业架构师需要使用UML的敏捷方法,“企业们正在变得更加敏捷。更多的应用正基于高级别的模型进行开发。”

    对Norris而言,从底层的代码到高层的模型这些不同的抽象层次都是模型的一部分。他对代码就是模型的说法非常不屑,企业架构中有很多东西是无法简单用代码来表示的。通过转换工具可以实现不同抽象级别之间的切换,但它们都是对同一个问题价值相同的不同片断。

    微软的姿态稍有不同。OMG官方定义MDA是使用UML开发应用的方式,而微软却不打算用UML来进行模型驱动开发,而取而代之的是DSL(领域特定语言,domain specific languages),它被设计来支持特定的任务。微软认为UML用来表达设计的大概意图是有效的,但用来作为源语言却不合适,因为UML在addressability、可扩展性和一致性上都存在不足。

    Jack Greenfield是微软企业架构和工具部门的架构师,根据他的说法,Redmond方法将模型作为“软件开发的源工件,这些工具可以被自动地处理,比如进行验证、分析、跟踪和代码生成等”。这些模型的用途并不是作为文档。

    动力(Momentum )

    尽管先锋部队是Rational和Borland,还有大量小一些的公司有着同样的热情,并给出了不少强大的工具。

    以Embarcadero公司为例。他们提供了模型驱动的数据管理解决方案,其中可以创建模型并且该模型被整个开发链中的所有人所理解。该公司的arsenal中包含了为一个分析数据库应用所提供的模型驱动应用(ER/Studio),一个可视化建模和数据流设计工具(DT/Studio),以及一个模型驱动的分析、设计和开发环境(Describe)。这三个部分之间互相交互,可以将ER/Studio中得到的数据模型导入Describe,并构建完整的应用模型。也就是,可以从模型直接生成代码。

    Embarcadero公司的APAC地区主管Philip Ball指出,当前的趋势是解决多年的开发老问题-“意大利面条问题-什么东西都纠缠在一起。你可以改动一处代码,但你不知道你影响了多少其它的地方。”

    他认为模型的使用有助于提高开发过程的透明性,这将缩短开发时间,并降低bug带来的冲击。

    Ball认为,MDD是将推动开发中对元数据的更多依赖。“存在存储元数据的需要,这样开发人员可以得到一个更全局的视图,看到自己负责的部分在整个软件生命周期中的位置。”

    随着近年来数据的大量增长,Ball感觉这个问题越来越成为如何来控制的数据的问题;如何保持一个全局的视图同时可以有效地使用。根据Ball的估计,知识工人(knowledge workers)在开始工作之前需要花费50%的时间来理解他们面前的数据。“如果有模型和元数据,他们可以看到这些数据在更大视图中的位置,这样就可以削减这部分时间开支。”

    Rational的Davyd Norris同样强调在一个软件生命周期中全局性的好处。软件开发并不终止于测试。部署、维护和文档化也是同样重要,并往往会导致项目的成本超支。Rational致力于在整个生命周期中使用模型。这是一个很有野心的项目,但Rational已经为此努力多年了。

    MDD的流行甚至MDA为软件开发中各个环节上的人提供了好处,从DB设计者到架构师、底层开发人员。它允许项目主管可以更透明地监控开发;允许开发人员可以更快地回滚代码的变动;允许DB设计者在代码生成中担任更重要的角色;开发人员可以架起纯技术和业务层之间的桥梁。Philip Ball指出,“建模和开发之间的界限开始模糊。”

    现实世界

    底层开发人员也开始追随这个趋势了。Granite Solutions的头头Dick Walker是一位Delphi开发者,在过去15个月中他应用MDD加速了Ski Hire Shop的开发速度。3层WinForms业务应用处理预定、打包、付费等工作。他使用.NET remoting来支持客户端和服务端的通信,并基于Borland的ECO工具构建了应用。Walker看到了MDD在未来开发中将担当的重要角色。他认为构建应用的经验在于“识别系统中的对象和他们之间的关系”,根据Walker的理解,书写的定义和方法的过程中常常会为代码带来错误,因此这个过程的自动化将缩短开发的时间。

    当然不光有鲜花,Walker在使用C#Builder 和ECO的初期也遇到了很多问题,ECO现在还有很多限制。他认为这是“从RAD和DB对象开发到MDD应用开发的范式转换”。现在他已经度过了这个学习阶段,而且将不再回到过去的开发方式上去了。“MDD不是玩具,你可以用它来开发真正的应用程序。”他认为随着工具开发商的努力,只有天空才是限制(译注:MDD的限制会越来越少)。

    魔术棒?

    上面的这些往往使人们不禁认为MDD就是今天各种编程问题的答案了。不幸的是,现在我们还远远没有到可以有一个一劳永逸的方案能够给牙齿增白、防止脱发的时候。我们也不会有什么可以替代有经验的开发人员来书写好的代码。这些建模工具的发展只是辅助好代码的书写,而不是替代。

    MDD的扩展使用可以帮助开发人员报告需求、在合并和收购时集成各种应用,当项目结束的时候生成文档。MDD最本质的一点就是帮助您提升资产的重用。

    期望用UML来定义一个应用,然后按下一个魔术按钮,得到最终的应用,这是不现实的。开发人员还是需要挽起袖子,老老实实地编代码,这样才能得到优美而高效的应用。Philip Ball的总结很棒,他认为MDD是“not automating good design methodology”。MDD只是将一个开发项目中涉及的各种人都团结在一起,允许大家在各自擅长的抽象层次上进行工作。

    展开全文
  • 神话的破灭但是随着软件规模的扩大和软件复杂度的提高,无序的开发过程开始显示出它的弱点,首先,开发质量没有保证。软件错误随着软件复杂度的增加而增加。几次恶性的软件错误导致的巨大损失导致软件危机的出现,...
  • Android驱动开发全过程

    千次阅读 2019-07-01 20:41:21
    Android驱动开发全过程(有图有真相) 前言 意外在网上发现了这扁文章,看后感觉很有必要分享,所以整理并上传,希望大家喜欢。 Android硬件抽象层(HAL)概要介绍和学习计划 Android 的硬件抽象层,简单来说,...
  • 敏用户故事驱动开发系列之三:用户故事来源之“北极星”计划 本文是用户故事来源的第一篇,主要探讨产品经理从市场洞察的信息通过分析整理后,形成产品愿景,作为用户故事的重要来源! 《观象》载: 北极星在紫微...
  • 本节书摘来自异步社区《敏捷迭代开发:管理者指南》一书中的第2章2.2节风险驱动和客户驱动的迭代计划,作者【美】Craig Larman,更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 风险驱动和客户驱动的...
  • 测试驱动开发

    2010-08-20 18:10:00
    测试驱动开发方法 1.新增一个测试 2.运行所有测试,最新的测试不能通过 3.写代码 4.运行测试并全部通过 5.重构代码,消除重复设计 <br /> 1.资金实例--------------...
  • 测试驱动开发笔记

    2011-11-25 10:21:32
    《测试驱动开发》,弱弱的看了几十面,实在看不下去了。反正觉得总体一句话:首先确定测试(需要的功能),再快速的做出来,再在此基础上进行修改。 TDD(Test-driven development)测试驱动开发,是极限编程(XP)...
  • 哈喽,我是老吴,继续记录我的学习...拥有合情合理的日计划和周计划。二、Linux 字符设备驱动内幕 (1)正文目录:1. 什么是字符设备驱动? 2. 快速体验字符设备驱动和应用程序 (超简单的 demo) 3. 字符设备在内核里的...
  • 产品经理之驱动开发

    2015-01-02 19:04:49
    计划2015年每天写一篇文章 由于文章编辑器的效率实在太低,所以选择演示文稿导出成图片 部分内容直接使用我在曾经北京航空航天大学开设的《移动终端用户交互工程》的演示文稿,同样效率原因因而直接贴图片
  • 哈喽,我是老吴,继续记录我的学习...拥有合情合理的日计划和周计划。二、Linux 字符设备驱动内幕 (1)正文目录:1. 什么是字符设备驱动? 2. 快速体验字符设备驱动和应用程序 (超简单的 demo) 3. 字符设备在内核里的...
  •  说起domino估计对这个有相关...我刚毕业那年,计划是找份C++的工作的,不过事情就是那么有姻缘,有个公司想叫我过去搞domino开发,我稍微了解了一下,感觉还蛮有意思的,就答应了。其实编程都是一通百通的,多
  • android 驱动开发介绍

    2013-10-10 11:12:01
    Android 的硬件抽象层,简单来说,就是对Linux 内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把 对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel ...
  • 首先需要了解什么是行为驱动开发(Behaviour Driven Development,简称BDD),BDD是一种融合了可接受性测试驱动计划(Acceptance Test Driven Planning),域驱动设计(Domain Driven Design)以及测试驱动开发...
  • 测试驱动开发(TDD)

    2013-10-10 15:11:08
    测试驱动开发(TDD)  在敏捷开发中,我们强调通过快速迭代,客户反馈,精简文档等来更加灵活快速地响应变更,不断得修正计划,那在这个过程中如何保证代码的质量呢?  极限编程就是这样一套方法来帮助团队...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 825
精华内容 330
关键字:

计划驱动开发