使用hardhat开发以太坊智能合约-测试合约
Web3工具网站【点我访问】 现已上线,欢迎使用,如有好的意见和建议也欢迎反馈。
本系列课程:
第一节:使用hardhat开发以太坊智能合约-搭建环境
第二节:使用hardhat开发以太坊智能合约-测试合约
第三节:使用hardhat开发以太坊智能合约-发布合约
第四节:使用hardhat开发以太坊智能合约-验证合约
上一章我们讲解了如何搭建基本的hardhat开发环境,这一章我们来讲一下如何测试、部署合约
特别提醒:本系列教程默认你已经掌握了solidity的开发技能,如果你对solidity还不能完全理解,请先移步solidity的相关教程
1、编译合约
我们使用vscode打开项目,在菜单左侧,打开contracts目录,可以发现里面已经有一个Lock.sol文件了,这个是hardhat为我们准备的测试的合约文件
打开Lock.sol文件
可以看到其实是一个很简单的逻辑,里面定义了2个变量,还有一个事件,以及一个调用方法,整个合约要实现的就是当事件满足一定条件的时候才可以从合约账号提现
下面,我们使用hardhat提供的命令对合约文件进行编译:
npx hardhat compile
hardhat会帮我们编译contracts目录下面的所有合约文件
这时候我们可以看到在控制台已经输出了编译日志,如果编译不成功会提示相应的错误信息
在我们的项目目录里同时也会生成一些新的文件,如上图所示,其中cache目录为缓存文件,artifacts目录下的build-info目录,存放的是构建项目的信息,contracts下面存放的是编译的每个合约对应的abi接口信息
2、测试合约
通过上面的操作,我们已经成功的编译了合约文件,下面我们来对合约文件进行测试,一个好的测试流程可以避免我们的合约出现一些严重的bug,特别是在区块链上,一旦合约部署上去就无法再次更新,所以我们在正式上线之前,必须将合约完全测试一遍
2.1 测试脚本介绍
我们回到vscode,打开项目目录test,这里已经有了一个名为Lock.js的脚本文件
让我们打开它,看一下它的主要构成
代码前6行定义了几个常用的测试辅助对象,其中 loadFixture,可以让我们在测试中都使用相同的配置,最常用的就是我们在测试类里会定义一个部署合约的方法,然后在需要使用合约对象的地方,通过loadFixture(function) 获取部署合约的快照对象
在hardhat里,我们使用chaijs Chaijs官网 来进行断言测试, 感兴趣的朋友,可以浏览chai官网获取更多信息,通过使用expect方法,进行断言测试
describe("Lock", function () {})
这段代码就是标识测试的开始,其中第一个参数为测试标题,可以随便定义,第二个参数为要执行的函数体,我们在函数体里,进行具体测试逻辑的编写
describe是可以嵌套使用的
所以我们一般测试会在第一个describe里定义一个合约部署方法,然后在describe里嵌套 describe,通过loadFixture(function) 获取相同合约部署快照
2.2 合约部署方法
回到刚刚的测试文件,我们继续阅读代码
async function deployOneYearLockFixture() {const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60;const ONE_GWEI = 1_000_000_000;const lockedAmount = ONE_GWEI;const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS;// Contracts are deployed using the first signer/account by defaultconst [owner, otherAccount] = await ethers.getSigners();const Lock = await ethers.getContractFactory("Lock");const lock = await Lock.deploy(unlockTime, { value: lockedAmount });return { lock, unlockTime, lockedAmount, owner, otherAccount };}
这部分代码定义了一个合约部署方法,其中
const [owner, otherAccount] = await ethers.getSigners();
第一个owner 即为我们部署合约的账号,可以通过加入更多字段接受返回,获取其他的账号信息,如otherAccount这个定义
const Lock = await ethers.getContractFactory("Lock");
这句代码创建了一个合约对象Lock,注意括号内的Lock对应的是合约文件内定义的名称,即
contract Lock {}
请不要错把合约文件名当成该参数,否则会报错
const lock = await Lock.deploy(unlockTime, { value: lockedAmount });
通过deploy方法进行合约部署,括号内为合约部署时所需的初始化值,如果合约不需要可以不填写
2.3 测试方法
describe("Deployment", function () {it("Should set the right unlockTime", async function () {const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture);expect(await lock.unlockTime()).to.equal(unlockTime);});});
在describe里,使用 it进行测试,第一个参数为测试描述,第二个参数为具体方法实现
const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture);
获取合约创建快照对象,从对象中获取到合约对象以及合约部署方法里定义的解锁时间
expect(await lock.unlockTime()).to.equal(unlockTime);
使用expect进行断言,判断合约对象里面存储的解锁时间是否与合约部署方法里定义的解锁时间相等
2.4 测试演示
接下来,让我们运行测试,来看一下测试的结果
使用如下命令来进行合约测试:
npx hardhat test
从图中打印的信息我们可以清晰的看出测试结果,值得注意点是,打印也是具有层级的,这个是因为我们循环嵌套使用describe产生的效果,通过嵌套使用,可以让我们测试结果变得更为清晰,推荐大家使用
通过本章的学习,我们了解了合约是如何进行测试的,以及测试需要注意的一些事项,接下来我们会讲解如何进行合约的部署,以及网络的选择,小伙伴们我们下节课见咯
使用hardhat开发以太坊智能合约-测试合约相关推荐
- 使用hardhat 开发以太坊智能合约-验证合约
Web3工具网站[点我访问] 现已上线,欢迎使用,如有好的意见和建议也欢迎反馈. 本系列课程: 第一节:使用hardhat开发以太坊智能合约-搭建环境 第二节:使用hardhat开发以太坊智能合约-测 ...
- java和以太坊交互_java类库web3j开发以太坊智能合约快速入门
web3j简介 web3j是一个轻量级.高度模块化.响应式.类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成. 可以通过它进行以太坊 ...
- 用Visual Studio开发以太坊智能合约
2019独角兽企业重金招聘Python工程师标准>>> 区块链和以太坊 自从我熟悉区块链.以太坊和智能合约以来,一直失眠. 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议 ...
- Python开发以太坊智能合约指南(web3.py)
在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...
- python智能合约编程_如何用Python Flask开发以太坊智能合约
将数据存储在数据库中是任何软件应用程序不可或缺的一部分.无论如何控制该数据库都有一个该数据的主控.区块链技术将数据存储到区块链网络内的区块中.因此,只要某个节点与网络同步,它们就会获得区块中数据的副本 ...
- python flask_python和flask框架开发以太坊智能合约
将数据存储在数据库中是任何软件应用程序不可或缺的一部分.无论如何控制该数据库都有一个该数据的主控.区块链技术将数据存储到区块链网络内的区块中.因此,只要某个节点与网络同步,它们就会获得区块中数据的副本 ...
- 基于mcat开发以太坊智能合约
mcat是一个基于Golang实现的以太坊智能合约开发脚手架,它可以帮助你快速开发.调试以及部署智能合约,同时mact提供一个通过合约交易参数计算调用字节码的功能,可以帮助开发者不受语言限制,无论是J ...
- 区块链DAPP开发 以太坊智能合约框架有哪些
一.truffle(JavaScript) Truffle 是一个在以太坊进行 DApp 开发的世界级开发环境.测试框架. 使用 Truffle 开发有一以下优点: 内置智能合约编译,链接,部署和二进 ...
- java 以太坊 智能合约_web3j教程:java使用web3j开发以太坊智能合约交易
从广义上讲,有web3j支持三种类型的以太坊交易: 1.以太币从一方交易到另一方 2.创建一个智能合约 3.与智能合约交易 为了进行这些交易,必须有以太币(以太坊区块链的代币)存在于交易发生的以太坊账 ...
最新文章
- ICCV 2021 | 基于稀疏多视角彩色相机的多人人体全身捕捉
- k8s和harbor的集成_爱威尔-基于kubernetes集群的项目持续集成(gitlab+harbor+Jenkins)安装...
- dp线和hdmi区别_干货| 认识VGA、DVI、HDMI、DP视频接口
- 史上最全最常用批处理260多个打包下载
- RequestMapping注解的继承问题
- 「经济理财」 简七理财之小白理财入门篇9堂课
- 可视化模板:销售\采购\财务收支等模板分享
- uni-app小程序SDK接入
- 用c++语言写1加到100,C++ 语言实现1加到100(初学者)
- 用Delphi开发微信支付和支付宝支付生成签名并提交刷卡支付请求验证源码
- 书中第十章货币实验Currencies App在openexchangerates.org上的开发者密钥
- 千岛湖2日团建旅行!游览天下第一秀水,感受湖岛遍布的磅礴气势!_团建拓展_嗨牛团建_杭州站...
- 假如我来架构12306网站(一) - 概论
- 手机里的OFD文件如何转成PDF
- Direct3D显示视频
- macmini时间机器备份文件服务器,用普通NAS代替苹果Time Machine 功能实现MAC的时间机器...
- 关于 DataFrame: 处理json数据(re模块,concat...)
- UEM系列(一)用户体验管理介绍
- 利用turf.js分析数据---占地分析
- 工业控制系统PLC、DCS、ESD