Wie teste ich schnell eine Solidity-Funktion?

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?

Antworten (8)

Eine Möglichkeit ist die Verwendung von Remix , dem browserbasierten Solidity-Echtzeit-Compiler und Laufzeit-Solidity (früher als Browser-Solidity bezeichnet).

  1. Fügen Sie den Code in Remix ein .
  2. Wickeln Sie die Funktion contractbei Bedarf in ein ein. (Beispiel: contract C { ... }.)
  3. Klicken Sie auf die ContractRegisterkarte und dann Create, um den Vertrag zu instanziieren.
  4. Geben Sie neben der Funktion den gewünschten Eingang ein.
    • Verwenden Sie für bytes1... bytes32eine Hex-Zeichenfolge in Anführungszeichen, z. B. "0xabcdef"für bytes3.
    • Verwenden Sie für bytes, ein Array von Hex-Strings , Beispiel: ["0xab", "0xcd", "0xef"].
    • Stellen Sie für stringssicher, dass sie in Anführungszeichen gesetzt werden.
    • Stellen Sie bei großen Zahlen sicher, dass sie auch in Anführungszeichen gesetzt werden.
    • Verwenden Sie für ein Array , []Beispiel:["hello", 42, "0xabcd"]
  5. Klicken Sie auf die Funktion, um das Ergebnis zu erhalten. Das Ergebnis ist ABI-kodiert .

Hier ist ein Beispiel - Screenshot:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, "console.log" zu erstellen?
Das nächste Äquivalent ist die Verwendung eines Ereignisses wie event print(uint x), dann können Sie in Ihrer Funktion print(255), und Sie werden sehen, dass es im Solidity-Browser angezeigt wird.
Wenn Sie dies in der im Mist-Client integrierten Remix-IDE tun möchten, werden Sie standardmäßig über die Schaltfläche „Erstellen“ aufgefordert, die Transaktion zu veröffentlichen. Um es einfach wie in dieser Antwort auszuführen, schalten Sie das Dropdown-Menü „Umgebung“ auf „Javascript VM“ um.

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.

IMHO Dies ermöglicht echte Komponententests im Gegensatz zu Integrationstests mit Ihrem RPC-Client.
Wenn Sie hauptsächlich Solidity-Solidity-Code verwenden, ist dies ein guter Ansatz. Wenn Sie eine App mit viel Interaktion mit Off-Chain-Komponenten schreiben, würde ich die andere Antwort mit Trüffel/Pudding empfehlen (oder Ihre eigene erstellen).
OP fragt nicht nach unit testing, warum verwenden Sie nicht Truffle oder Embark?
Truffle und Embark sind sehr sinnvoll, um browserbasierte Dapps zu erstellen, und sie eignen sich hervorragend für Integrationstests. Aber es ist auch schön, das, was Sie testen, isolieren und Unit-Tests schreiben zu können. Der größte Teil meiner Arbeit erfolgt ausschließlich in Solidity, während andere Teammitglieder sich um die Integration und benutzerorientierte Komponenten kümmern. In Anbetracht meines Anwendungsfalls ist Dapple ideal. Wahrscheinlich schadet es auch nicht, dass ich dabei geholfen habe!

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);
  });
});
Ich habe meine eigene Umgebung gegabelt und erstellt, aber ich stimme zu. Schreiben Sie automatisierte Regressionstests für Solidity-Verträge. Hat mir bei ca. 1000 Solidity-Zeilen (bisher) jede Menge Kopfschmerzen erspart

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:

EthFiddle.com-Demo

das ist genau das was ich suche. Danke, Mann..
Es ist sehr prägnant, aber es konnte den Vertrag nicht debuggen.
das ist toll! Leider scheint es nicht mehr zu funktionieren - es bleibt beim "Kompilieren" hängen und bietet die aufzurufenden Funktionen nicht an.

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"));
Nett. Muss das mal checken.

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 remixTag 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.

Danke (aufgewertet). Diese Fragen und Antworten wurden geschrieben, nachdem mir mehrere Antworten auf andere Fragen klar gemacht hatten, dass es Wiederholungen gab, wie Remix zur Beantwortung einer Vielzahl von Fragen verwendet werden konnte, und es fehlte eine klarere Dokumentation :)

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.

Interagieren Sie mit dem Vertrag

Hier sind einige Videos: