测试合约

测试框架

Tronbox 标准配备了一个自动化测试框架,使测试合约变得轻而易举。这个框架可以让你以 Javascript 的方式编写简单和可管理的测试:

  • Javascript 中,从外部执行合约,就像你的应用程序一样。

测试用例目录

所有测试文件都应位于 ./test 目录中。TronBox 仅运行具有以下文件扩展名的测试文件:.js。除此之外的其他文件都会被忽略。

测试合约命令

若要运行所有测试,只需运行:

 tronbox test

或者,你去指定要运行的特定文件的路径,例如,

 tronbox test ./path/to/test/file.js

使用 TronBox Runtime Environment 测试环境

为了更方便的测试我们的合约,我们需要连接到区块链网络。在 TronBox v3.0.0 之后,TronBox 提供了一个 tre 的私链,它可以帮助我们用来测试。注意,这个区块链是在我们本地的系统里面,他不和波场的主网进行连接。

我们可以使用 TronBox Runtime Environment 来启动区块链,并与之交互,它的目的是为 Tron 开发建立一个完整的私链。

具体启动步骤如下:
需使用 docker 拉取镜像:

docker pull tronbox/tre

1.启动 TronBox Runtime Environment,运行下面命令:

    docker run -it \
    -p 9090:9090 \
    --rm \
    --name tron \
    tronbox/tre

我们可以看到下面的信息:

    TronBox Runtime Environment v1.0.1


    Start the http proxy for dApps...
    [HPM] Proxy created: /  ->  http://127.0.0.1:18190
    [HPM] Proxy created: /  ->  http://127.0.0.1:18191
    [HPM] Proxy created: /  ->  http://127.0.0.1:8545
    [HPM] Proxy created: /  ->  http://127.0.0.1:8545
    [HPM] Proxy created: /  ->  http://127.0.0.1:8060

    Tron Quickstart listening on http://127.0.0.1:9090


    ADMIN /admin/accounts-generation

    FullNode is already.


    Available Accounts
    ==================

    (0) THD652niU9nm81xA8Gf2ctSQLDhiWUXT4o (10000 TRX)
    (1) TSPjSVn1Ew1QaWMLyYSGiV78qaXbocuFkB (10000 TRX)
    (2) TUcEcuj3FDSmsfaSWBH5CTu4k4sHEsStjo (10000 TRX)
    (3) TVzQGMmmXBJC12o4yzBkr4dw6VWqPnR9CA (10000 TRX)
    (4) TAZC9fKYnjtVFuHnaUzQ5xLSLe5MYovTYn (10000 TRX)
    (5) TDi5qjuk8cs6FMG754FZUDxcLqTpVBUhPF (10000 TRX)
    (6) TCwGkXWD2C8gi7UChVGnqipmfm8Hq4YYo9 (10000 TRX)
    (7) TM3WZw9PWBMUTmFvXV7qxt6dq5Bv2znL7p (10000 TRX)
    (8) TVyL1uiusn6r3UPGaosPBu1FTvQnWADNbP (10000 TRX)
    (9) TMbXpcWsTXnXEHkqJkSmU1Gj21CCYLVMsv (10000 TRX)

    Private Keys
    ==================

    (0) 6b7b075714de08b1fcc2dc5afe20f5e087fb679032b601717d0cd3807e24d563
    (1) 5adab5cdfafab07714895f8a0f9ccf50b3a786902bf21a31f5749f5f3a36a5ee
    (2) c2f12cbc82befc3ba3da66fcfadac830e9a6e28fcbb8178bd6fdefaabe15d5fd
    (3) 0b44950cb02dfc2e7bdc0803139cf767eff95af03568418f5e7fac0c25e9beeb
    (4) ffd86aec3b4a5c2b2bb0df3078eebe97be75115a9affc788b427dcaad9084f10
    (5) 367b6da347e91d1d1e02ec775028ffb310d2e37e4fc56001d3a1d96b33142890
    (6) 9940da6d6516473373fa92c7731785dd545fac8638ee1b504da27befd2dec722
    (7) d9ed135abc58e1ad081a8df755b76a0c6d6bab137021146d38a9bb7674aec345
    (8) ba09da49973cd129d114d3b18559b701f68fedd9bdeb6859ba60c58b34c5a860
    (9) ebe05e5b6335ce84f37fdc143164dd768a7204718c12f7786e8f44ce1b32412d

    HD Wallet
    ==================
    Mnemonic:      buyer assume spin morning mosquito fortune enhance vocal raven tired wise fun
    Base HD Path:  m/44'/195'/0'/0/{account_index}

    GET 200  - 32850.036 ms

这里显示了 10 个账号,和它们对应的私钥,这些账号可以用来和区块链进行交互。

这个docker image 未针对苹果 ARM 芯片(Apple silicon) 做优化,可能出现无法使用,需多次重启docker的情况。

2.打开控制台,执行部署:

    tronbox migrate

我们可以看到类似下面的输出:

    Using network 'development'.

    Running migration: 1_initial_migration.js
    Replacing Migrations...
    Migrations:
        (base58) TBp7j3cUisov1tWbq1vagxwXmNBcmmjLzw
        (hex) 4114381a89161cd01957dc854a69c000f019d3a4cb
    Saving successful migration to network...
    Saving artifacts...
    Running migration: 2_deploy_contracts.js
    Replacing ConvertLib...
    ConvertLib:
        (base58) TGoVTVUt5KBtLqMd8m4kdhMgivUc83mig1
        (hex) 414af27519fbc1e8ffe911761ab106fff563200830
    Linking ConvertLib to MetaCoin
    Replacing MetaCoin...
    MetaCoin:
        (base58) TQCcNUFpK8zLskJvryWE82ZEGXBqSHA2Sy
        (hex) 419c1aad134258c42af129822814098333ba251e52
    Saving successful migration to network...
    Saving artifacts...

这里显示了网络,部署的合约地址。以及交易的状态等信息。

启动 TRE 环境之后,在单测中可使用以下新增的高级功能:

提示:可在单测中使用 tronWrap 代替 tronweb。

  • tre_setAccountBalance:设置账户的余额
const address = 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL';
const balance = '0x3e8';
const result = await tronWrap.send('tre_setAccountBalance', [address, balance]);
console.log(result);
  • tre_setAccountCode:设置账户的代码(建议设置为合约的运行代码即 runtime_code,设置为合约的创建代码将导致合约的执行异常)
const address = 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL';
const data = '0xbaddad42';
const result = await tronWrap.send('tre_setAccountCode', [address, data]);
console.log(result);
  • tre_setAccountStorageAt:设置账户的存储
const address = 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL';
const slot = '0x0000000000000000000000000000000000000000000000000000000000000005';
const data = '0xbaddad42';
const result = await tronWrap.send('tre_setAccountStorageAt', [address, slot, data]);
console.log(result);
  • tre_mine:立即挖出指定数量的区块,所传参数的 blocks 为增量挖出的块,参数范围为(0, 100](若参数未给出时,默认为 1)
const result = await tronWrap.send('tre_mine', [{ blocks: 5 }]);
console.log(result);
  • tre_unlockedAccounts:模拟账户
const result = await tronWrap.send('tre_unlockedAccounts', [['TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL']]);
console.log(result);
  • tre_blockTime:设置自动挖矿时间设置,若参数为 0,则停止自动挖矿仅在收到交易后挖出一个区块
const result = await tronWrap.send('tre_blockTime', [3]);
console.log(result);