Kontrak pintar tidak dapat diubah setelah diterapkan di blockchain, yang berarti kontrak tersebut tidak dapat dimodifikasi. Oleh karena itu, bug atau kerentanan keamanan apa pun dapat menimbulkan konsekuensi serius, sehingga pengujian merupakan langkah yang sangat diperlukan dalam proses pengembangan.
Dalam pelajaran ini, kita akan membahas kontrak Fa1_2TestFull
, yang mencakup serangkaian pengujian yang dirancang untuk memverifikasi fungsionalitas kontrak token kita.
Fa1_2TestFull
Kontrak Fa1_2TestFull
adalah kelas yang mewarisi semua fungsi dari kontrak berbeda seperti Admin, Pause, Fa1_2, Mint, Burn, dan ChangeMetadata. Ini digunakan untuk menggabungkan semua fungsi ini dan melakukan pengujian menyeluruh untuk memastikan kontrak berfungsi sesuai harapan.
Kelas Python
Fa1_2TestFull(Admin, Pause, Fa1_2, Mint, Burn, ChangeMetadata):
def __init__(mandiri, administrator, metadata, buku besar, token_metadata):
ChangeMetadata.__init__(diri sendiri)
Membakar.__init__(diri sendiri)
Daun mint.__init__(diri sendiri)
Fa1_2.__init__(diri sendiri, metadata, buku besar, token_metadata)
Jeda.__init__(diri sendiri)
Admin.__init__(diri sendiri, administrator)
Konstruktor kelas Fa1_2TestFull
menginisialisasi semua fungsi.
Untuk kontrak kami, kami mulai dengan menyiapkan skenario pengujian dengan akun pengujian dan inisialisasi kontrak. Ini dilakukan dalam fungsi pengujian yang dihiasi dengan @sp.add_test
.
Python
@sp.add_test(name="FA12")def test():
# Inisialisasi skenario pengujian dan akun
sc = sp.test_scenario(m)
admin = sp.test_account("Administrator")
alice = sp.test_account("Alice")
bob = sp.test_account("Robert")
# Inisialisasi kontrak dengan beberapa nilai awal
token_metadata = {
"decimals": sp.utils.bytes_of_string("18"), # Mandatory by the spec"name": sp.utils.bytes_of_string("My Great Token"), # Recommended"symbol": sp.utils.bytes_of_string("MGT"), # Recommended# Extra fields"icon": sp.utils.bytes_of_string("https://smartpy.io/static/img/logo-only.svg"),
}
contract_metadata = sp.utils.metadata_of_url("ipfs://QmaiAUj1FFNGYTu8rLBjc3eeN9cSKwaF8EGMBNDmhzPNFd")
c1 = m.Fa1_2TestFull(administrator=admin.address,metadata=contract_metadata,token_metadata=token_metadata,ledger={},)
sc += c1
Kami mendefinisikan akun pengujian: Admin, Alice, dan Bob. Kemudian kita menginisialisasi kontrak kita, Fa1_2TestFull
, dengan beberapa nilai awal. Operator +=
menambahkan kontrak ke skenario.
Mulai sekarang, untuk membantu Anda lebih memahami kodenya, kode tersebut akan berada di sebelah kiri dan visualisasi baris kode yang disorot akan berada di sebelah kanan. Contoh di sini:
Langkah selanjutnya adalah menjalankan pengujian, dan ini melibatkan pemicuan fungsi kontrak yang berbeda dan memverifikasi hasilnya.
Misalnya, untuk menguji fungsionalitas pembuatan, kami menjalankan:
Python
sc.h2("Admin mencetak beberapa koin")
c1.mint(address=alice.address, value=12).run(sender=admin)
Baris ini menjalankan pengujian di mana admin mencetak 12 token untuk Alice. Jika fungsi berhasil mencetak token dan memperbarui saldo Alice dengan benar, maka pengujian ini berhasil.
SmartPy menyediakan metode verify
untuk memastikan bahwa suatu kondisi benar. Jika kondisi ini tidak terpenuhi maka pengujian akan gagal. Misalnya:
Python
c1.update_metadata(key="", value=sp.bytes("0x00")).run(sender=admin)
sc.verify(c1.data.metadata[""] == sp.bytes("0x00"))
Baris tersebut memverifikasi bahwa metadata kontrak telah diperbarui dengan benar ke "0x00"
. Jika tidak diperbarui dengan benar, pengujian akan gagal.
Pengujian kontrak pintar Anda harus mencakup semua kemungkinan kasus penggunaan, termasuk kasus edge dan potensi kegagalan. Hal ini dapat mencakup transfer melebihi saldo pengguna, pembakaran token ketika kontrak dijeda, dll.
Misalnya, tes transfer yang gagal akan terlihat seperti ini:
Python
sc.h2("Bob mencoba mentransfer dari Alice tetapi dia tidak mendapat persetujuannya")
c1.transfer(from_=alice.address, ke_=bob.alamat, nilai=4).jalankan(pengirim=bob, sah=Salah)
Di sini, Bob mencoba mentransfer 4 token dari akun Alice tanpa persetujuan. Karena operasi ini seharusnya gagal, kami menetapkan valid=False
di fungsi run
. Jika kontrak dengan benar mencegah transfer, ujian akan lolos.
Pengujian sangat penting dalam pengembangan kontrak pintar. Mengingat sifat blockchain yang tidak dapat diubah, kesalahan apa pun dalam kontrak dapat menimbulkan konsekuensi permanen dan berpotensi merugikan. Menulis pengujian yang komprehensif memastikan bahwa semua fungsi berfungsi seperti yang diharapkan, sehingga menghasilkan kontrak yang kuat dan aman.
Ingatlah untuk menulis tes untuk kasus positif dan negatif. Kasus positif memvalidasi bahwa suatu fungsi berfungsi dengan benar bila digunakan sebagaimana mestinya. Kasus negatif memastikan kontrak berperilaku benar dalam menangani masukan yang salah atau tidak terduga.
Kontrak pintar tidak dapat diubah setelah diterapkan di blockchain, yang berarti kontrak tersebut tidak dapat dimodifikasi. Oleh karena itu, bug atau kerentanan keamanan apa pun dapat menimbulkan konsekuensi serius, sehingga pengujian merupakan langkah yang sangat diperlukan dalam proses pengembangan.
Dalam pelajaran ini, kita akan membahas kontrak Fa1_2TestFull
, yang mencakup serangkaian pengujian yang dirancang untuk memverifikasi fungsionalitas kontrak token kita.
Fa1_2TestFull
Kontrak Fa1_2TestFull
adalah kelas yang mewarisi semua fungsi dari kontrak berbeda seperti Admin, Pause, Fa1_2, Mint, Burn, dan ChangeMetadata. Ini digunakan untuk menggabungkan semua fungsi ini dan melakukan pengujian menyeluruh untuk memastikan kontrak berfungsi sesuai harapan.
Kelas Python
Fa1_2TestFull(Admin, Pause, Fa1_2, Mint, Burn, ChangeMetadata):
def __init__(mandiri, administrator, metadata, buku besar, token_metadata):
ChangeMetadata.__init__(diri sendiri)
Membakar.__init__(diri sendiri)
Daun mint.__init__(diri sendiri)
Fa1_2.__init__(diri sendiri, metadata, buku besar, token_metadata)
Jeda.__init__(diri sendiri)
Admin.__init__(diri sendiri, administrator)
Konstruktor kelas Fa1_2TestFull
menginisialisasi semua fungsi.
Untuk kontrak kami, kami mulai dengan menyiapkan skenario pengujian dengan akun pengujian dan inisialisasi kontrak. Ini dilakukan dalam fungsi pengujian yang dihiasi dengan @sp.add_test
.
Python
@sp.add_test(name="FA12")def test():
# Inisialisasi skenario pengujian dan akun
sc = sp.test_scenario(m)
admin = sp.test_account("Administrator")
alice = sp.test_account("Alice")
bob = sp.test_account("Robert")
# Inisialisasi kontrak dengan beberapa nilai awal
token_metadata = {
"decimals": sp.utils.bytes_of_string("18"), # Mandatory by the spec"name": sp.utils.bytes_of_string("My Great Token"), # Recommended"symbol": sp.utils.bytes_of_string("MGT"), # Recommended# Extra fields"icon": sp.utils.bytes_of_string("https://smartpy.io/static/img/logo-only.svg"),
}
contract_metadata = sp.utils.metadata_of_url("ipfs://QmaiAUj1FFNGYTu8rLBjc3eeN9cSKwaF8EGMBNDmhzPNFd")
c1 = m.Fa1_2TestFull(administrator=admin.address,metadata=contract_metadata,token_metadata=token_metadata,ledger={},)
sc += c1
Kami mendefinisikan akun pengujian: Admin, Alice, dan Bob. Kemudian kita menginisialisasi kontrak kita, Fa1_2TestFull
, dengan beberapa nilai awal. Operator +=
menambahkan kontrak ke skenario.
Mulai sekarang, untuk membantu Anda lebih memahami kodenya, kode tersebut akan berada di sebelah kiri dan visualisasi baris kode yang disorot akan berada di sebelah kanan. Contoh di sini:
Langkah selanjutnya adalah menjalankan pengujian, dan ini melibatkan pemicuan fungsi kontrak yang berbeda dan memverifikasi hasilnya.
Misalnya, untuk menguji fungsionalitas pembuatan, kami menjalankan:
Python
sc.h2("Admin mencetak beberapa koin")
c1.mint(address=alice.address, value=12).run(sender=admin)
Baris ini menjalankan pengujian di mana admin mencetak 12 token untuk Alice. Jika fungsi berhasil mencetak token dan memperbarui saldo Alice dengan benar, maka pengujian ini berhasil.
SmartPy menyediakan metode verify
untuk memastikan bahwa suatu kondisi benar. Jika kondisi ini tidak terpenuhi maka pengujian akan gagal. Misalnya:
Python
c1.update_metadata(key="", value=sp.bytes("0x00")).run(sender=admin)
sc.verify(c1.data.metadata[""] == sp.bytes("0x00"))
Baris tersebut memverifikasi bahwa metadata kontrak telah diperbarui dengan benar ke "0x00"
. Jika tidak diperbarui dengan benar, pengujian akan gagal.
Pengujian kontrak pintar Anda harus mencakup semua kemungkinan kasus penggunaan, termasuk kasus edge dan potensi kegagalan. Hal ini dapat mencakup transfer melebihi saldo pengguna, pembakaran token ketika kontrak dijeda, dll.
Misalnya, tes transfer yang gagal akan terlihat seperti ini:
Python
sc.h2("Bob mencoba mentransfer dari Alice tetapi dia tidak mendapat persetujuannya")
c1.transfer(from_=alice.address, ke_=bob.alamat, nilai=4).jalankan(pengirim=bob, sah=Salah)
Di sini, Bob mencoba mentransfer 4 token dari akun Alice tanpa persetujuan. Karena operasi ini seharusnya gagal, kami menetapkan valid=False
di fungsi run
. Jika kontrak dengan benar mencegah transfer, ujian akan lolos.
Pengujian sangat penting dalam pengembangan kontrak pintar. Mengingat sifat blockchain yang tidak dapat diubah, kesalahan apa pun dalam kontrak dapat menimbulkan konsekuensi permanen dan berpotensi merugikan. Menulis pengujian yang komprehensif memastikan bahwa semua fungsi berfungsi seperti yang diharapkan, sehingga menghasilkan kontrak yang kuat dan aman.
Ingatlah untuk menulis tes untuk kasus positif dan negatif. Kasus positif memvalidasi bahwa suatu fungsi berfungsi dengan benar bila digunakan sebagaimana mestinya. Kasus negatif memastikan kontrak berperilaku benar dalam menangani masukan yang salah atau tidak terduga.