Truffle测试框架

2023-11-17

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Truffle测试框架 的相关文章

  • Nethereum:.NET应用和以太坊智能合约的桥梁

    Nethereum基本上是目前唯一可用的 NET平台下的web3 js移植包 在这个教程中 我们将首先编写并部署一个简单的智能合约 然后创建一个简单的 NET应用 并使用Nethereum来访问以太坊上的智能合约 Nethereum是通过以
  • 使用web3 部署智能合约

    CentOS 7 环境 web3安装 及 对象的创建 m0 47233175的博客 CSDN博客https blog csdn net m0 47233175 article details 121960931还未安装web3环境 请参照以
  • 理解不同加密币的要点(一)—— 共识机制

    一 加密货币分类 一 价值层面 与实体资产绑定的代币 为了因应市场需求而生 与实体资产做挂钩的代币 也就是我们说的稳定币 例如与美元做挂钩的USDT TUSD PAX与USDC等 仰赖网络共识的代币 代币价值仰赖网路上市场共识的代币 基本上
  • Web3与智能合约交互实战

    写在前面 在最初学习以太坊的时候 很多人都是自己创建以太坊节点后 使用geth与之交互 这种使用命令行交互的方法虽然让很多程序员感到兴奋 黑客帝国的既视感 但不可能指望普通用户通过命令行使用Dapp 因此 我们需要一种友好的方式 比如一个w
  • 智能合约(二)————智能合约进阶

    1 保留关键字 abstract after alias apply auto case catch copyof default define final immutable implements in inline let macro
  • 莱昂哈德·欧拉生平及其成就简介

    莱昂哈德 欧拉 Leonhard Euler 1707年4月15日 1783年9月18日 瑞士数学家 自然科学家 1707年4月15日出生于瑞士的巴塞尔 1783年9月18日于俄国圣彼得堡去世 欧拉出生于牧师家庭 自幼受父亲的影响 13岁时
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型 重点是值类型 包括布尔类型 整型 地址类型 字节类型 字符串类型和枚举类型 并且通过两个智能合约例子 用于演示这些数据类型的声明与使用方法 访问 Github 仓库 获取更多资料 基本概念 Sol
  • 在BSN武汉链上部署solidity智能合约(转载)

    分享一篇不错的关于武汉链的入门技术文章 原文连接 在BSN武汉链上部署solidity智能合约 登链社区 区块链技术社区 在BSN武汉链上部署solidity智能合约 BSN简介区块链服务网络 Blockchain basedService
  • MetaMask 添加BSC、Polygon网络配置

    打开浏览器 点击MetaMask插件 选择网络 点击弹窗中的 Add Network 按钮 添加各网络配置如下 1 BSC Binance Smart Chain 主网 key value 网络名称 Network Name Binance
  • Eos离线签名PHP代码

    EOS区块链的钱包服务器Keosd 提供了sign transaction开发接口 允许开发者进行交易签名 但是 如果我们希望自己管理密钥而不是交给keosd管理 应该如何在PHP代码中实现交易的离线签名功能 答案是使用 EosTool 这
  • Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API 它们主要表现为内置的特殊的变量及函数 存在于全局命名空间里 Solidity 系列完整的文章列表请查看分类 Solidity 写在前面 Solidity 是以太坊智能合约编
  • 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事 只需google查询 ERC20代币教程 你会发现有关如何做到这一点的大量信息 以编程方式与合约交互完全是另一回事 如果你是一个Python程序员 那么教程就很少 所以写这个Python中的
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea
  • 物联网、区块链、元宇宙和虚拟数字人离普罗大众有多远?

    首先 我们最早理解的数字人就是数字虚拟的一个假人 可能看起来很像二次元玩偶的样子 今天我觉得数字人是一种虚拟的数字身份 无所谓你的形象是仿真或是任何形象 包括你在现实中无法实现的形象 你在梦想中所渴望的概念 无论它是什么样的 它是你在另外一
  • 整数溢出的漏洞危害和预防

    智能合约作为区块链2 0的代表技术 适应于区块链去中心化 分布式的特点 具有独立运行 不可篡改的优良特性 可用于实现包含金融工具在内的各类分布式应用 开发者可以自行定义交易逻辑并开发代码发布到链上 合约代码在矿工节点的虚拟机环境 如EVM
  • OpenZeppelin集成Truffle编写健壮安全的合约

    原文 http truffleframework com tutorials robust smart contracts with openzeppelin 因为智能合约往往涉及金钱 保证Soldity代码没有错误 以及足够的安全是非常根
  • ERC20智能合约-带销毁功能

    SPDX License Identifier MIT pragma solidity 0 8 0 dev Interface of the ERC20 standard as defined in the EIP interface IE
  • 网络化,元宇宙的门槛

    如果森林中的一棵树倒下 但周围没有人听到 那它是否会发出声音 这一思想实验可以追溯到数百年前 这个实验之所以经久不衰 部分原因是它很有趣 而它之所以很有趣 是因为它耐人寻味并且融人了哲思 人们通常认为 上面这个问题最初是由主观唯心主义哲学家
  • solc安装指定版本

    1 系统linux ubuntu20 04 2 solc安装指定版本 在编译的时候报错 Error Data location must be storage or memory for constructor parameter but
  • Sidetree - 去中心化身份管理协议

    身份 Identity 管理是区块链应用的核心元素 在一个不可信 匿名的分布计算生态中 要实现去中心化身份管理并不是一件容易的事情 Sidetree是一个基于现有区块链平台的第二层 L2s 协议 专门用于去中心化身份管理 微软最新开源的IO

随机推荐

  • docker入门笔记(基础版)

    镜像命令 查看docker概要信息 docker info 列出本地主机上的镜像 docker images docker images a 查看远程库的镜像 docker search xx 下载镜像 在这里插入代码片 docker pu
  • 服务器无响应(已断开),服务器无响应 已断开(服务器无响应)

    服务器无响应是怎么回事 首先 检查其他人的电脑或您的手机等设备是否能正常连接到网络并打开网站 如果其他设备无法打开 当然 您的网络有问题 否则 你的电脑有问题 这时 先尝试重启电脑电脑重启电脑是不够的 可以尝试自己修复一些免费的DNS地址
  • 深度学习经典网络解析图像分类篇(一):LeNet-5

    深度学习经典网络解析图像分类篇 一 LeNet 5 1 背景介绍 2 LeNet 5网络架构 2 1输入层 2 2第一层 卷积层C1 2 3第二层 池化层S2 下采样 2 3第三层 卷积层C3 第四层 池化层S4 第五层 卷积层C5 第六层
  • 无序(未排序)数组二分查找

    二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 折半查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 但是对于无序数组 我们可以先排序在二分 但还有一种技巧就是结合快排的思想 即每次选择一
  • 电脑提示msvcp110.dll是什么意思?msvcp110.dll丢失修复办法分享

    当我们使用电脑时 有时候会出现一些错误提示 其中就包括了 msvcp110 dll 丢失 的提示 那么 这个提示是什么意思呢 电脑提示找不到msvcr110 dll怎么办 我们在使用电脑的时候 总是会遇到很多的电脑难题 当我们在遇到了缺少m
  • CMake中while/continue/break的使用

    CMake中的while命令用于在条件为true时评估 evaluate 一组命令 其格式如下 while
  • 使用Numpy创建三维矩阵

    1 创建语句 创建形式有两种 1 随机数形式 np random random x y z 2 0或1形式 np ones x y z np zeros x y z 2 x y z 的含义 如果把x y z想做一个空间直角坐标系 那么x就相
  • SpringCloud环境搭建及入门案例

    技术选型 Maven 3 8 4 SpringBoot 2 7 8 SpringCloud 2021 0 4 SpringCloudAlibaba 2022 0 1 0 Nacos 2 1 1 Sentinel 1 8 5 模块设计 父工程
  • iptables上如何封IP

    一 封单个IP 1 封锁单个ip iptables I INPUT s IP j DROP root node1 iptables I INPUT s 192 168 1 11 j DROP root node1 iptables L Ch
  • 内网渗透之AccessToken窃取与利用

    文章目录 令牌 Token AccessToken的窃取与利用 1 程序 incognito exe 2 MSF下的incognito模块 3 Invoke TokenManipulation ps1脚本 MSF实战假冒令牌提权 令牌 To
  • MES管理系统的哪些优势对企业帮助比较大

    随着全球制造业的快速发展 MES制造执行系统已成为企业生产管理的重要工具 MES管理系统解决方案集成了企业生产流程中的各个环节 包括计划 调度 质量 设备等 为企业提供了全面的生产管理解决方案 制造企业MES系统的优势颇多 其中对企业帮助比
  • Nginx反向代理配置

    首先配置反向代理前已经要把之前配置过的伪静态删除掉 不然保存的时候报错以下是反向代理的完整配置 请注意其中的端口号 8000 当前这个端口号就是 config swoole php文件中的server port配置中的端口号 locatio
  • Admin监控&Sleuth链路追踪 &skywalking链路追踪

    Admin监控 Sleuth链路追踪 skywalking Sleuth Zipkin 一 Sleuth Zipkin介绍 二 搭建环境 三 Sleuth入门操作 四 Zipkin搭建及操作 五 RabbitMQ方式发送信息 六 Elast
  • Net跨平台UI框架Avalonia入门-DataGrid的使用

    Avalonia中的DataGrid的使用 DataGrid 数据表格是客户端UI中很重要的一个控件 Avalonia中的DataGrid是单独一个包Avalonia Controls DataGrid 要使用DataGrid 需要另外在N
  • 3559 编译gdb-7.9

    1 安装ncurses 6 0 这个在3559 sdk中有 可以直接使用 configure with shared without debug without ada enable overwrite 2 编译gdb configure
  • 1007. 素数对猜想 (20)

    让我们定义 dn 为 dn pn 1 pn 其中 pi 是第i个素数 显然有 d1 1 且对于n gt 1有 dn 是偶数 素数对 猜想 认为 存在无穷多对相邻且差为2的素数 现给定任意正整数N lt 105 请计算不超过N的满足猜想的素数
  • pragma指令简介

    在编写程序的时候 我们经常要用到 pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作 下面介绍了一下该指令的一些常用参数 希望对大家有所帮助 一 message 参数 message 它能够在编译信息输出窗 口中输出相应的
  • java包装类

    1 概述 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 常用操作方法之一 用于基本数据类型与字符串之间的转换 2 Integer 2 1构造方法 2 1 1 public Integer int number
  • 12 C++的多态

    文章目录 一 多态的概念 1 1 多态的构成条件 二 虚函数 2 1 虚函数的重写 2 2 虚函数重写的例外 协变 父类与子类虚函数返回值类型不同 析构函数的重写 基类与派生类析构函数的名字不同 三 C 11 override和final
  • Truffle测试框架

    Truffle测试框架 Truffle 有一个标准的自动化测试框架 让你可以非常方便地测试您的合约 这个框架允许您以两种不同的方式编写简单可控的测试 1 在 JavaScript中 用于执行来自外部世界的合约 就像您的应用程序一样 2 在