- DApp:开发一条龙,测试一条虫?你可能需要看看教科书级别的测试流程代码是怎样的!
- 来源:区块链大本营
来源 | 《区块链开发实战:基于JavaScript的公链与DApp开发》
责编 | Carol
出品 | 区块链大本营(blockchain_camp)
#听说文末有彩蛋?
2017年,这一年有点特别,许多先进的技术和新的概念集中在这一年迸发。小程序火了、新零售火了、区块链火了、人工智能火了、物联网也火了。
它们有的是首次面世,也有的是早已默默发展了很久,等待一个契机走向大众。
而这当中出现过一个让人印象深刻的小插曲:
这个回答曾经在网络上红极一时,在开怀大笑的同时也不禁发人深思:新的技术若无法落到具体的应用场景解决问题,终究还是纸上谈兵。
区块链技术更是如此。虽说目前区块链的一些技术瓶颈还有待突破,但开发者们应该积极去探索、多尝试,尤其是在应用方面。其中开发DApp就是一个很好的选择。
不得不提的是,在开发DApp时,大部分开发者都会把重心放在开发的过程中,但实际上,还有同样值得开发者们注意的重要一环:测试。
接下来,我们就以抽奖合约为例,从抽奖合约的整个测试流程代码来讲解如何对合约与接口进行测试。
做好准备,又要开始我们的干货时间了。
编写测试用例之前,我们先熟悉一下 base 文件中的函数,这些函数作为测试工具提供给测试用例调用,封装了合约和访问接口代码。
1、初始化函数编写测试用例之前,需要将常用的方法抽离封装,放入base 文件中,这里我们使用了 supertest 和 chai 作为主要的测试框架,大家可以在源码文件中找到测试文件中的声明。以下是初始化相关的函数:
我们看 init 方法中,对 DApp 的 id 进行了查询,根据应用的名称从主链动态获取当前侧链应用的 ID ,为后续测试接口的调用初始化 DappId 数据。
接下来我们看一下测试常用的工具函数。
2、区块等待在发起一笔交易之后,需要等待交易确认之后再执行下一步的操作,调用 sleep函数进行等待,之后继续执行。这个函数在测试流程中会多次使用,因为 10 秒一个区块的特性,很多的操作需要在区块确认之后获得验证,不仅是写操作,读取的接口依然需要在上一次写操作之后等待区块确认才能获取到最新数据。区块等待相关函数如下所示:
randomSecret 返回的是一个随机生成但被截取之后的字符串。通常情况下,Asch 只支持符合 BIP39 规范的密钥字符,也就是我们熟悉的“助记词”格式的密码,但这里为了测试方便,直接使用随机的七位字符串,同样可以算出符合规则的公钥,也能计算出地址。当然,随机账户也支持通过指定助记词的方式获取公钥与地址。
b. 转账转账在 DApp 以类型 2 的合约实现,所以这里的转账就是在调用 DApp 内部的合约,我们可以在 giveMoney 函数中看到合约调用的格式。
合约参数结构如下:
secret为合约调用者的秘钥,String 类型。
fee为合约调用手续费,bigNumber类型。
type为合约类型,Number 类型,与自定义合约数据对应。
args为合约参数,Array类型。
注意:
我们看到 giveMoney 调用合约时请求了 /transactions/unsigned 接口,这个接口可以接受未签名的参数和密钥执行合约,这样做在测试环境虽然没有问题,但是在正式的生产环境中会有很大的风险,我们的私钥内容会有被网络劫持的风险,所以在调用合约时,尽可能避免通过网络传输自己的密钥,而是用本地签名的方式加密参数,然后请求 /transactions/signed ,这点一定要十分注意。
上面的代码通过接收签名参数调用合约的接口,这个函数发送了命名为 transaction 的参数,trs 是用 asch-js 前端 JavaScript 工具库进行签名返回的 transaction 对象。我们来看一个例子:
我们来看签名后的 transaction 参数是什么样子:
与上面未签名调用转账接口的参数对比,本地签名后得出的参数中少了 secret 属性,多了 signature 属性,而这个属性把通过 sha256 算法得出的私钥与整个 transaction 参数经过哈希计算之后得出,用于后端接口对参数验证。
其他的合约调用基本上都按照发布文章合约的结构组织参数,完成合约调用的封装。这样,我们就可以着手编写测试了。
合约流程测试
首先,在测试用例 before 函数中初始化测试变量、DApp 数据和创始账户信息作为后续测试函数的基础,然后执行获取频道列表的测试用例。我们使用 await base.dappApiGetAsync('/channels') 请求一个 API,获取到频道列表信息,并用断言库校验结果。
下面我们对核心的业务流程进行测试,测试的思路如下:1)创建频道。2)初始化账户。3)在频道里创建包含抽奖模式的文章。4)模拟三个用户各打赏两笔。5)文章结算。6)获奖用户领奖。7)检查各自账户的余额。
核心业务流程的代码如下:
上面的代码使用受托人创建了一个新频道,并通过频道查询接口通过交易 ID 获取到了频道的 ID,完成了基本的测试逻辑,同时保存了 channelId 作为后续创建文章的数据。
注意:await base.onNewBlockAsync() 是在等待区块确认之后再继续执行。我们看到最初先给账户转入 10500 的 Token,用于创建频道和更新频道的消耗。
在上面代码中,首先进行账户的初始化,生成了四个账户,一个账户负责创建文章和结算奖励,另外三个作为打赏用户。然后对创建的文章执行两次打赏,为了验证方便,新创建的账户两次打赏的总额为5个Token,创建文章的账户拥有 0.2 个Token,操作之后扣掉手续费保证在结算之前账户余额都是零,方便验证。
另外,我们为了测试需要,将后端关于区块高度的限制暂时去掉,并设置结算区块高度为当前的高度加 2,这样,在用户投票之后直接执行结算。
提示:测试代码中,创建频道或文章之后,因为需要区块确认,所以我们没有办法立即获取到数据的 ID,只能先拿到 transactionId,待区块打包之后,再通过查询接口用 tid 获取实际的数据 ID,再进行下一步的操作,测试文件中,会出现很多这样的处理,这也是区块特性所决定的。
用户打赏测试代码如下:
上面代码中,用另外三个账户对文章进行了打赏,每个账户打赏两次不同的金额,但总额是 5 XCT,所以最终文章的抽奖池中,应该是 15 个 XCT,结算结果根据 15 XCT 的总额进行验证,然后验证文章投票额与投票者的余额是否正确,代码如下:
合约中对抽奖模式的结算规则是受托人 10%,作者 30%,获奖者60%,因为受托人的奖励是平均分给三个账户,所以验证不是那么方便,不过我们只要验证作者和获奖者的奖励额就能确定结算是否正确,那么最终的结果是作者获得 4.5 个 XCT,抽奖人获得 9 个 XCT。
验证奖励测试代码如下:
最终,在根目录执行 npm test ,等测试运行结束,就能看到应用测试执行的结果了。
总结
本文摘自《区块链开发实战:基于JavaScript的公链与DApp开发》,感兴趣的小伙伴也可以直接点击链接购买本书
看完本文,有没有蠢蠢欲动想要尝试一下的冲动?不要着急,在评论区写下你对DApp开发或测试的感言、或基于本文的测试方式的新想法,营长将选出3条精选留言,免费送《区块链开发实战:基于JavaScript的公链与DApp开发》纸质书3本!!!截止时间9月19日中午12点,快拉到文末留言吧!
推荐阅读:
LTC逆袭活跃地址一周增长84! ETH、BTC、BCH每秒交易均呈负增长! 以太坊网络传播时间再缩短| 数据周榜AI大神如何用区块链解决模型训练痛点, AI+区块链的正确玩法原来是这样…… | 人物志硬核干货! 你的业务是否适合上链、上链有那些坑?dfuse、慢雾、MYKEY大佬为你为你指点迷津…
上云难?TA霸气回应:不要你觉得,一键上云 so easy
阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路
5大必知的图算法,附Python代码实现
适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?
顶配12699元、没有5G,“浴霸三摄”的iphone到底长什么样?
猛戳""有惊喜哟

