代码之家  ›  专栏  ›  技术社区  ›  Jack Pickering

运行块菌测试时出现不确定性异常

  •  0
  • Jack Pickering  · 技术社区  · 8 年前

    我一直在编写自动化测试,使用他们的测试服务(我相信使用的是摩卡和柴)测试我在块菌中的众筹功能。我很难理解为什么测试不确定地失败(即,它们似乎在随机点失败,但有随机例外)。

    Eg/ 我做了测试,有时都通过了

    我运行测试,有时会收到以下错误消息:

    ✓ deadline is set when beneficiary clicks start
    ✓ should return a State of 'Funding' after start is clicked (101ms)
    ✓ should allow someone to invest and record balance
    ✓ should send 1 ERC20 token to participant (184ms)
    ✓ softcap should not return reached when amountRaised is smaller
    ✓ softcap should return reached when amountRaised is bigger
    ✓ hardcap should not return reached when amountRaised is smaller
    ✓ hardcap should return reached when amountRaised is bigger
    1) should give 1 ETH in change as hard cap was exceeded
    > No events were emitted
    ✓ should return a State of 'Successful' when hardcap reached
    ✓ beneficiary should be able to withdraw funds
    ✓ should return a State of 'Finished' when beneficiary has funds
    
    
    22 passing (2s)
    1 failing
    
    1) Contract: Sale should give 1 ETH in change as hard cap was exceeded:
     Uncaught AssertionError: deadline was not set after start pressed by beneficiary: expected '0' to not equal 0
      at test/2Crowdsale_Test.js:119:14
      at <anonymous>
      at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    
    
    
     1
     truffle(develop)> 
     /usr/local/lib/node_modules/truffle/build/cli.bundled.js:320098
        throw reason;
        ^
    
     TypeError: Cannot read property 'currentRetry' of undefined
    at 
    
    /usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runner.js: 
    552:28
    at done 
    (/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js 
    :295:5)
    at 
    /usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js: 
    359:11
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    

    这令人困惑,因为断言与错误消息不匹配-然而,更改断言失败,返回的消息是已通过的早期测试的一部分(最后期限是在受益人单击“开始”时设置的)。

    再次运行测试,我得到:

    ✓ approves contract by beneficiary
    ✓ should return a State of 'Not Started' before start is clicked (134ms)
    ✓ deadline is set when beneficiary clicks start
    ✓ should return a State of 'Funding' after start is clicked (98ms)
    ✓ should allow someone to invest and record balance
    ✓ should send 1 ERC20 token to participant (143ms)
    ✓ softcap should not return reached when amountRaised is smaller
    ✓ softcap should return reached when amountRaised is bigger
    ✓ hardcap should not return reached when amountRaised is smaller
    ✓ hardcap should return reached when amountRaised is bigger
    1) should give 1 ETH in change as hard cap was exceeded
    > No events were emitted
    2) should return a State of 'Successful' when hardcap reached
    
    Events emitted during test:
    ---------------------------
    
    Transfer(_from: <indexed>, _to: <indexed>, _value: 5)
    FundTransfer(backer: 0xf17f52151ebef6c7334fad080c5704d77216b732, amount: 5000000000000000000, isContribution: true)
    reachedSoftCap(recipient: 0x627306090abab3a6e1400e9345bc60c78a8bef57, totalAmountRaised: 6000000000000000000)
    
    ---------------------------
    ✓ beneficiary should be able to withdraw funds
    ✓ should return a State of 'Finished' when beneficiary has funds
    
    
    21 passing (2s)
    2 failing
    
    1) Contract: Sale should give 1 ETH in change as hard cap was exceeded:
     Uncaught AssertionError: deadline was not set after start pressed by beneficiary: expected '0' to not equal 0
      at test/2Crowdsale_Test.js:119:14
      at <anonymous>
      at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    
    2) Contract: Sale should return a State of 'Successful' when hardcap reached:
     Uncaught AssertionError: hardcap was not met when amountRaised was bigger: expected false to equal true
      at test/2Crowdsale_Test.js:195:14
      at <anonymous>
      at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    
    
    
      2
      truffle(develop)> 
      /usr/local/lib/node_modules/truffle/build/cli.bundled.js:320098
        throw reason;
        ^
    
      TypeError: Cannot set property 'state' of undefined
      at 
      /usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runner.js: 
      576:20
      at done 
    (/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js 
    :295:5)
    at /usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js:353:11
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    

    我现在有上一条错误消息,现在又有一条错误消息抛出,再次抛出时,错误消息与断言错误不匹配。

    第四次运行测试时,我得到:

    ✓ should allow someone to invest and record balance
    ✓ should send 1 ERC20 token to participant (120ms)
    ✓ softcap should not return reached when amountRaised is smaller
    ✓ softcap should return reached when amountRaised is bigger
    ✓ hardcap should not return reached when amountRaised is smaller
    ✓ hardcap should return reached when amountRaised is bigger
    ✓ should give 1 ETH in change as hard cap was exceeded (275ms)
    ✓ should return a State of 'Successful' when hardcap reached (61ms)
    ✓ beneficiary should be able to withdraw funds
    1) should return a State of 'Finished' when beneficiary has funds
    > No events were emitted
    
    
     22 passing (2s)
     1 failing
    
     1) Contract: Sale should return a State of 'Finished' when beneficiary has funds:
     AssertionError: State of contract was not 'Finished': expected '4' to equal 6
      at test/2Crowdsale_Test.js:243:14
      at <anonymous>
      at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    

    这与前两个完全不同。这一项同样令人困惑,因为之前的测试(受益人应该能够提取资金)也测试了该州是否等于6,并且该测试通过。

    每次测试之前,我都会退出块菌控制台,从项目中删除我的构建文件夹,重新进入块菌控制台并进行测试(这样我就可以假设链已经重置),但我仍然会收到错误,首先,没有意义,因为我自己通过Dapp测试时没有得到这些结果,其次,不要每次都出现,这似乎是随机错误的随机时间。

    还有其他人对此有问题吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Sergeon    8 年前
    • 这令人困惑,因为断言与错误消息不匹配-然而,更改断言失败,返回的消息是已通过的早期测试的一部分(最后期限是在受益人单击“开始”时设置的)。

    这是典型的javaScript异步测试,无论您是在进行以太坊块菌测试,还是在前端进行普通的Karma Jasmine测试。

    我很有信心,在一些规范的回调中,有一些断言没有正确设置。由于没有调用“done”回调参数,或者由于没有在 it 调用,因此测试只是作为假阳性通过,忽略回调内容。

    一段时间后,回调中的代码运行并失败,从而使正在运行的测试失败,但给出了测试中的错误消息,并给出了假阴性-因为您在错误的测试中得到了异常,从而使其失败。

    这也可能是由于 .catch 报表交换 done 电话。

    当然,也许我错了,你的问题与 Truffle testrpc .

    如果你确信你所有的 规范正确地处理了异步——要么返回承诺,要么调用 完成 -,然后您应该粘贴测试代码并等待更多反馈

    此外,您是否在测试期间使用testrpc作为区块链?