Truffle测试框架

Truffle 有一个标准的自动化测试框架,让你可以非常方便地测试您的合约.这个框架允许您以两种不同的方式编写简单可控的测试:
1. 在JavaScript中, 用于执行来自外部世界的合约,就像您的应用程序一样。
2. 在Solidity中, 用于在先进的,裸露的金属场景中执行您的合约。
两种测试方式都有其优点和缺点,请参阅下面两部分。
  • 使用 Javascript 编写测试
Truffle 使用 Mocha 测试框架 和 Chai 断言来给你提供一个可靠的框架编写JavaScript测试,让我们深入研究一下,看看Truffle 是如何构建在Mocha之上,让你可以轻松地测试你的合约的。
注意:如果您不熟悉在Mocha上做单元测试,请在继续之前查看一下 Mocha 的文档。
使用contract()代替describe()
从结构上说,您的测试文件应该与Mocha基本保持一致: 您的测试文件应该放在 ./test 目录, 以 .js作为后缀,而且,它们应该包含Mocha能够识别的自动化测试代码。让 Truffle 和 Mocha 不一样的是这个 contract() 函数: 这个函数基本和 describe() 一样,只不过它可以启用clean-room 功能.  其过程如下:
1. 每次contract()函数运行之前,您的合约会被重新部署到正在运行的以太坊客户端,因此测试是在一个干净的合约环境下进行的。
2. 这个contract()函数提供一个由您的以太坊客户端生成的,可以在编写测试合约使用的账户列表。
合约抽象是 JavaScript 实现合约交互的基础。因为Truffle 无法检测出在测试中需要与哪些合约进行交互,所以您需要明确地指出这些合约。您可以使用一个由Truffle提供的方法 artifacts.require()来做这些事情,它可以让您为一个特定的合约,请求一个可用的合约抽象。就如您在下面的例子中所看到的,然后您可以使用这个抽象来确保您的合约工作正常。 有关使用合约抽象的更多信息,查看与你的合约交互章节。
使用artifacts.require()
在测试中使用artifacts.require()的方式和在迁移中使用的方式相同,您只需要指定合约名称.更多信息,请查看artifacts.require()。
使用web3
每个测试文件都有一个配置了正确提供者的web3实例,所以web3.eth.getBalance直接调用就行了。
实例
使用.then
这里是一个由 Metacoin Truffle Box提供的测试案例. 注意这 contract() 函数的使用, 这个 accounts 数组是指定的可用的以太坊账户,  artifacts.require() 则是为了和合约直接交互用的.
文件:./test/metacoin.js
运行truffle test ./test/metacoin.js输出如下内容:
使用ASYNC/AWAIT

这是个类似的实例,只不过使用的是async/await:

指定测试文件

我们通过如下命令限制执行测试的文件:

更多命令请参考command reference

进阶

Truffle提供访问Mocha配置的能力,因此你可以通过改变Mocha配置来改变Mocha的行为,更多信息,请参考project configuration
  • 使用Solidity编写测试
Solidity测试合约以.sol文件格式与javascript测试文件一起工作.当truffle test运行时,它们将作为测试合约的独立测试套件包括在内.这些合约保留了JavaScript测试的所有优点:即每个测试套件都有一个洁净室环境,可以直接访问已部署的合同以及拥有导入任何合约依赖的能力.除了这些功能外,Truffle的Solidity测试框架还考虑到如下问题:
  1. Solidity测试不需要继承任何合约,这让你的测试尽可能的小,同时你也能对你写的合约能有一个完全的控制。
  2. Solidity不受任何断言库的影响,Truffle提供了默认的断言库,而且您可以按需修改此断言库。
  3. 您可以针对任何以太坊客户端运行您的Solidity测试。

实例

在深入探索之前,我们来看一个示例Solidity测试。以下是truffle unbox metacoin为您提供的示例Solidity测试:

运行truffle test ./test/TestMetacoin.sol输出如下:

