天天看點

Truffle Testing的問題和解釋

問題

當我運作

truffle test

的時候,有點驚訝地發現測試過程裡并不需要啟動ganache-cli指令行程式。翻看了truffleframework的文檔也是含糊其辭,倒是處處暗示必須使用Ganache或者

Truffle Develop

作為測試的運作時。

是以我開始動手做試驗。

試驗

先去測試檔案xxContractTest.js中使用

console.log(accounts)

列印輸出accounts。重複運作測試後,結果始終是一緻,如下:

[ '0x627306090abaB3A6e1400e9345bC60c78a8BEf57',
  '0xf17f52151EbEF6C7334FAD080c5704D77216b732',
  '0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
  '0x821aEa9a577a9b44299B9c15c88cf3087F3b5544',
  '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2',
  '0x2932b7A2355D6fecc4b5c0B6BD44cC31df247a2e',
  '0x2191eF87E392377ec08E7c08Eb105Ef5448eCED5',
  '0x0F4F2Ac550A1b4e2280d04c21cEa7EBD822934b5',
  '0x6330A553Fc93768F612722BB8c2eC78aC90B3bbc',
  '0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE' ]           

複制

而且測試中列印出了運作時的網絡始終是test,如下:

$ truffle test
Using network 'test'           

複制

我對這個網絡比較困惑,原因是該項目的配置檔案

truffle.js

并沒有聲明名稱為test的網絡。是以我需要更多的資訊,通過幫助指令

./node_modules/.bin/truffle help test

,得知了一下可選參數:

Usage:        truffle test [<test_file>] [--compile-all] [--network <name>] [--verbose-rpc] [--show-events]
  Description:  Run JavaScript and Solidity tests
  Options: 
                <test_file>
                    Name of the test file to be run. Can include path information if the file does not exist in the
                    current directory.
                --compile-all
                    Compile all contracts instead of intelligently choosing which contracts need to be compiled.
                --network <name>
                    Specify the network to use, using artifacts specific to that network. Network name must exist
                    in the configuration.
                --verbose-rpc
                    Log communication between Truffle and the Ethereum client.
                --show-events
                    Log all contract events.           

複制

其中

--network <name>

引起了我的注意。我開始試驗不同網絡,比如:

truffle test --network develop

,結果有點意外:

Using network 'develop'.

  Contract: xxContract
[ '0x627306090abaB3A6e1400e9345bC60c78a8BEf57',
  '0xf17f52151EbEF6C7334FAD080c5704D77216b732',
  '0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
  '0x821aEa9a577a9b44299B9c15c88cf3087F3b5544',
  '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2',
  '0x2932b7A2355D6fecc4b5c0B6BD44cC31df247a2e',
  '0x2191eF87E392377ec08E7c08Eb105Ef5448eCED5',
  '0x0F4F2Ac550A1b4e2280d04c21cEa7EBD822934b5',
  '0x6330A553Fc93768F612722BB8c2eC78aC90B3bbc',
  '0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE' ]           

複制

前後對比,不難發現,兩次輸出的賬戶是一緻的。我稍微思考了一下,覺得是這可能是

truffle test

的fallback機制,因為配置檔案

truffle.js

确實沒有任何設定develop的網絡。

供開發測試用的是local網絡,配置如下,是以我重新針對該網絡運作測試。

local: {
            host: '127.0.0.1',
            port: 8545,
            network_id: '*'
        }

$ truffle test --network local                 

複制

此時運作出錯,錯誤是連接配接不上Ethereum Client,這是符合期望的行為。

Could not connect to your Ethereum client with the following parameters:
    - host       > 127.0.0.1
    - port       > 8545
    - network_id > *
Please check that your Ethereum client:
    - is running
    - is accepting RPC connections (i.e., "--rpc" option is used in geth)
    - is accessible over the network
    - is properly configured in your Truffle configuration file (truffle-config.js)

Truffle v5.0.5 (core: 5.0.5)
Node v10.15.3           

複制

那麼,究竟Truffle test的fallback機制是怎樣的呢?我們需要去源碼中尋找答案。

解釋

Truffle的指令組織,結構比較簡單,可以快速定位到檔案,如:trufflesuite/truffle/packages/truffle-core/lib/commands/test.js。其fallback機制集中在run方法中。

if (config.networks[config.network]) {
          Environment.detect(config, environmentCallback);
        } else {
          var ipcOptions = {
            network: "test"
          };

          var ganacheOptions = {
            host: "127.0.0.1",
            port: 7545,
            network_id: 4447,
            mnemonic:
              "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat",
            gasLimit: config.gas,
            noVMErrorsOnRPCResponse: true
          };

          Develop.connectOrStart(ipcOptions, ganacheOptions, function(
            started,
            disconnect
          ) {
            ipcDisconnect = disconnect;
            Environment.develop(config, ganacheOptions, environmentCallback);
          });
        }
      });           

複制

Develop.connectOrStart(...)

方法其實和執行

truffle develop

是相同的操作。是以不難知道,

truffle test

是通過

truffle develop

啟動新的節點,然後設定了一系列可用的accounts。

為了進一步驗證材料,可以驗證下助記詞

candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

是否會産生上述的十個賬号位址。

驗證的方式很簡單,拷貝助記詞黏貼到線上bip39網站裡,選擇ETH-Ethereum作為Coin,然後觀察輸出的位址,确認确實符合期望。

Truffle Testing的問題和解釋

bip39

Truffle Testing的問題和解釋

address

2019-04-02