Недетерминированные исключения при запуске трюфельных тестов

Я писал автоматизированные тесты для проверки функциональности краудсейла в Truffle, используя их тестовый сервис (который, как мне кажется, использует Mocha и Chai). У меня возникли проблемы с пониманием того, почему тесты терпят неудачу недетерминированно (т.е. они, кажется, терпят неудачу в случайных точках, со случайными исключениями).

Например, я запускаю свои тесты, и иногда они все проходят успешно.

Я запускаю свои тесты и иногда получаю это сообщение об ошибке:

✓ 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, а во-вторых, не появляется каждый раз, кажется, что это случайные времена со случайными ошибками.

У кого-нибудь еще были проблемы с этим?


person Jack Pickering    schedule 28.11.2017    source источник


Ответы (1)


  • #P1#

Это очень типично для асинхронного тестирования javaScript, независимо от того, делаете ли вы тесты трюфелей ethereum или просто тесты Karma-Jasmine для внешнего интерфейса.

Я почти уверен, что у вас есть утверждения в обратных вызовах в некоторых спецификациях, которые не установлены должным образом. Спецификация проходит из-за отсутствия вызова параметра обратного вызова "done" или из-за того, что вы неправильно возвращаете обещание внутри вызова it, поэтому тест просто проходит как ложное срабатывание, игнорируя содержимое обратного вызова.

Некоторое время спустя код внутри обратного вызова запускается и терпит неудачу, что приводит к сбою текущего теста, но дает сообщение об ошибке из его теста и ложноотрицательный результат, поскольку вы получаете исключение в неправильном тесте, что делает это потерпеть неудачу.

Это также может быть вызвано тем, что .catch операторы проглатывают done вызовов.

конечно, может я просто ошибаюсь и ваша проблема действительно связана с самим Truffle, или с testrpc.

Если вы абсолютно уверены, что все ваши спецификации it правильно обрабатывают асинхронность — возвращают ли промисы или вызывают done-, вам следует вставить код тестирования и дождаться дальнейших отзывов :-S

Кроме того, вы используете testrpc в качестве блокчейна во время тестов?

person Sergeon    schedule 28.11.2017
comment
У меня сложилось впечатление, что вы должны использовать либо обратные вызовы, либо обещания в тестах, а не оба вместе, как указано в документации мокко здесь, mochajs.org/#hooks. Поэтому я нигде не реализовал done(), поскольку мои функции .then() должны ждать, пока обещание не будет возвращено, не так ли? Тем не менее, это имеет общий смысл в том, почему ошибки утверждения дают ошибку предыдущих тестов, но даже в этом случае не будут ли они каждый раз возвращать одни и те же сбои? - person Jack Pickering; 28.11.2017
comment
Да, testrpc теперь автоматически интегрируется в консоль разработки truffle, как указано здесь: github.com/trufflesuite/ganache- Кли - person Jack Pickering; 28.11.2017
comment
Я говорил об использовании done() или возврате обещаний, потому что я не знал, что вы выберете. Только возвращать обещания совершенно нормально. - person Sergeon; 28.11.2017
comment
Я предполагаю, что ваша проблема скрывается в том, что любое обещание не было должным образом returned, либо из самой спецификации it, либо из любого тогда доступного. Просто пройдите свой тестовый код и давайте посмотрим - person Sergeon; 28.11.2017
comment
Моя ошибка, я думал, что добавил свой тестовый код в вопрос! сейчас так и сделаю спасибо! - person Jack Pickering; 28.11.2017
comment
Вы абсолютно правы, я просто вызвал функцию «participate()», а затем сразу же вызвал «getState()» перед использованием промиса, и теперь все тесты проходят соответственно. Хотите опубликовать это как ответ, чтобы я мог проголосовать за вас? - person Jack Pickering; 28.11.2017