测试框架
为了更好的理解发生了什么,让我们进入更深层的讨论
断言
你的断言方法,比如Assert.equal(),是由truffle/Assert.sol库提供的。这是默认的断言库,您也可以包含您自己的断言库,只要这个库能通过触发正确的断言事件与Truffle的测试运行器进行交互。您能在Assert.sol找到所有能用的断言方法。
部署地址
您通过truffle/DeployedAddresses.sol部署的合约(合约会作为migration的一部分被部署)是可用的,这是由truffle提供的并且会在每个套件提供洁净室测试运行环境之前被重新编译和重新链接。这个库以如下形式为您部署的所有合约提供函数:
DeployedAddress.<contract name>();这将返回一个您能用来访问合约的地址,具体使用方法请参考上面的实例。为了使用部署的合约,您必须将合约代码引入到你的测试套件里去,注意import “../contracts/MetaCoin.sol”;在这个实例中,import导入的是./test目录下与之相关的合约,然后使用合约将地址强转为Metacoin类型。
测试合约名称
所有的测试合约必须以Test开头,使用一个大写的T。这使之区别于测试帮助类和项目合约,让测试器知道哪些合约代表测试套件。
测试方法名称
跟测试合约名一样,所有的测试方法名必须以test开头(小写的),每个测试方法作为单个交易以出现在测试文件中的顺序执行。由truffle/Assert.sol提供的断言函数出发时间,测试运行器评估改事件以确定测试结果。断言函数返回一个表示断言结果的布尔值,您可以使用它提前从测试中返回以防止执行错误(如Ganache或Truffle Develop将会暴露的错误)。
钩子前后
truffle提供给您许多测试钩子,在下面的实例中展示。这些钩子是beforeAll,beforeEach,afterAll和afterEach,这与Mocha在JavaScript测试中提供的钩子是一样的。您能使用这些钩子在测试前后或者在每个测试套件运行前后做setup和teardown的操作。和测试函数一样,每个钩子都是作为单个交易运行的。请注意,一些复杂的测试需要执行大量的设置,这可能会溢出单个事务的gas限制;您可以通过创建许多带有后缀的钩子来绕过这个限制,就像下面例子所描述的:
这个测试合约也展示了您的测试函数和hook函数可以共享合约状态。您可以在测试之前设置合约数据,在测试中使用这些数据以及重置数据以准备下一个测试。注意,就像您的JavaScript测试一样,您的下一个测试函数将以之前运行的测试函数状态继续运行。
高级功能

Solidity 测试具有一些高级功能,可以让你测试特殊用例。

测试异常

