Es scheint, dass truffle test
automatisch 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 test
für eine Sache und truffle deploy
für eine andere Sache verwenden.
Gibt es eine Möglichkeit zu "sagen" truffle test
, das Laufen zu vermeiden truffle deploy
?
Danke dir!!!
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.
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:
canache-cli
mit einem separaten Netzwerk namens austest
truffle migrate
Skript im Netzwerk befindet test
, tun Sie nichtstruffle test
mit Option ausführen--network test
Im Detail:
Fügen Sie am Anfang migrations/2_contract
der Zeile hinzu:
module.exports = async function(deployer, network, accounts) {
if (network == "test") return; // test maintains own contracts
…
}
Neues Netzwerk hinzufügen test
zu 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-cli
aus (neben dem einen laufenden Netzwerk development
:
In einer Konsole führe ich Ganache für development
fü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.
Die truffle test
Befehlszeile verwendet die development
Netzwerkkonfiguration.
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 if
Anweisung 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.js
oder 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.
truffle test
weil 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 deploy
möchte ich "the real thing" machen, da ich hier nicht die Absicht habe, die Verträge zu testen, sondern sie tatsächlich bereitzustellen.network == "production"
). Vielen Dank.deployer
, network
und accounts
.Für diejenigen, die sich nach einer Lösung fragen, hier ist die in den Kommentaren oben angedeutete:
Sieht truffle-config.js
erstmal 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 :)
Glühwächter
gute Stimmung
Glühwächter
Glühwächter
gute Stimmung