Web 3 představuje nový koncept architektury i business modelu webových aplikací. Jejich decentralizace přináší větší svobodu a nezávislost, ale také lepší možnosti zabezpečení. O to důležitější roli při vývoji web3 aplikací hraje testování. To má oproti webu 2.0 svá specifika – nové nástroje a postupy, ale také problémy. Jaké to jsou?
Přestože se testování ve vývojovém cyklu stále posouvá doleva (shift left), pro testování potřebujeme alespoň část vyvinuté aplikace. Jak se taková web3 aplikace vyvíjí, popsal Jakub v tomto článku. Pokud jste úplní web3 začátečníci, doporučuju začít u technologického stacku, který výborně shrnul Nader Dabit.
Pro pořádek ještě zmíním, že všechny mnou používané nástroje pracují s Ethereum blockchainem. Prezentované principy nicméně fungují stejně i pro Solanu, Tezos a další.
V článku se také zaměřím primárně na testování web3 aplikací, propojení s peněženkou, interakce se smart contractem, externími databázemi a file systémy, ale nebudu se věnovat testování smart contractů jako takových.
V čem se testování web3 liší?
Zjednodušeně o web3 říkám, že oproti web 2.0 vyměníme Facebook login za Metamask. Kdo se seznámil s web3 stackem, už tuší, že hlavní rozdíl spočívá v decentralizaci. Ta ze svého principu přináší zásadní výzvu pro testování. Setup prostředí, testovacích dat či účtů je mnohem složitější.
I proto se web3 liší také nástroji, které pro testování používáme. Základy testování však zůstávají stejné. Tester musí otestovat, zda aplikace odpovídá designu (visual testing), jestli odpovídá specifikaci (functional testing), zda splňuje zásady přístupnosti (accessibility testing) nebo cokoli definuje testovací strategie.
Práce s testnety
Web3 aplikace typicky pracují se smart contracty, které jsou nasazené na blockchainu (v našem případě Ethereum Mainnet). Nicméně při testování web3 nechceme pracovat s reálným etherem a platit poměrně vysoké gas fees za každou testovací transakci.
Od toho existují testnety. Prakticky se jedná o integrační prostředí, kam vývojáři mohou nasadit smart contracty, a na které následně napojí web3 aplikace.
Aby vše fungovalo správně, je potřeba svojí krypto peněženku také přepnout na daný testnet. V nastavení Metamask je nutné povolit zobrazení testnetů a poté už se budete moct přenést na kterýkoli z přednastavených.
Poslední otázka zní, jak získat testovací ether. K tomu slouží faucets neboli kohoutky, z kterých si snadno můžete načepovat ether dle libosti. Každý Testnet má pak vlastní kohoutek.
Dále je možné si síť vytvořit lokálně a nebýt závislý na testnetu, čímž získáme mnohem větší kontrolu nad celou sítí. Pro vytvoření sítě využijeme Ganache. Po nastartování dostanu rovnou vytvořený lokální testnet, spolu s účty a 100 ETH do začátku.
Smart contracty můžeme do své lokální sítě snadno nasadit pomocí nástroje Truffle.
Testování web3
Nyní bychom měli mít testnet (nebo lokální síť) a k němu připojenou web3 aplikaci. Průběh testování závisí na aplikaci, funkčních požadavcích a testovací strategii. Nicméně vždy bychom měli otestovat propojení s krypto peněženkou. Musíme myslet na pozitivní i negativní test – co se stane po úspěšném potvrzení přístupu a co naopak po zamítnutí?
Poté je nutné otestovat interakci se smart contractem. Je dobré myslet nejen na to, jak se aplikace chová po úspěšném potvrzení transakce, ale také co se stane, když uživatel transakci z peněženky zamítne. Nebo když uživatel transakci povolí, ale nemá dostatečné množství etheru.
Nakonec je vhodné ověřit, jak web3 aplikace reaguje na změny v blockchainu (například nové transakce) nebo jak se chová v případě, že se transakce zasekne (zůstává dlouho ve stavu pending). Pokud použijete některý z veřejných testnetů, stav své transakce si snadno ověříte pomocí EtherScan.
Nakonec se zaměříme na externí služby a interakce s nimi. Ukládá vaše web3 aplikace nějaká off-chain data (například do IPFS nebo arweave)? V takovém případě je vhodné ověřit, že se data skutečně uloží, propojí s transakcí a v neposlední řadě, že data jsou korektní.
Získává-li vaše aplikace nějaká data z oracles (například Chainlink nebo Flux), je dobré otestovat, jak aplikace reaguje na selhání požadavku nebo nedostupnost oracle.
Dá se testování web3 automatizovat?
Pro pořádek musím připomenout, že se stále bavíme o dApps a zajímá nás tak primárně E2E testování. Aktuální industry standard pro automatické web E2E testy je Cypress, který v Ackee používáme už od roku 2018.
Hlavní překážka pro Cypress ještě donedávna byla interakce s krypto peněženkou. Většina z nich (včetně Metamask) funguje jako doplněk do prohlížeče. A s těmi se v Cypressu pracuje jen velmi obtížně. Naštěstí se v roce 2020 na obzoru objevil Synpress, Cypress wrapper, který využívá Puppeteer pro přímou interakci s Metamask peněženkou. Umožňuje napřímo komunikovat s peněženkou, potvrzovat přístup nebo transakce.
Hlavní konkurent Cypressu, Playwright, má přímou podporu pro Chrome doplňky. Pokud máte praktickou zkušenost s Playwright a Metamask, určitě mi dejte vědět. 🙂
Závěr
Testování web3 aplikací přináší dva zásadní problémy. Prvním je nový technologický stack a decentralizace, která mění, jakým způsobem uživatelé aplikace používají a jak je testeři testují. Druhým je nová paleta nástrojů, která je zatím stále poměrně omezená. Web3 aplikace jsou stále na začátku svojí éry. A testování, podobně jako v případě webu 2.0, je mírně pozadu za vývojem. Nicméně nové nástroje a postupy se objevují doslova každý měsíc a měly by být součástí QA každého web3 projektu.