今天我们讨论区块链中软件测试的重要性,介绍自动化测试的优点,以及如何参与我们的开源项目质量保证(Quality Assurance 

许多区块链项目在达到初始生产状态之后无法存活太久。对大多数项目来说,缺乏合适的软件测试是它们失败的一大主因。据估计,仅去年一年,就因代码漏洞而丢失5亿美元以上的加密货币。您可能听说过DAO代码漏洞,攻击者从基于以太坊的智能合约中抽取了360万ETH(当时价值7000万美元)。另一个例子是奇偶校验漏洞(Parity Bug),导致1.5亿以上美元被永久冻结。就连比特币自身也难逃黑客攻击。去年年底,一个代码漏洞允许作恶者通过双重输入人为地增设比特币供应量。如果不能迅速识别和解决漏洞,就可能对网络造成灾难性的影响。这还仅是冰山一角——缺乏经验或粗心大意的开发人员造成小事故数之不尽。

这告诉我们什么?在开发中,欲速则不达。这就是软件测试对任何使用区块链技术的项目如此重要的原因,例如区块链平台、区块链应用程序或基于区块链的服务。

本文将讨论在开发区块链应用程序平台Lisk时,我们在软件测试方面的经验和最佳实践。还将向您展示自动化测试如何改进我们内部的工作流和提升代码可靠性,以及如何参与测试我们的开源软件。

我们将本文把它分成以下章节:

1.    区块链和Lisk简介

2.    什么是软件测试?

3.    区块链应用程序测试为传统的软件测试增设了新的指标

4.    为什么区块链开发人员需要更多地关注细节?

5.    自动化测试可以显著缩短发布过程

6.    不同类型的自动化测试

7.    持续集成(CI)是自动化测试的最佳实践

8.    选择哪个CI平台?比较Travis CI 、CircleCI 、 Jenkins

9.    软件测试是不够的——引入质量保证

10.  手动测试如何减缓我们的软件开发过程?

11.  我们如何在Lightcurve上实现质量保证?

12.  QA团队的影响

13.  Lisk的QA测试流程

14.  参与我们的开源自动化测试

15.  如何为我们的QA做贡献?

16.  我们能为您提供哪些QA工具?

17.  结论

区块链和Lisk简介(如果您是Lisk社区成员,可以跳过这一部分)

您可能听说过比特币等区块链,但是什么让这种新技术如此特别呢?区块链是一种分布式账本技术(DLT),是一种开源的分布式数据库,以一种有效的、可验证的方式永久地记录各方之间的交易。这些交易被打包进区块,用密码签名并形成实际的链。存储在区块链中的数据不能更改或篡改,所有记录不可变。一旦数据被保存到分类账中,它就会永远留在那里。同时区块链也是一个去中心化的网络,这意味着没有一个中央权威机构控制它。

人们对区块链感兴趣,但很难在其上真正开发一个可工作的产品。由于各种各样的原因,区块链开发人员似乎仍然很罕见,包括需要熟悉陡峭的学习曲线。Lisk计划通过使每个开发人员都可以轻松地用JavaScript构建和部署区块链应用程序来解决这些问题。Lightcurve是一家位于德国柏林的区块链产品开发工作室和咨询公司。我们目前专注于开发Lisk的各个方面,包括产品、市场、社区和设计。

自动测试如何提升区块链开发速度和质量?-LISK应用链

什么是软件测试?

基本上,软件测试可定义为一组确保软件的行为符合预期的活动,无漏洞。一个适当的软件测试过程将帮助您识别和防止漏洞,确保特殊特性的实际实现与需求相匹配,并提升对代码的总体信心。

区块链应用程序测试为传统的软件测试增设了新的指标

区块链应用程序测试与非区块链应用程序测试没有多大区别。只是区块链还涉及其他测试指标,例如:

  •  链的大小 区块链越长,包含的数据越多,导致数据存储占用空间更多。链可以迅速增长,其实际大小没有限制,它会不断地添加新区块。我们需要知道在一定时间内,链上存储数据的最大值。这样就可以估计一年后区块链占用多少空间。
  •  区块链中的吞吐量 是通过每秒的交易数(TPS)来度量。TPS越高越好,但它会促使整体网络负载的成本增加,并不是每个节点都能赶上。TPS作为扩容的一个因素,在区块链行业是一个挑战,也是一个热门话题。许多项目盲目地追求TPS,而没有关注其他更重要的性能指标。常常导致项目变得中心化,从而否定了区块链的思想。
  •  安全与加密需要经常检查和审计代码,以确保在创建新代币、维护帐户余额、验证区块或交易签名方面没有漏洞。
  •  数据完整性 确保存储在区块链上的所有数据和网络节点之间的数据一致。由区块和交易的密码学保证。然而,一些区块链应用程序在内存或数据库助手中计算和维护状态(例如实际的帐户余额),以确保数据一致性。除了直接比较节点之间的数据外,没有其他方法。
  •   数据传播 指将数据从一个节点分布到另一个节点。去中心化网络由数千个节点组成,各个节点之间需要保持一定数量的连接。当部分数据到达一个节点时,需要在不中断的情况下将其转发到整个网络。这种传播所花费的时间是一个重要的度量指标。

为什么区块链开发人员需要更多地关注细节?

如果中心化系统中引入了一个漏洞,其修复相对简单。即使该漏洞破坏了一些数据,也很容易纠正。因为在大多数情况下,维护应用程序的公司完全控制数据。考虑到区块链是不可变的账本,即使纠正被破坏的数据,也是难以置信地困难。更复杂的是,交付修复需要与网络的所有参与者协调。而在Lisk,我们必须与数百个节点运营商以及DPoS共识算法中被称为受托人的区块生成者协调每个版本。考虑到以上,区块链应用程序中出现漏洞的后果可能比中心化软件中的漏洞危险得多。

在开发中,欲速则不达。

自动化测试可以显著缩短发布过程

上面我们已经讨论了测试在区块链项目中的重要性,下面根据执行测试的方式来划分实际的测试:

  •   手动测试由QA/测试工程师执行,当一些测试场景还未完成迁移或准备以自动化的方式执行时(例如新特性),手动测试非常有用。但由于各种原因,如难度、时间和预算限制,并非一切都可以用手动测试。总的来说,手动测试是最耗时的方法。
  •   自动化测试是持续交付的基础。它是一种让开发团队将更改项安全地部署到生产环境中的开发方法。持续交付使开发人员能够快速发现漏洞,并帮助团队充满信心地交付新版本。对于复杂的应用程序,自动化测试可以将发布过程所需的时间从数月或数年减少到数天甚至数小时。从而投入时间来实现高质量的测试套件,极大地提高开发人员的生产力。但同时,需要实现和维护测试场景和执行其基础设施。

不同类型的自动化测试

我们可以划分为几种自动化测试类型,例如单元测试、集成测试和功能测试。在一些现有的测试套件中,这几种类型是相互混淆的,它们之间没有区别。使得测试套件不适应任何特定的功能。开发人员需要理解不同类型的测试,因为每个测试都扮演着独特的角色。

  •   单元测试被用作开发人员的快速反馈机制和开发过程中的“第一道防线”。在单元测试中,使用模拟输入独立地测试特定的代码单元(函数),主要测试单元中的逻辑。这意味着I/O操作(如文件访问、Ajax/RPC调用、DOM交互)、计时器和昂贵的函数(加密)通常是虚拟的。
  •   集成测试是一种针对单元中模拟依赖项协议变更(例如参数顺序)的防御机制。在集成测试中通常没有存根,而是测试单元之间的实际交互。因此,集成测试比单元测试更昂贵。
  •   用Eric Elliott的话说,功能测试通常被认为是集成测试的子集,因为它们一起测试应用程序的所有部分。

对于复杂的应用程序,自动化测试可以将发布过程所需的时间从数月或数年减少到数天甚至数小时。

持续集成是自动化测试的最佳实践

持续集成(CI)是一种软件开发实践,将代码频繁地集成到共享存储库中。每当团队成员向版本控制(例如Git)提交一些代码更改时,就会触发构建和测试代码的自动化过程。鼓励开发人员在完成每个小任务(修复问题、实现特性)之后,一并提交代码与测试(单元、功能、集成)。自动构建系统获取共享存储库中的最新版代码,并在需要时应用更改项。然后对它执行所有预定的操作,比如执行测试。CI被认为是最佳实践,因为软件开发人员要将自己做的所有更改与开发团队的其他成员所做的更改集成起来。这样避免合并冲突、难度漏洞或重复工作。这是因为CI强制将代码连续地合并到共享版本的控制分支中,从而尽早识别潜在问题。最大地缩小调试和代码评审所需的时间,让开发人员更关注于添加特性。

选择哪个站台?比较Travis CI CircleCIJenkins.

目前少数的流行CI平台因功能和灵活性而异。其中一些是免费的。一些需要付费。

  •   CircleCI很容易上手。可以使用一些免费计划,但也有一些限制,比如1个并发作业与1个容器,没有并行性。它是一个基于云的工具,所以自己无需托管基础设施。它有各种集成,如GitHub、Slack、Jira等。初始设置非常简单,有很好的客户支持。
  •   Travis CI与CircleCI非常相似,但是Travis CI更加灵活。它允许您同时在Linux和Mac OS X上运行构建和测试,并支持更多的语言(甚至提供教程)。对开源项目免费。
  •   Jenkins是领先的开源自动化服务器,也是最灵活的一个。您需要自己托管,因此需要在初始设置和稍后维护它时需要进行一些操作。Jenkins允许您完全控制构建的各个方面。它还支持用插件进行扩展,现在已经有数百种可用的插件,所以您可以将Jenkins与任何您想要的工具集成。虽然将Jenkins用于小型项目可能有点牛刀小试,但对于大型项目来说非常友好。

 仅软件测试是不够的——引入质量保证 

虽然软件测试非常重要,但也属于更广泛的质量保证范围内。质量保证(QA)不仅仅是测试。它囊括了整个软件开发过程,诸如需求定义、软件设计、编码、源代码控制、代码评审、软件配置管理、测试、发布管理和产品集成等过程。

自动测试如何提升区块链开发速度和质量?-LISK应用链

开发和质量保证周期

手动测试延缓了软件开发过程

对于科技初创企业,在最初制定流程的几年面临挑战很正常,Lightcurve也不例外。我们没有足够的资源用于软件测试,但是我们仍然需要做尽可能多的测试,以确保每个新软件版本的质量和可靠性。例如,在私有网络上测试漏洞修复或特性:

  •   准备从源代码构建的二进制文件
  •   启动云基础设施(多个虚拟机,10~500个)
  •   在所有机器上部署软件
  •   执行实际的测试场景
  •   收集进一步调查的日志
  •   清理实例(销毁VM)
  •   分析测试过程中收集的日志

最初,我们的大多数测试是手动的,因此很耗时。在许多情况下,软件测试还需要DevOps团队的协调和帮助。我们无法在合理的时间内测试所有协议特性和场景,因为对所需的工作量和时间的要求很高。于是,我们在改进和为产品套件添加新特性时出现了延迟。现在我们不再仅依赖手动测试。四个月前,我们在网络开发团队中建立了自己的QA团队,涵盖了与软件测试、实现流程、自动化测试和执行高质量标准相关的所有缺失部分。

Lightcurve如何实现质量保证

我们已经建立了不同类型的测试,现在来看看在Lightcurve上如何执行QA,以及我们引入了哪些确切的流程来消除向生产交付不可靠代码的风险。

QA团队改进了以下方面

  •   将测试场景并入测试计划设计。QA团队与开发人员紧密合作,识别正在开发的特性,然后精心设计测试场景。在大多数情况下,QA还负责编写覆盖之前设计的场景测试,然后执行测试并评估结果。
  •   自动化测试框架。我们实现了自动化执行各种测试场景。包括完整性测试、回归测试、网络测试(区块和交易传播、p2p通信、向后兼容性等)、安全性和容错网络测试。这些测试是我们持续集成(CI)的一部分,也可以由开发人员按需执行。
  •   Jenkins和Ansible的持续集成。在Lightcurve中,我们受益于Jenkins的灵活性,同时还必须并行执行多个任务。我们还希望完全控制整个工作流。目前我们已经自动化云提供商创建的构建和启动测试网络的过程。为了使测试尽可能接近真实场景,我们在不同的区域(美国、中国、欧洲、亚洲等)部署节点。同时使用Ansible作为编制工具,只需按下按钮就能启动网络。
  •   用于性能测试的NewRelic APM.区块链项目生命力的一大主要指标是网络的持续性能。因此监控每个版本的性能变得非常重要。我们的QA团队使用NewRelic APM来确定性能是否改进或下降。然后在发布之前反馈给开发团队以纠正问题。为了确保在大量交易期间,网络的行为符合预期,我们运行各种类型的压力测试(不同的交易类型,不同的工作负载)。我们正在监控CPU和内存使用、I/O吞吐量和API响应时间等指标。另一个需要检查的重要因素是内存泄漏。当代码需要将内存用于特定任务时,会自动分配内存(例如在创建对象时),当不需要时便释放内存。有时情况并非如此,应用程序拒绝清理内存。然后内存就会被消耗掉。内存泄漏导致应用程序内存增长缓慢(有时非常缓慢),直到最后占用所有可用内存并导致崩溃。为了提高开发中的总体灵活性和代码可靠性,我们目前正在通过产品套件迁移到TypeScript。

自动测试如何提升区块链开发速度和质量?-LISK应用链

NewRelic APM交易概述

自动测试如何提升区块链开发速度和质量?-LISK应用链

NewRelic APM CPU和内存利用率图

Lisk网络的QA测试流程

在区块链中,小版本在到达生产网络之前要经过测试阶段。Lisk有以下网络类型:

  •   Devnet是一个临时的、短暂的网络,创建它是为了针对新更改执行测试,而这些新更改并非发布版本的一部分。
  •   Alphanet用于测试我们的新版本alpha网络,在这个阶段我们需要一个更大的网络来重现真实的场景。
  •   Betanet是我们用于测试beta版本的公共网。只有在代码基发生非常大的变化时才会测试。在大多数情况下,我们跳过这个网络。
  •   Testnet是一个推送候选版本的公共网络。Lisk的Testnet拥有大量的历史数据。
  •   Mainnet是一个包含实际区块链的公共生产网络。

我们的自动化测试是为了使开发人员能够在Devnet或Alphanet上运行测试。实际的网络大小是可配置的,范围10~500个节点。NewRelic APM监控与我们的软件集成,并支持每个节点。一旦执行了所有必需的测试并评估结果,就可以决定是否发布Testnet的特性或修复。经过一段合理的时间之后(取决于发行版的大小和复杂性),我们将把它推送到生产环境,或者称为Mainnet(主网)。

自动测试如何提升区块链开发速度和质量?-LISK应用链

Jenkins CI管道报告

上面的图片是Jenkins CI管道流和一份测试报告。Jenkins CI管道由多个阶段组成,包括:

  •   构建Lisk核心软件:在这个阶段,Lisk核心软件将从一个特定的分支构建(默认是开发),成功构建会在其名称中创建一个带有唯一哈希的tar文件(例如:lisk-1.5.0-alpha。 2- b430af6-Linux的x86_64.tar.gz).
  •   将软件部署到多台机器上:一旦软件构建成功,它将被部署到多个节点复制网络行为。
  •   支持受托人锻造:此时,所有节点都已经启动,并加载了网络的创世区块。现在我们需要移动区块链,因此在这一步中我们启用锻造,因为受托人正在生成区块。
  •   执行协议的测试场景:一旦网络移动,将在网络上执行Lisk协议特性测试。这些测试包括完整性、回归和新特性,确保所有与协议相关的基本场景按预期工作。
  •   管理网络压力测试:运行压力测试是为了确保网络在高度的交易负载下仍然稳定。它们涉及发送支持的最大交易量。我们期望网络处理负载并接受给定区块槽中的所有交易。

管道被配置为每晚运行,使开发团队按时并以适当质量创建每个版本。因此,开发人员可以在使用QA自动化框架开发网络时测试特性。如果出现任何故障、向后兼容性问题或性能更改等,可为开发人员提供即时反馈。

参与我们的开源自动化测试

Lisk忠于开源精神。因此,鼓励所有开发人员使用我们的QA工具参与到确保开源网络的持续质量和安全性的工作中来。

如何为我们的QA做贡献?

关注我们公开的Jenkins界面,观察我们的质量保证进展。但如果您想使用测试套件,则需要设置节点和网络。为此,请阅读Lisk的官方文档。您将特别需要遵循Lisk核心设置章节来启动和运行区块链网络。接下来,您可以按照Lisk核心QA存储库中的说明设置QA工具。

自动测试如何提升区块链开发速度和质量?-LISK应用链

我们能为您提供哪些QA工具?

现在您已经知道如何设置Lisk核心节点,您可以参与以下工作:

  •   使用QA循环检查表模板,以涵盖所有可能的场景
  •   BDD特性场景及其步骤定义
  •   支持和测试实用程序
  •   网络配置工具
  •   压力测试场景

如果您是一名开发人员,并且希望为Lisk的质量保证流程做出贡献,那么您需要遵循贡献指南。可以分享自己的见解或加入关于Lisk.Chat’s Network Channel讨论。

结论

从不可变到去中心化,区块链的发展呈现出自己的一套挑战。使软件测试对于区块链行业比对于中心化应用程序更加重要。更复杂化的是,软件测试本身就是一个选择复杂。Lightcurve引入自动化测试,并配备了专业的QA部门,极大地提高了开发速度和Lisk的代码库质量。但就区块链而言,社区等同于安全。使用以上QA工具参与测试,从今天开始为我们的网络开发做出贡献。

原文链接:

https://blog.lisk.io/how-introducing-automation-testing-for-our-blockchain-significantly-improved-development-speed-and-10c0a6934e37