Verhindern, dass „Trüffeltest“ „Trüffelbereitstellung (Migration)“ aufruft

Es scheint, dass truffle testautomatisch truffle deploy(auch bekannt als truffle migrate) aufgerufen wird.

Soweit es mich betrifft, sind diese beiden Funktionalitäten völlig unabhängig voneinander.

Ich kann also nicht ganz verstehen, warum Truffle überhaupt so funktioniert.

Die Dokumente scheinen nichts zu diesem Thema zu erwähnen.

Ich möchte truffle testfür eine Sache und truffle deployfür eine andere Sache verwenden.

Gibt es eine Möglichkeit zu "sagen" truffle test, das Laufen zu vermeiden truffle deploy?

Danke dir!!!

In einem Ihrer Kommentare unten scheinen Sie vorzuschlagen, dass Sie das Problem gelöst haben. Könnten Sie bitte Einzelheiten dazu angeben, wie?
@glowkeeper: Es wird in demselben Kommentar erklärt.
nicht wirklich - besteht die Möglichkeit, dass Sie eine Konfiguration teilen könnten?
Aha - glaube, ich habe das hinbekommen! Im Bereitstellungsskript: ``` if ( network === 'rinkeby' ) { return } ``` Dann im Testskript: ``` this.contract = await BlahContract.at('0x48B98faB029Cd2c77afA780Ab94c2d4e2f4879dA'); ``` Führen Sie dann Folgendes aus: truffle test --network rinkeby ```
@glowkeeper: Ich habe das als Antwort hinzugefügt (da es zu lang ist, um als Kommentar gepostet zu werden).

Antworten (5)

Ich bin auch auf dieses Problem gestoßen, und es ist tatsächlich das beabsichtigte Verhalten des Truffle-Tests: Reinraumverhalten. Bei jedem Lauf des Trüffeltests werden die Verträge erneut bereitgestellt. Wenn dies nicht der Fall ist, könnte sich der gespeicherte Zustand eines vorherigen Laufs auf die Ergebnisse eines nachfolgenden Laufs auswirken, wodurch Ihre Testsuite nicht deterministisch wird.

Aber ich wollte den Zustand zwischen den Durchläufen des Trüffeltests bewahren. Der vorgeschlagene Weg, dies zu tun, ist wie folgt dokumentiert:

deployer.deploy (Vertrag, {überschreiben: falsch})

Leider scheint das obige in Truffle 5.0.1 aufgrund eines Parsing-Bugs fehlzuschlagen. Eine Problemumgehung, um eine korrekte Analyse zu erzwingen, ist die folgende:

deployer.deploy (Vertrag, {gas: 6720000, überschreiben: false})

https://truffleframework.com/docs/truffle/testing/testing-your-contracts#clean-room-environment

Reinraumumgebung

Truffle bietet eine Reinraumumgebung, wenn Sie Ihre Testdateien ausführen. Wenn Sie Ihre Tests gegen Ganache oder Truffle Develop ausführen, verwendet Truffle erweiterte Snapshot-Funktionen, um sicherzustellen, dass Ihre Testdateien den Status nicht miteinander teilen. Wenn Sie gegen andere Ethereum-Clients wie go-ethereum laufen, stellt Truffle alle Ihre Migrationen am Anfang jeder Testdatei erneut bereit, um sicherzustellen, dass Sie einen neuen Satz von Verträgen zum Testen haben.

Schöne Antwort, aber es wäre noch besser, wenn Sie diesen Parsing-Fehler verlinken würden, um zu sehen, wie der Status / die Problemumgehungen / etc. sind.

Es ist wirklich peinlich, wie engstirnig die Trüffelautoren denken. Meine Tests führen ihre eigene Bereitstellung aus, die in den Tests verwendet wird. In meinem Fall beinhaltet die Truffle-Migration die Schritte, dass Daten von der alten Instanz auf die neue Instanz des Hauptvertrags kopiert werden, dann wird der alte Vertrag zerstört. Leider hilft hier der Snapshot nicht weiter, die alte Instanz wird nicht wiederhergestellt und es verbleibt eine defekte Instanz in der json-Datei des Vertrages. Also muss ich verhindern, dass die Migrationsskripte ausgeführt werden. Es gibt also gute Gründe, warum die Migration in optional und konfigurierbar sein sollte truffle test!

Ich habe es folgendermaßen gelöst:

  • Führen Sie eine Sekunde canache-climit einem separaten Netzwerk namens austest
  • Wenn sich das truffle migrateSkript im Netzwerk befindet test, tun Sie nichts
  • truffle testmit Option ausführen--network test

Im Detail:

Fügen Sie am Anfang migrations/2_contractder Zeile hinzu:

module.exports = async function(deployer, network, accounts) {
  if (network == "test") return; // test maintains own contracts
}

Neues Netzwerk hinzufügen testzu truffle-config.js:


networks: {
  development: {
    host: "127.0.0.1",
    port: 8545,
    network_id: "*"
  },
  test: {
    host: "127.0.0.1",
    port: 8546,
    network_id: "*"
  }
}

Führen Sie eine Sekunde canache-cliaus (neben dem einen laufenden Netzwerk development:

In einer Konsole führe ich Ganache für developmentfür meine GUI-Tests aus:

ganache-cli -d --db ${HOME}/tmp/ganache/development -i 123456 -p 8545

In einer anderen Konsole führe ich eine separate Ganache für aus test:

ganache-cli -d --db ${HOME}/tmp/ganache/test -i 654321 -p 8546

Das ist es! Jetzt kann ich laufen:

truffle migrate --reset

Und

truffle test --network test

Ohne Störungen.

Ich finde es unfair, die Trüffelschöpfer als "engstirnig" zu bezeichnen.

Die truffle testBefehlszeile verwendet die developmentNetzwerkkonfiguration.

Mit anderen Worten, es ist tatsächlich äquivalent zu truffle test network=development.

Also habe ich dieses Problem gelöst, indem ich jedes der Migrationsskripte in meinem Projekt hinzugefügt habe:

module.exports = function(deployer, network, accounts) {
    // encapsulate everything with this `if` statement
    if (network == "production") {
        ...
    }
};

Daher wird bei der Ausführung nicht alles innerhalb der ifAnweisung ausgeführt truffle test.

Und um die Möglichkeit zu behalten, meine Verträge mit Truffle bereitzustellen, habe ich dies in meiner Truffle-Konfigurationsdatei ( truffle.jsoder truffle-config.js) hinzugefügt:

    production: {
        host:       "localhost", // for example
        port:       7545,        // for example
        network_id: "*",         // for example
        gasPrice:   20000000000, // for example
        gas:        6721975      // for example
    }

Dadurch kann ich meine Verträge über eine der folgenden Befehlszeilen bereitstellen:

  • truffle deploy --network=production
  • truffle migrate --network=production

Bevor Sie einen Test durchführen können, müssen Sie den Ausgangspunkt, die Startbedingungen, im Smart Contract definieren. - Denken Sie an die Werte der Variablen in den Smart Contracts. Diese Bedingungen werden durch den Bereitstellungsprozess definiert. Daher würde man normalerweise zuerst die Bereitstellung ausführen, bevor man sie testet. Außerdem ermöglicht dies ein einfaches Zurücksetzen der Blockchain nach jedem einzelnen Test.

Wenn Sie dies nicht möchten, können Sie es mit truffle scripts versuchen . Sie ermöglichen es Ihnen, jedes Skript oder jeden Test auszuführen.

Danke dir. Nein, würde ich gerne verwenden, truffle testweil es einen guten Bericht liefert. Ich möchte selbst Verträge erstellen/bereitstellen – unterschiedliche Verträge für jeden Test. Und ganz sicher nicht für jeden Test die gleichen. In einigen meiner Tests verwende ich Mockup-Verträge, um einen einzelnen Vertrag isoliert zu testen (auch bekannt als unitest ). In dem an übergebenen Migrationsskript truffle deploymöchte ich "the real thing" machen, da ich hier nicht die Absicht habe, die Verträge zu testen, sondern sie tatsächlich bereitzustellen.
Dann möchten Sie vielleicht Flags für das Deployment verwenden: truffleframework.com/docs/advanced/configuration Wenn kein Flag übergeben wird, führen Sie einfach keinen Deployment-Code aus. Dann läuft der Truffle-Test ohne Deployment durch. Wenn Sie --network "testnetName" übergeben, könnten Sie das Deployment in der Migration ausführen.
Genau so habe ich es gelöst, BTW (nur ausführen, wenn network == "production"). Vielen Dank.
Obwohl ich sie nicht "Flags" nennen würde, gibt es tatsächlich 3 Parameter, die an das Skript übergeben werden - deployer, networkund accounts.
Ich habe die gleiche Anforderung - bevor ich mit der Entwicklung von Frontend-Code für bereits bereitgestellte Verträge beginne, möchte ich einige Tests durchführen, um sicherzustellen, dass sie korrekt funktionieren! @josojo - kannst du bitte genau sagen, wie "ohne Flaggen" funktionieren würde?
Diese Antwort geht nicht wirklich auf die Frage ein, außer vielleicht, um die Begründung der Truffle-Entwickler zu erklären, die der Standardtestpraxis widerspricht (indem das Setup immer gleich ist). Lustig ist, dass Truffle die Blockchain auch nicht nach jedem Test zurücksetzt.

Für diejenigen, die sich nach einer Lösung fragen, hier ist die in den Kommentaren oben angedeutete:

Sieht truffle-config.jserstmal so aus:

module.exports = {
  networks: {
    rinkeby: {
      host: "localhost", // Connect to geth on the specified
      port: 8545,
      from: "0x8f03ca885434522d695735a28d6a8a93b4390da9", // default address to use for any transaction Truffle makes during migrations
      network_id: 4,
      gas: 4612388 // Gas limit used for deploys
    }
};

Dann im Skript 2_deploy...:

if ( network === 'rinkeby' ) 
{ 
  return 
} 

Schließlich in Ihrem Testskript:

this.contract = await BlahContract.at('0x48B98faB029Cd2c77afA780Ab94c2d4e2f4879dA') 

Dann renne:truffle test --network rinkeby

Offensichtlich benötigen Sie etwas Rinkeby-Ether und Sie müssen ein Konto entsperren, mit etwas wie personal.unlockAccount(eth.coinbase, "yourPassword", 3000);der Geth-Konsole, aber ich habe diese Methode, die für mich funktioniert. Yay :)