老铁在看了吗?👇
CSDN App

扫一扫下载订阅号助手,用手机发文章
赞赏
长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。
已同步到看一看
取消
发送
我知道了
朋友会在“发现-看一看”看到你“在看”的内容
确定

已同步到看一看写下你的想法
最多200字,当前共字
发送
已发送
朋友将在看一看看到
确定
写下你的想法...
取消
发布到看一看
确定
最多200字,当前共字
发送中
微信扫一扫
使用小程序
取消
允许
取消
允许
知道了
确定
区块
-
-
- 独家专访 | 融资233万美元后,DappRadar联合创始人首谈DApp与DeFi发展现状
- 近日去中心化应用平台DappRadar宣布完成233万美元种子轮融资,此次融资主要来自Naspers(又称南非报业),以及Blockchain.com Ventures和Angel Invest Be
- 陀螺财经
-
-
-
- DApp:开发一条龙,测试一条虫?你可能需要看看教科书级别的测试流程代码是怎样的!
- 来源 | 《区块链开发实战:基于JavaScript的公链与DApp开发》 责编 | Carol 出品 | 区块链大本营(blockchain_camp) #听说文末有彩蛋? 2017年,这一年
- 区块链大本营
-
-
-
- 比原项目周报(2019.09.13更新)
- 点击蓝字关注 比原链公众号 技术开发进展 Vapor: 1. API接口文档更新; 2. 修复blockmeta服务器切换事务过程中遇到的bug; 3. 优化事务同步代码,提高同步速度; 4
- 比原链Bytom
-
-
-
- 全球区块链早讯(9.13)
- 每日行情快讯:BTC在10360附近震荡,主流币多数横盘整理 BTC今日冲高回落,目前在10360附近震荡整理,主流币多数横盘。BTC在火币上现报10374美元,日内涨幅0.52%。 1.全球数字货币
- 全球区块链早讯
-
-
-
- 现金奖| 合约党负隅坚守,币安一次给出2个好选择
- 养成随手关 注的好习惯 投资者总是在寻找稳定增长潜力的交易产品,投机者却总是在寻找短期投资热点,但无论如何,投资者和投机者都是数字货币交易市场的重要组成,如何满足他们的不同需求成为了区块链新金融市场的
- 区块链早餐
-
-
-
- LTC逆袭活跃地址一周增长84! ETH、BTC、BCH每秒交易均呈负增长! 以太坊网络传播时间再缩短| 数据周榜
- 作者 | Carol 出品 | CSDN、amberdata.io、区块链大本营(blockchain_camp) 各位小伙伴们中秋节快乐呀! 此刻的你是不是正准备好举杯邀明月呢? 无论你是正在与
- 区块链大本营
-
-
-
- Circle CEO:世界上没有比中国更接近CBDC
- 据Circle首席执行官杰里米·阿莱尔(Jeremy Allaire)称,中国迄今为止对央行数字货币的态度最为进步。 菜鸟区块链 文 | 菜鸟区块链 唯一真正关心的全球性银行 Jeremy Al
- 菜鸟区块链
-
-
-
- 一个发起比特币100倍赌约的"耶稣"和一个无偿宣传比特币的布道者的故事
- 中秋福利:后台回复“福利”,即可进入区块链0基础学习资料的优惠入口噢。 根据 9 月 6 日的 CoinMarketCap 数据显示,比特币市值占比全部加密货币总市值已经突破 71%,再创今年新高,市
- 白话区块链
-
-
-
- 9-12|公信宝主体运营公司被查封,李笑来称“做天使投资不容易”
- 蜜蜂查行情 数据采集于9-12 8:00 1)BTC现价:$10191.17,24小时涨跌 0.76%,交易量$133.10亿 2)ETH现价:$179.17,24小时涨跌 -0.66%,交易量$6
- 币圈情报社
-
-
-
- 对话何一:币安IEO不会停,Binance公链可以比肩ETH
- 近日,陀螺财经App推出了全新功能“陀螺问答”,为用户首创向KOL单独提问的机会,一对一问答,满足用户个性化深度交互的需求。 9月11日,币安宣布上线期货合约交易,并支持 USDT 保证金交易,币
- 陀螺财经
-
-
-
- Unitimes AMA | 对话Amberdata:区块链海洋多风险,把握数据方可保驾护航
- 点击上方“Unitimes” 可以订阅哦! unitimes.io 全球视角,独到见解 前言 Unitimes AMA(Ask Me Anything)是 Unitimes 重点打造的微信群线上问
- Unitimes
-
-
-
- 比特币市值占比超70%,韩锋:比特币地位稳固,看好行业新风口
- 对于比特币,很多投资者最关心的话题莫过去明年的区块奖励减半。 目前的行情下,还有另外一件事引发了不少投资者的关注:比特币的市值占比超过了 70% 的大关(发文时,为 72.17%)。 2019.09.
- 白话区块链
-
-
-
- 加仓一波____唷,有本事你点进来看啊
- 同志们好,这里是狗哥的第383篇日记。 昨天的狗屎运镇楼。 NODE我居然中签了。 可惜我卖的不够好,浪费了好机会啊,不过好歹几千块加上白送的2个手机是到手了。 不过之后,我没有很开心,而是
- 狗哥币圈实盘日记
-
-
-
- 密码退出骗局 如何避免成为受害者
- 几年前,“退出骗局”一词成为了传销行业的同义词。当时,市场(总体而言)充斥着大量现金攫取企业,这些企业表面上看起来很棒,但实际价值却很少甚至没有。 从最基本的意义上来说,退出骗局可以被认为是一个欺诈性
- 菜鸟区块链
-