您可以很容易地测试你的合同是否应该引发一个异常(例如require()/assert()/revert()语句;throw在早期的Solidity版本上抛出。这个主题首先由作者Simon de la Rouviere在他的教程“在Truffle Solidity测试中抛出异常”中提出。注:该教程大量使用弃用的关键词throw来抛出异常,并从Solidity v0.4.13版本开始被require(),assert()和revert()所取代。

测试以太坊交易

您也可以测试您的合同如何对接收Ether做成出反应,并在Solidity中编写该交互脚本。为了达到这个目的,您的测试应该有一个叫initialBalance,返回值为uint的公有函数。这可以直接写作一个方法或者公用变量,就像下例所示。当您的测试合约部署到网络上,Truffle将从您的测试账户发送大量的Ether到您的测试合约。然后,您的测试合约可以使用这些Ether来在您的合约测试中编写与以太坊的交互。注意:initialBalance是可选的,不是必须的。

请注意,Truffle以不执行回退函数的方式将Ether发送到您的测试合同,因此您仍然可以在您的Solidity测试中使用回退函数进行高级测试用例。

来源:区块链兄弟

原文链接:

http://www.blockchainbrother.com/article/2082

Truffle测试框架相关推荐

  1. EOS版truffle测试框架js4eos上线了,合约一键自动化测试

    EOS测试框架流程 安装js4eos npm install -g js4eos (ubuntu需要sudo) 初始化合约应用 mkdir js4eos-dapp cd js4eos-dapp js4 ...

  2. 软件自动测试框架,软件自动化测试框架的研究和实现

    摘要: 软件自动化测试是软件工程领域的一项重要课题.随着软件工程理论的不断发展,软件自动化测试在理论上也不断达到新的高度.目前最为成熟的软件自动化测试技术是使用自动测试框架来指导自动化测试的实现.迄今 ...

  3. model存数据_Jepsen 测试框架在图数据库 Nebula Graph 中的实践

    在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践. Jepsen 简介 Jepsen 是一款用于系统测试的开源软件库,致力于提高分布式数据库.队列.共识系统等的安全 ...

  4. 5个最佳的Android测试框架

    2019独角兽企业重金招聘Python工程师标准>>> 谷歌的Android生态系统正在不断地迅速扩张.有证据表明,新的移动OEM正在攻陷世界的每一个角落,不同的屏幕尺寸.ROM / ...

  5. testem方便的web tdd 测试框架使用

    备注: 单元测试,对于日常的开发是比较重要的,testem 简化了我们的代码编写,以及运行. 主要特性: a. 支持的测试框架有:jasmine quint mocha buster.js ,同时也包 ...

  6. 自动化测试框架cucumber_BDD测试框架之Cucumber使用入门

    ▼ 关注测试局| 会上瘾 1什么是Cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像 ...

  7. ThinkPHP 集成 PHPUnit 8 测试框架进行单元测试

    ThinkPHP 5.1 集成 PHPUnit 8 测试框架 本项目仅适用于运行 PHP7.2 以上的环境!对于低版本 PHP 请根据需要调整 PHPUnit 的版本! 声明 由于原项目 think- ...

  8. 走进Java接口测试大门之测试框架TestNG

    一.简介 TestNG 是一个受 JUnit 和 NUnit 启发的测试框架,旨在简化广泛的测试需求,从单元测试到接口测试. 但引入了一些新功能,使其更强大,更易于使用,例如: 注释. 在线程池中运行 ...

  9. Python测试框架pytest(05)fixture - error和failed、fixture实例化、多个fixture

    Python测试框架pytest系列可以查看下列 Python测试框架pytest(01)简介.安装.快速入门_编程简单学的博客-CSDN博客 Python测试框架pytest(02)PyCharm设 ...

最新文章

  1. pat 乙级 1027 打印沙漏(C++)
  2. [css] 使用css写一个垂直翻转图片的效果
  3. 使用Python音频双通道分离
  4. 中移4G模块-ML302-OpenCpu开发-MCP23017输入/输出
  5. 【Flink】Flink 清理过期 Checkpoint 目录的正确姿势
  6. python2和3切换_python2和python3切换
  7. python获取像素值_从PIL获取像素值列表
  8. 删除或复制文件提示:文件名无效或太长/目标路径太长/找不到该项目
  9. cachecloud java_cachecloud安装部署
  10. 计算机论文档案初探,[电子档案管理论文:档案计算机管理技术人才培训工作初探.doc...
  11. 拼多多业绩增长难继,品牌形象陷于信任危机
  12. 如何获取 iOS 设备 UDID?
  13. 中文编程语言——易语言,到底是用来干什么的?易语言值得学习吗?易语言的优势有什么?
  14. Jackson ImmunoResearch普通羊驼血清说明书
  15. studio 3t注册码脚本
  16. 【活动分析】某电商双十一活动分析报告
  17. Facebook聊单,SaleSmartly有妙招!
  18. 周鸿祎:微创新要极端一点
  19. Appium搭建MacOS环境下的iOS App自动化测试环境(Windows搭个MacOS虚拟机就行,亦无须iPhone)
  20. 防脱是一辈子的事业!!!(含测评不含推广

热门文章

  1. 初中数学分几个模块_11.初中数学:xy4x+6y5,怎么因式分解?分组配方法再平方差...
  2. verilog coding style_韩嫕:坚持coding
  3. Android外存的读写
  4. 06-人脸识别-MTCNN的感性认识(转载)
  5. error: No implicit Ordering defined for Any
  6. 《Troubleshooting Windows 7 Inside Out》文摘-1
  7. javascript 阻止冒泡和浏览器的默认行为
  8. 【Advanced Windows Phone Programming】在windows phone 8中录制MP3和AAC及Amr音频
  9. windows 2008 r2 AD密码策略
  10. JS:ES11新特性