想要让一个失败的测试用例通过而编写生产代码,
最后却不得不先编写该测试用例?
现在,有了Neo区块链工具包,
开发人员就可以充分利用测试驱动开发技术
来构建应用程序了。
本篇将带你深入了解面向专业程序员的工具包:
Neo区块链工具包
对于熟悉密码学的人来说,有一个不对称的现象十分有趣。开发人员在有测试用例的情况下可以(创)重建生产代码(Production Code),却不能轻易地从生产代码中创建测试。因此,测试是一种单项功能的集合 – 活板门功能;这意味着生产代码的测试可能比生产代码本身更重要。
对于需要调试代码的人(也就是世界上每一个程序员)而言,还有另一个不对称现象:在新项目上使用测试驱动开发的开发人员通常会发现,与没有调试程序的项目相比,他们调用调试器的次数更少。测试驱动的开发具有强大的版本掌控,使开发人员可以还原到通过所有测试的最后一个版本,并且有时可以比低质量的调试代码更有生产力。
下面让我们深入研究测试驱动开发(Test-Driven Development),以及为什么我们在Neo区块链工具包中建立了对测试驱动开发的支持。
测试优先
在部署之后进行测试是徒劳的;使用测试驱动开发时,首先进行测试,即逆转开发软件以进行测试(通常为部分测试)。
编写测试以验证预期功能的行为,然后编写实现该功能的代码具有两个关键含义:
●测试将作为开发指南针以指导开发人员专注于预期的结果
●将测试用作跟踪器,以指示完成代码的程度
此外,使用这种方法,开发人员将拥有可以重复运行的测试或测试套件,以确保即使对代码进行了其他不相关的更改并逐步添加了其他新功能,其原本的功能,行为以及结果也可以按照预期工作。
对于企业主的好处在于,测试驱动开发鼓励并推动了开发人员一次将应用程序开发成一个“小”功能,从一个稳定且功能强大的版本到另一个版本间采取“小”步骤。测试用例的频繁应用有助于在早期识别,解决错误,从而防止它们在以后造成代价昂贵的业务问题。
测试驱动开发实践
测试驱动开发强调便捷性,即开发人员编写最简单的代码以通过单元测试。编写单元测试,观察它是否失败,然后更改代码,直到通过为止。
Q什么是单元测试?
单元测试通常是一个“小”测试,即低级别的测试,侧重于整个应用程序的“小”部分(代码)。进行单元测试的结果是二进制的:如果代码的性能与记录的预期一致,则“通过”,否则 “失败”。此外,单元测试应该是“确定性的”,即它不应具有副作用。
测试驱动开发通常有以下五个步骤:
1对功能(或程序错误)的要求:了解初始要求,但在此步骤中不需要过多的文档,因为测试驱动开发将有助于在周期的后段完善细节。
2单元测试:如前所述,通常是由应用程序开发人员编写的简短代码,目的是运行目标应用程序代码库的有限部分。
3实际运用的过程中,尝试编写满足要求的代码,然后运行单元测试。重复此步骤,直到代码通过单元测试。
4实现的重构:在不修改外部代码行为的情况下“改进”现有代码的内部特性,以简化内部设计并提高代码理解度。
5随着需求的增加,重复上述步骤:每个周期很短,循环效率很高,从而可以更安全地完成重构,以交付最高质量的生产代码。
为了使这个周期有效,单元测试应该能够执行被测试代码的行为,而不必依赖于其他代码或受无关代码的影响;“模拟”对象通常用于在现实世界中简化此操作(参考去中心化预言机)。模拟对象是强大的进程;在实践中,模拟的使用在重要的架构(architectural boundaries)上最有效。
驱动测试开发+区块链:
全新的Neo3区块链工具包助力开发
区块链应用程序开发在测试驱动开发方面提出了独特的挑战,因为去中心化应用程序平台不同的一点在于它们默认情况下不适合测试驱动开发。Neo区块链工具包完美解决了这些问题,并提高了解决程序员专业需求的能力。下面列举了一些范例。
●开发内循环
●微软使用术语“内循环”来描述开发人员在编写,构建和调试代码时执行的迭代过程。每个开发人员和开发团队的内在循环都将根据他们使用的工具,使用的堆栈(the stack that they work on)以及各个开发人员的偏好而有所不同。
借助Neo Express对Neo3的新脱机模式支持,Neo区块链工具包可优化开发人员的“内循环”,并使开发人员能够在几秒钟内快速重置其私有网(PrivateNet),重新部署其智能合约并重建检查点。用时快到足以包含在自动构建过程中。
●3A原则(TheArrange-Act-Assert Pattern)
●3A原则是一种为正在测试的函数编写单元测试的方法。
单元测试方法的「部署」部分会进行初始化;部署传递到被测函数的初始前提条件和输入值
「执行」部分使用已部署的输入值来调用被测函数。
验证部分「断言」(验证)该功能是否按预期执行且结果与预期相符。
对于区块链应用程序开发,此模式的“部署”部分并非无关紧要;因为去中心化式堆栈的特点使得测试设置复杂化。Neo区块链工具包通过在私有网(PrivateNet)中检查点功能的创新应用,使这组任务变得相当简单直接。
多语言开发和测试优先
Neo协议以其多语言开发方案引领行业。程序员首次可以使用多种语言(C#,Python,Go等)进行编程。Neo区块链工具包以此为基础进行设计,并且该工具包附带的测试框架可以在测试者选择的编译语言下编写合约测试。
这再次扫清了障碍,使更多开发人员能够在构建测试套件上做出贡献。
通过测试驱动开发来优化体系结构
测试驱动开发在很大程度上塑造并影响了应用程序的架构。
1对测试用例的关注需要开发人员去理解客户,从客户角度出发。也有一些测试用例需要开发人员与其他开发者相互理解。他们需要精确地编写好文档,使其与服务和组件接口相匹配。测试驱动开发使开发人员以契约式设计方法使用“断言”的类似原则来处理代码。
2测试优先通常会使代码的模块化和可扩展性增强。因为测试驱动开发要求开发人员从“小单元”的角度来思考,这些单元可以独立实现和测试,然后集成部署在一起。这造就了更高的内聚性——即在一个用户模块或组件中,所有的行为与功能同属一个整体且聚焦。
3模拟对象设计模式需要通过服务和组件的松散耦合来进行测试,并促使开发人员使用接口来强化架构边界。这促进了代码和组件的模块化,因为组件需要能够在测试网,私有网和主网之间灵活切换来进行部署。
「模块化」、「松耦合」和「关注点分离」等概念背后的思想长期以来一直是好的架构的基础;测试驱动开发对这些概念的强调或许正好印证了好的体系结构是易于测试的,反之亦然。
总结
在实践中,十分常见的情况是,为了让一个失败的测试用例通过而编写生产代码,最后开发人员却不得不先编写该测试用例。然而,应用程序的体系结构、服务和组件的设计、模式重构以及产品代码的质量对于开发的结果而言,都是非常重要的。
现在,有了Neo区块链工具包,开发人员就可以充分利用测试驱动开发技术来构建应用程序了。
关于 Flamingo 的更多信息,
欢迎添加客服微信号:flmoon2020。
作者:John deVadoss,来源:Neo智能经济
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。