Auf dieser Ethereum Stack Exchange und anderen Websites werden Ausschnitte und Funktionen des Solidity-Codes bereitgestellt. Was sind Möglichkeiten, sie schnell zu testen, möglicherweise ein wenig zu debuggen und herumzuspielen?
Eine Möglichkeit ist die Verwendung von Remix , dem browserbasierten Solidity-Echtzeit-Compiler und Laufzeit-Solidity (früher als Browser-Solidity bezeichnet).
contract
bei Bedarf in ein ein. (Beispiel: contract C { ... }
.)Contract
Registerkarte und dann Create
, um den Vertrag zu instanziieren.bytes1
... bytes32
eine Hex-Zeichenfolge in Anführungszeichen, z. B. "0xabcdef"
für bytes3
.bytes
, ein Array von Hex-Strings , Beispiel: ["0xab", "0xcd", "0xef"]
.strings
sicher, dass sie in Anführungszeichen gesetzt werden.[]
Beispiel:["hello", 42, "0xabcd"]
Hier ist ein Beispiel - Screenshot:
Ich persönlich verwende Dapple zum Schreiben von Solidity-Einheitentests. Es hat den Vorteil, dass keine Javascript-Testframework-Schicht erforderlich ist, sodass Sie vollständig in Solidity bleiben können. Außerdem kann ich es verwenden, um Verträge zu testen, die Importe verwenden, was meiner Meinung nach in Chriseths browserbasiertem Solidity möglich ist.
Bearbeiten: Die akzeptierte Antwort ist definitiv eine bessere Option für jemanden, der nur einen Vorgeschmack auf die Sprache bekommen möchte. Ich bin immer noch der Meinung, dass Dapple eine bessere Option für Leute wie mich ist, die gerne auf der Kommandozeile bleiben und vielleicht einen Schnelltest machen möchten, um etwas Licht in einige der dunkleren Ecken der Sprache zu bringen. (Sie können meine Vorliebe für die Befehlszeile leicht unterschätzen. Es ist ein wenig lächerlich und erstreckt sich darauf, kurze Skripte auszuschalten, damit ich Websites überprüfen kann, ohne zu einem Browser wechseln zu müssen.)
Das heißt, seit ich diese Frage beantwortet habe, habe ich ein Tool namens Solidity REPL gefunden , das genau das tut, was der Name andeutet: gibt Ihnen eine Solidity REPL auf der Befehlszeile. Um mit der Sprache herumzuspielen und schnelle Plausibilitätsprüfungen durchzuführen, wie man es bei etwas wie Python tun könnte, empfehle ich dieses Tool Dapple vorzuziehen.
unit testing
, warum verwenden Sie nicht Truffle oder Embark?Es gibt einige Möglichkeiten, Solidity-Verträge zu testen. Am einfachsten ist meiner Meinung nach das Blackbox-Testen mit Truffle . Verträge sind in der Regel relativ klein und in sich geschlossen, sodass Blackbox-Tests hier angebracht erscheinen.
Mit Truffle können Sie Unit-Tests in Javascript mit Pudding schreiben , einer Erweiterung von web3, Mocha und Chai . Ein typischer Test sieht so aus:
contract('MetaCoin', function(accounts) {
it("should put 10000 MetaCoin in the first account", function(done) {
// Get a reference to the deployed MetaCoin contract, as a JS object.
var meta = MetaCoin.deployed();
// Get the MetaCoin balance of the first account, and assert that it's 10000.
meta.getBalance.call(accounts[0]).then(function(balance) {
assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
}).then(done).catch(done);
});
});
Wenn Sie nur nach einer wirklich schnellen Möglichkeit suchen, Code zu testen und im Browser zu spielen, können Sie https://ethfiddle.com/ verwenden.
(Vollständige Offenlegung: Ich bin Teil des Teams, das es gebaut hat.)
Ich fand die Benutzeroberfläche von Remix in vielen Fällen kompliziert und übertrieben, wenn ich die meiste Zeit nur 1) schnell einen Vertragscode ausführen und testen wollte, den ich online gefunden hatte, und 2) den Vertragscode mit anderen teilen ohne sie müssen es woanders kopieren/einfügen, um es auszuführen. Also haben wir eine Alternative entwickelt, die sich hauptsächlich auf Einfachheit und gemeinsame Nutzung konzentriert.
Hier ist eine kurze Demo:
Eine weitere Option ist die Verwendung der EthereumJ-Implementierung. Wir haben kürzlich die Version 1.2.0 herausgebracht und sie hat ein nettes Feature speziell für solche Fälle. Sie können das Muster hier überprüfen
StandaloneBlockchain bc = new StandaloneBlockchain();
SolidityContract contract = bc.submitNewContract(
"contract A { uint a; ... }"
);
contract.callFunction("funcName", "arg1", 2, new byte[] {1,2,3}, "arg4");
bc.createBlock()
System.out.println("Result: " + contract.callConstFunction("getResultFunc"));
Der einfachste Weg, schnell zu testen, ein wenig zu debuggen und herumzuspielen, ist meiner Meinung nach solidity-repl , da sein Ziel genau das schnelle Testen von Solidity-Code ist.
Ich glaube, dass dieses Projekt am besten darauf reagiert, wonach der Text Ihrer Frage verlangt, und um ehrlich zu sein, spüre ich eine Voreingenommenheit, bei der Sie die Frage mit Blick auf Ihre eigene zukünftige Antwort geschrieben haben, damit Sie sie akzeptieren würden. Nicht zuletzt ist das remix
Tag in der Frage selbst ein ziemlich überzeugender Indikator. :)
Während Ihre Kriterien für die "erwartete Antwort" auf Ihre eigene Frage subjektiv sind und nicht in Frage gestellt werden konnten, lasse ich Solidity-Repl hier trotzdem, weil andere Leute wahrscheinlich mit einer ähnlichen Frage hierher kommen und dieses Tool a finden werden Besser passen.
Wenn Sie sich nur für Solidity interessieren, bietet Dapple, wie bereits beantwortet, das beste Framework für Unit-Tests.
Wenn Sie jedoch in .Net / Nethereum entwickeln, können Sie Integrationstests gemäß Ihrem Soliditätsvertrag durchführen:
var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var test = contract.GetFunction("test4"); Assert.True(await test.CallAsync<bool(BigInteger.Parse("3457987492347979798742")));
Sie müssen Ihren Vertrag bereits in Ihrem Testnetz bereitgestellt haben. Im obigen Beispiel kennen wir die ABI bereits (in einer Zeichenfolge gespeichert) und verwenden die Vertragsadresse der Quittung, um den Vertrag zu initialisieren.
Es ist auch wichtig, die Ereignisse Ihres Vertrags zu testen, zum Beispiel kann ein ERC20-Transferereignis einen Test wie diesen haben:
var allTransfersFilter = await transfersEvent.CreateFilterAsync(new BlockParameter(3000)); var eventLogsAll = await transfersEvent.GetAllChanges<Transfer>(allTransfersFilter);
Assert.Equal(1, eventLogsAll.Count); var transferLog = eventLogsAll.First(); Assert.Equal(transferLog.Log.TransactionIndex.HexValue, transferReceipt.TransactionIndex.HexValue); Assert.Equal(transferLog.Log.BlockNumber.HexValue, transferReceipt.BlockNumber.HexValue); Assert.Equal(transferLog.Event.AddressTo, newAddress); Assert.Equal(transferLog.Event.Value, (ulong)1000);
Oben rufen wir ein Ereignis ab, validieren die Transaktionsübereinstimmung und bestimmte Ereignisattribute stimmen überein, wie die Adresse, an die der Betrag gesendet wird, und der Wert.
Zunächst würde ich vorschlagen, dass Sie Ihren Code in einer IDE wie SublimeText schreiben . Dann würde ich Remix verwenden , um zu überprüfen, ob Ihre Syntax korrekt ist und dass sie kompiliert wird.
Die Leute haben Truffle erwähnt , aber meiner Meinung nach verändert es nur die Lernkurve. Truffle verwendet hinter den Kulissen testrpc , das Sie unabhängig einrichten und verwenden können. Ich würde vorschlagen, dass Sie sich die Zeit nehmen, alle Teile des Puzzles zu lernen.
Alles in allem simuliert testrpc nur die Funktionalität. Ich würde immer vorschlagen, dass Sie Ihre Verträge in einer „echten“ Umgebung testen. Das Ropsten Testnetz ist dafür das beste Testnetz.
EthTools.com (meine Firma hat das gebaut) hat ein Tool, um Verträge an die Kette zu senden und dann mit ihnen zu interagieren. Sie können überprüfen, ob Ihre Funktionalität funktioniert, indem Sie mit dem Vertrag interagieren und überprüfen, ob Sie die richtigen Antworten erhalten. Sie können dies im Ropsten-Testnetzwerk oder im Mainnet (wie Sie es für richtig halten) tun.
Hier sind einige Videos:
manidos
eth
event print(uint x)
, dann können Sie in Ihrer Funktionprint(255)
, und Sie werden sehen, dass es im Solidity-Browser angezeigt wird.Macil