End-to-end testen simuleert echt gebruikersgedrag door de volledige stroom van een applicatie van begin tot eind te testen. In de context van Defi -toepassingen betekent E2E -testen:
- Beginnend met een portemonnee -verbinding – Net zoals een echte gebruiker zou doen
- Volledige financiële transacties uitvoeren – Deposito’s, lenen, trekt zich terug, etc.
- Resultaten verifiëren in alle lagen – UI -wijzigingen, blockchain -status, database -records
- Hele gebruikersreizen testen – Niet alleen individuele functies
Het onderstaande diagram illustreert de complexe interacties in een defi -kredietprotocol tijdens de afzetting en lenen stromen. Het begrijpen van deze interacties is cruciaal voor het ontwerpen van uitgebreide testgevallen:
Kredietnemerstroom:
Liquidatorstroom:
Core Lending Protocol Functions
- Borg: Levering van onderpand aan het protocol
- Lenen: Neem een lening af tegen uw onderpand
- Terugbetalen: Betaal geleende activa plus rente terug
- Terugtrekken: Verwijder uw onderpand uit het protocol
- Liquideren: Betaal een deel van een ongezonde lening in ruil voor een korting op het onderpand
Zoals u ziet, activeert een eenvoudige gebruikersactie zoals het afzetten van ETH meerdere interacties:
- Prijscontroles met een Oracle -service
- Tokenconversies (eth to weth)
- Slimme contractstatus updates
- Gebruikerspositie volgen
- Activiteitsregistratie in de database
Onze E2E -tests moeten verifiëren dat elk van deze stappen met succes is voltooid, net zoals in een productieomgeving.
U kunt de Samenvoegen Framework, een end-to-end (E2E) testkader dat is ontworpen voor gedecentraliseerde toepassingen (DApps). SYNTRESS STUKT BEIDE Toneelschrijver En Cipres als plug-ins en biedt ingebouwde functies voor het hanteren Metamask -authenticatie, transacties en portemonnee interacties.
Installeer het opdracht Syntpress Framework:
npm install --save-dev @synthetixio/synpress @synthetixio/synpress-tsconfig
Installeer Playwright Framework Command:
npm install --save-dev @playwright/test
Setup Metamask -portemonnee:
Voor handmatige UI -testen kunt u tijdens het gebruik de privésleutel van het Hardhat Local Network kopiëren npx hardhat node en importeer het account in het Metamask zoals deze:
Tijdens de portemonnee opstelling met SYNPRESS zal het een nieuwe portemonnee voor u creëren. Als u een Hardhat lokaal netwerk gebruikt, kunt u eenvoudig de standaardzaadzin van Metamask en elk wachtwoord voor de portemonnee -installatie gebruiken.
Hier is hoe u een Metamask -portemonnee kunt instellen met SYNPRESS:
Het SYNPRESS -framework zal op zoek zijn naar een specifieke bestandsnaam en map voor de portemonnee -instelling. U moet het bestand een naam geven metamask.setup.tsPlaats het in de wallet-setup map en voer deze opdracht uit:
npx synpress wallet-setup
In de onderstaande video zul je zien dat het een browser opent om een metamask -portemonnee te maken en de portemonnee in de installatie in de .cache-synpress map.
Nadat u de map Wallet Cache hebt, kunt u eenvoudig de opdracht Playwright voor uw testcase uitvoeren.
npx playwright test
In de onderstaande video kunt u zien dat Syntpress helpt bij het beheren van de portemonnee -plug -in op de Chrome -extensie, waardoor echte gebruikersactiviteiten op de gebruikersinterface worden gesimuleerd. U kunt een script maken om te automatiseren van het bevestigen van transacties op de Pop -up van Metamask zoals gewenst.
Playwright Report Resultaat:
Tips: screenshot resultaatrapport in Playwright
Je weet misschien al dat om testresultaten in Playwright te maken, je moet gebruiken await page.screenshot(). Of u echter een screenshot of een videoPlaywright Records per context.
Tijdens de uitvoering van de test opent Playwright bijvoorbeeld de Chrome Extension (Metamask) in het eerste tabblad En Uw dapp op het tweede tabblad. In onze testrapporten willen we echter de daadwerkelijk vastleggen de Metamask -pop -up De transactiegegevens en gaskosten weergeven.
Hoe kan ik zowel hoofdpagina als pop -up in toneelschrijver vastleggen?
Ik heb een Aangepaste functie om screenshots van beide te maken hoofdpagina en de pop -uppagina.
- Toneelschrijver kan Detecteer een pop -up sessie gebruik
context.waitForEvent('page') - Na het vastleggen van beide afbeeldingen, ik Voeg ze samen in een enkele foto gebruik van de Scherp bibliotheek.
U kunt de implementatie zien in de onderstaande code.
Laatste stap:
Roep gewoon de screenshot -functie aan en gebruik testInfo.attach() Om het toe te voegen aan het HTML -rapport.
Begrijp Metamask -functies in Syntpress:
metamask.connectToDapp()
Als we gebruiken metamask.connectToDapp()Het Selecteert automatisch het standaardaccount In onze Metamask -portemonnee en verbindt deze met de DAPP wanneer we op de Verbinden knop in de gebruikersinterface.
metamask.switchAccount('Account 2')
Deze functie schakelt het actieve account in Metamask door de accountnaam op te geven. Het simpelweg schakelen van accounts in Metamask is echter niet automatisch bijgewerkt het verbonden account in de DAPP. De DAPP moet luisteren naar de Account Wijzigingsgebeurtenissen van Metamask om de schakelaar op de juiste manier te detecteren en af te handelen.
Bij het klikken op de knop “Wallet aansluiten”, controleer ik of een account al is aangesloten. Als dat zo is, verbind ik het eerst en verbind ik opnieuw.
Tijdens de automatisering, na het schakelen van accounts, wordt Metamask automatisch geselecteerd Account 2Zoals hieronder getoond.
Evenzo moet de frontend bij het wisselen van netwerken een gebeurtenisluisteraar instellen voor Metamask -evenementen, net als bij het schakelen van accounts.
metamask.switchNetwork(Local Optimism, true);
metamask.confirmTransaction()
Deze functie wordt gebruikt bij het omgaan met een DAPP en het uitvoeren van een transactie die Wijzigt de blockchain -status (Bijv. Tokens overbrengen, saldi bijwerken of gegevens schrijven naar opslag). Wanneer dit gebeurt, Metamask vereist de gebruiker om de transactie te bevestigen voordat het wordt uitgevoerd.
ANVIL gebruiken voor netwerksimulatie
Anvil is een lokale Ethereum -ontwikkelingsomgeving die deel uitmaakt van de gieterijpakket van blockchain -ontwikkelingstools. Het is vergelijkbaar met het netwerk van Hardhat, maar met enkele belangrijke verschillen die het bijzonder waardevol maken voor ons testscenario.
Aambeeld biedt:
- Een aanpasbaar lokaal Ethereum -knooppunt
- Nauwkeurige controle over keten -ID, gasparameters en bloktijd
- De mogelijkheid om meerdere onafhankelijke netwerken tegelijkertijd uit te voeren
- Geavanceerde vorkmogelijkheden
Meerdere netwerken instellen:
// Start L1 Anvil node with realistic gas prices
const l1Node = spawn('anvil', [
'--chain-id', '31337',
'--base-fee', gasPrices.l1.baseFee.toString(),
'--host', '0.0.0.0',
'--port', '8545',
'--block-time', '12', // 12-second block times for Ethereum
'--fork-url', `https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
mainnetBlockNumber ? `--fork-block-number=${mainnetBlockNumber}` : ''
]);// Start L2 Anvil node with lower gas prices
const l2Node = spawn('anvil', [
'--chain-id', '420',
'--base-fee', forcedL2BaseFee.toString(),
'--host', '0.0.0.0',
'--port', '8546',
'--block-time', '2', // 2-second block times for Optimism
'--fork-url', `https://opt-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
optimismBlockNumber ? `--fork-block-number=${optimismBlockNumber}` : ''
]);
Real-time gasupdates:
Dit stelt ons in staat om te hebben:
- Twee afzonderlijke netwerken die gelijktijdig worden uitgevoerd op localhost
- Verschillende ketting -ID’s voor L1 (31337) en L2 (420)
- Verschillende gasprijzen om L1/L2 -kostenverschillen te simuleren
- Onafhankelijke staat voor elk netwerk
Tijdmanipulatie
Onze tests zijn sterk afhankelijk van tijdmanipulatie om de opbouw van de rente en liquidaties te testen.
Bekijk deze functie die de interessewaarde per vooruitgang op blockchain controleert:
Opmerking over de lokale testomgeving:
Het Smart Contract Lending berekent rente op 5% per jaar, wat tijdsontwikkeling vereist om correct te testen. In tegenstelling tot echte netwerken, is de lokale blockchain van Hardhat niet automatisch om tijdstempels te blokkeren. Om het verstrijken van de tijd voor de accumulatie van rente te simuleren, moeten we de blockchain handmatig vooruitgaan.
Evenzo, Gezondheidsfactorberekeningen zijn afhankelijk van collaterale prijsschommelingen. In een lokale omgeving moeten we een nepprijs orakel implementeren dat ofwel:
- Haal reële prijzen op van externe API’s zoals CoinmarketCap (nuttig voor realistische scenario’s)
- Handmatige prijsaanpassingen toestaan (essentieel voor het testen van randgevallen zoals liquidatie -gebeurtenissen)
Deze twee simulatietechnieken maken een uitgebreide testen van alle protocolstatussen mogelijk, inclusief het kritieke liquidatieproces wanneer de gezondheidsfactor van een gebruiker onder de drempel valt.
Ons framework test hetzelfde protocol dat op verschillende netwerktypen wordt geïmplementeerd:
Netwerkverschillen:
- L1 (Ethereum): Hogere gaskosten, langzamere bloktijden
- L2 (optimisme): Lagere gaskosten, snellere bloktijden, verschillende transactieformaat
Cross-netwerk testscenario’s
We hebben tests geïmplementeerd die verifiëren:
- Netwerkisolatie: Posities op het ene netwerk hebben geen invloed op het andere
- Gaskostenvergelijking: Vergelijk transactiekosten tussen L1 en L2
- UI -consistentie: Controleer de UI -handgrepen beide netwerken correct
Hier is een teststap die netwerkisolatie en gaskosten verifieert:
Tijdens transacties op de DAPP registreren we het gebeurtenistype samen met alle relevante blockchain -gegevens, zoals de keten -ID, account en gaskosten, in de onderstaande gegevenskolom:
Netwerklaag 2 Gegevens:
{
"user": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
"token": "0x1343248Cbd4e291C6979e70a138f4c774e902561",
"amount": "1",
"chainId": 420,
"gasMetrics": {
"baseFee": "9826117",
"gasUsed": "79381",
"gasPrice": "1019652234",
"blockTime": "2025-03-04T19:57:11.000Z",
"totalGasCost": "80941013987154"
}
}
Netwerklaag 1 Gegevens:
{
"user": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
"token": "0xF01f4567586c3A707EBEC87651320b2dd9F4A287",
"amount": "1",
"chainId": 31337,
"gasMetrics": {
"baseFee": "982611638",
"gasUsed": "79381",
"gasPrice": "2965223276",
"blockTime": "2025-03-04T20:03:34.000Z",
"totalGasCost": "235382388872156"
}
}
Zoals te zien in de gegevens, heeft netwerklaag 2 lagere gaskosten in vergelijking met netwerklaag 1. De totale gaskosten op laag 2 zijn 80.941.013.987,154terwijl op laag 1 dat is 235,382,388,872,156.
Dit betekent dat laag 2 ongeveer bespaart 154,441,374.885,002 in gaskosten, waardoor het aanzienlijk kostenefficiënter wordt.
Waarom testen tussen netwerken?
Hoewel veel gebruikers mogelijk interageren met DEFI -protocollen op een enkel netwerk, zijn er boeiende redenen waarom testen op meerdere netwerken essentieel is:
Echte cross-netwerkgebruik:
Veel defi -applicaties werken tegenwoordig daadwerkelijk in meerdere netwerken:
- Brugprotocollen: Toepassingen zoals Stargate, HOP -protocol en over connect -activa tussen netwerken.
- Multi-chain implementaties: Major Defi -protocollen (AAVE, UNISWAP, enz.) Geplimply op meerdere netwerken, en gebruikers bewegen vaak tussen hen op basis van gaskosten.
- L2 migratiestrategieën: Gebruikers storten vaak op L1 en migreren vervolgens naar L2 voor goedkopere transacties naarmate protocollen uitbreiden.
- Cross-chain collateralisatie: Sommige geavanceerde Defi -applicaties stellen gebruikers in staat om onderpand op het ene netwerk te gebruiken om op het andere te lenen.
Naast het volgen van gas in databasetests vanuit een ander netwerk, zoals in het bovenstaande voorbeeld, kunnen we ook transactiesucces volgen en falen om gebruikersgedrag te analyseren. Dit helpt bij Financiële correctheidstests uitvoeren en de foutafhandeling verbeteren.
Als een gebruiker bijvoorbeeld probeert te lenen 0.8 ETH (die de 75% onderpandfactor):
- Controleer of een fout is vastgelegd in de database.
- Controleer of de positie van de gebruiker ongewijzigd blijft.
Klaar om het zelf te proberen?
Nu je de stroom hebt gezien, het project hebt opgezet en onderzocht hoe je met Metamask kunt communiceren, is het tijd om hands-on te krijgen! Deze repo omvat een E2E liquidatiestroom Als voorbeeld, maar voel je vrij Breid het uit, experimenteer en ontwerp uw eigen testcases.
🔗 Bekijk de repo en begin met testen: [Repo Link]
Of u nu automatiseringsvaardigheden verfijnt of Defi -testen verkent, dit is uw sandbox – veel plezier en breek dingen (veilig)! 🚀
Bedankt voor het lezen, en ik hoop dat je dit artikel nuttig vond.
Als je dit artikel nuttig vond, geef het dan een 👏 (of een paar!) Om anderen te helpen het te ontdekken!
