二维码

8.4.6 单元测试合约 - 数据结构 - 机器学习

1328 人阅读 | 时间:2021年01月15日 01:11
8.4.6 单元测试合约 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

8.4.6 单元测试合约

1387 人参与  2018年09月15日 10:14  分类 : 区块链精品文章  评论

单元测试是一种应用测试类型。单元是一个应用的最小可测试部分,在单元测试过程中单元被单个独立地进行测试。单元测试可以手动操作,但是通常都用自动操作。

truffle有一个单元测试框架,默认自动测试合约。在运行测试文件时,它提供一个干净的空间环境,也就是说,truffle在每个测试文件开始将重新运行所有移植,以保证有一套全新的合约用于测试。

truffle允许用两种不同的方式编写简单可管理的测试:

·在JavaScript中,从客户端执行合约。

·在Solidity中,从其他合约执行合约。

两种测试各有优缺点。我们将学习两种编写测试的方法。

所有测试文件都应置于./test目录中。truffle只运行扩展名为.js、.es、.es6、.jsx和.sol的测试文件。其他类型的文件都被忽略。

  在运行自动测试时,ethereumjs-testrpc比其他客户端的速度明显要快。此外,testrpc有一个特殊功能,可以让truffle节省 90%的测试运行时间。推荐在常规开发和测试中使用testrpc;在现场或者生产网络中部署时,再次对go-ethereum或者另一个官方以太坊客户 端运行测试。

1.在JavaScript中编写测试

truffle的JavaScript测试框架建立在Mocha之上。Mocha是一个用来编写测试的JavaScript框架,chai是一个assertion(声明)库。

测试框架用于组织和执行测试,而assertion库提供验证对错的方式。assertion库使测试代码变得容易,所以不必进行数千次if运算。大部分测试框架里没有assertion库,它们允许用户接入想接入的库。

 在继续向下学习之前,需要学习如何用Mocha和chai写测试。学习Mocha请访问https://mochajs.org/ ,学习chai请访问http://chaijs.com/

测试应当位于./test目录中,并采用.js扩展名。

合约抽象是使JavaScript合约交互成为现实的基础。由于truffle不能检测到用户想在测试中与哪个合约交互,因此需要明确地询问这些合约。这就需要用到artifacts.require()方法。所以测试文件第一件要做的事就是为想测试的合约创建抽象。

然后,应当编写真实测试。从结构上看,应该与Mocha的测试基本保持不变。测试文件应当包含Mocha会认为是自动 测试的代码。使truffle测试不同于Mocha的是contract()函数:该函数与describe()类似,除了它告诉truffle运行所有 移植。contract()函数的工作原理如下:

·在运行每个contract()函数之前,合约被重新部署以运行以太坊节点,所以其中的测试都是在干净的合约状态下运行的。

·contract()函数提供一个以太坊节点可用账户列表,可用于编写测试。

由于truffle在后台使用Mocha,在不需要truffle功能时,还可以使用describe()运行正常的Mocha测试。

下面是truffle生成的,用于测试MetaCoin合约的默认测试代码。

最后,truffle允许访问Mocha的配置,所以可以修改Mocha的行为。Mocha的配置在truffle.js文件的导出对象中被放在Mocha属性之下

2.在Solidity中编写测试

Solidity测试代码在.sol文件中。使用Solidity写测试之前需要注意如下事项:

·Solidity测试不能扩展自任何合约。这让测试尽可能小,用户还能完全控制自己编写的合约。

·truffle提供一个默认的assertion库,但是可以根据需要随时修改这个库。

·可以对任意以太坊客户端运行Solidity测试。

为了学习如何在Solidity中编写测试,让我们看看truffle生成的默认Solidity测试代码。

·truffle/Assert.sol库提供Assert.equal()等Assertion函数。这是默认的 assertion库,然而只要库与truffle测试运行者松散地整合,就可以触发正确的assertion事件,包括自己的assertion库。 Assertion函数触发事件,并由truffle捕获,进而显示信息。这就是truffle中的Solidity assertion库的架构。可在Assert.sol中发现所有现有的Assertion函数(https://github.com/ConsenSys/truffle/blob/beta/lib/testing/Assert.sol )。

·在导入路径truffle/Assert.sol中,truffle是包名。

·已部署合约(即作为migrations一部分的部署合约)的地址在truffle/Deployed- Addresses.sol库中都可用。这由truffle提供,且在运行每个测试程序组之前重新编译并重新接入。这个库用 DeployedAddresses.<contract name>()的形式为所有已部署合约提供函数。这将返回一个地址,可用以访问合约。

·为了使用已部署合约,必须将合约代码导入测试。在前面的例子里,注意导入“../contracts /MetaCoin.sol”。该导入与./test目录中的测试合约有关,为了发现MetaCoin合约,它会超出测试目录。然后使用该合约把地址投射 给MetaCoin类型。

·所有测试合约开头都是Test(使用大写T)。这对合约和测试助手以及项目合约(即测试中的合约)进行了区分,让测试者知道哪个合约代表测试版。

·像测试合约名一样,所有测试函数开头都是test(使用小写t)。每个测试函数都被当作单一交易按照出现在测试文件 (例如你的JavaScript测试)中的顺序执行。truffle/Assert.sol提供的Assertion函数触发事件,测试运行者评估以决定 测试结果。Assertion函数返回一个Boolean,代表assertion的结果,可以用它从测试中提早返回,以防执行错误(即testrpc显 示的错误)。

·有许多测试钩 (hook),参见下面的例子。这些钩包括beforeAll、beforeEach、afterAll和afterEach,与JavaScript测 试中Mocha提供的一样。在进行每个测试之前或之后,或者运行每个程序组之前或之后,可以使用这些钩进行设置和拆除。就像测试函数一样,每个钩都被当作 单一交易执行。注意,一些复杂测试需要进行大量设置,可能会超过单一交易的gas上限。可以创建许多有不同后缀的钩,绕过这个限制。

·测试合约还显示test函数和hook函数均有同样的合约状态。可以在测试前建立合约数据,在测试中使用那些数据,随后重置它,以便为下一个测试做准备。注意,就像JavaScript测试一样,上一个测试函数的状态将延续到下一个测试函数。

truffle无法直接测试出合约是否应当抛出异常(抛出异常的合约说明有预期的错误)。读者可自行查找解决方案。

如何向测试合约发送以太币

为了向测试合约发送以太币,在合约中应当有一个返回uint的公共函数,叫作initialBalance。这可以直 接被编写成函数或者公共变量。当测试合约被部署到网络中时,truffle将从测试账户发送该数量的以太币到测试合约。在测试状态下,测试合约随后可以使 用那些以太币设置演示以太币交互。注意,initialBalance是可选项,而非必选项。

truffle用不执行回退函数的方式发送以太币到测试合约,所以仍然可以使用测试中的回退函数进行高级测试。

3.运行测试

要运行测试脚本,请运行如下命令:

8.4.6 单元测试合约 - 数据结构 - 机器学习

或者,可以给想运行的特定文件指定一个路径。比如,

8.4.6 单元测试合约 - 数据结构 - 机器学习

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=534

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
关闭广告
关闭广告
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×