Genereer Uitgebreide Testgevallen voor Mijn Solidity Smart Contract
description
Helpt gebruikers bij het opstellen van grondige en effectieve testsets voor hun Solidity smart contracts, waardoor bugs en beveiligingsproblemen voor deployment worden verminderd. Deze prompt draagt bij aan robuustheid en betrouwbaarheid van code, cruciaal in blockchain toepassingen waar fouten kostbaar kunnen zijn.
prompt
Help me met het genereren van uitgebreide testgevallen voor mijn Solidity smart contract. Doel van het contract: <voer het doel van het smart contract in>. Belangrijkste functies om te testen: <noem de belangrijkste functies of features die get ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een gestructureerd overzicht van uitgebreide testgevallen voor jouw Solidity ERC20 token met mint- en burnfunctionaliteit. Deze tests zijn geschikt voor frameworks zoals Truffle of Hardhat, bijvoorbeeld in JavaScript met behulp van Mocha en Chai.
---
## Algemene opzet
- **Contractnaam:** YourToken (vervang dit door je eigen naam)
- **Te testen functies:** `mint`, `burn`, `transfer`, `approve`, `transferFrom`
- **Testnetwerken:** Local blockchain (ganache, hardhat network)
---
## Testgevallen overzicht
### 1. Initialisatie en basisgegevens
- **Test 1.1:** Controleer dat de token correct wordt geïnitialiseerd met de juiste naam, symbool, decimals en totale voorraad (indien van toepassing).
- **Test 1.2:** Controleer dat de eigenaar (de deployer) de juiste rollen heeft (bijvoorbeeld minter).
---
### 2. Mint-functie
#### Gegeven dat een account voldoende rechten heeft om te minten:
- **Test 2.1:** Mint een nieuw aantal tokens naar een geldig adres.
- *Verwachting:* De balans van dat adres wordt verhoogd met het geminte aantal.
- **Test 2.2:** Mint met een hoeveelheid groter dan 0.
- *Verwachting:* De transactie slaagt.
- **Test 2.3:** Mint met een hoeveelheid 0.
- *Verwachting:* Transactie zou kunnen falen of geen effect hebben, afhankelijk van implementatie.
- **Test 2.4:** Mint door een niet-geautoriseerde gebruiker.
- *Verwachting:* Transactie wordt geweigerd (revert).
---
### 3. Burn-functie
#### Gegeven dat een account tokens heeft om te verbranden:
- **Test 3.1:** Burn een geldige hoeveelheid tokens van de eigen balans.
- *Verwachting:* De balans wordt verminderd met het verbrande aantal, totale voorraad wordt aangepast.
- **Test 3.2:** Burn een hoeveelheid gelijk aan de volledige balans.
- *Verwachting:* Balans wordt 0, totale voorraad wordt verminderd.
- **Test 3.3:** Burn met een hoeveelheid groter dan de eigen balans.
- *Verwachting:* Transactie revert.
- **Test 3.4:** Burn door een niet-geautoriseerde gebruiker.
- *Verwachting:* Transactie revert.
---
### 4. Transfer-functie
- **Test 4.1:** Transfer een geldige hoeveelheid tokens van account A naar account B.
- *Verwachting:* Balans van A daalt, balans van B stijgt.
- **Test 4.2:** Transfer een hoeveelheid groter dan de balans van de sender.
- *Verwachting:* Transactie revert.
- **Test 4.3:** Transfer 0 tokens.
- *Verwachting:* Transactie kan slagen of niet, afhankelijk van implementatie.
- **Test 4.4:** Transfer naar een ongeldige (0-adres) adres.
- *Verwachting:* Transactie revert.
---
### 5. Approve en transferFrom
- **Test 5.1:** Approve een spender voor een bepaald bedrag.
- *Verwachting:* Spender mag dat bedrag uit de eigenaar’s account gebruiken.
- **Test 5.2:** Spender gebruikt `transferFrom` om tokens over te dragen binnen de goedgekeurde limiet.
- *Verwachting:* Balansen en allowances worden correct aangepast.
- **Test 5.3:** Spender probeert meer te spenderen dan toegestaan.
- *Verwachting:* Transactie revert.
- **Test 5.4:** Approve met 0 hoeveelheid.
- *Verwachting:* Mogelijk geen effect, afhankelijk van implementatie.
- **Test 5.5:** TransferFrom door niet-geautoriseerde spender.
- *Verwachting:* Transactie revert.
---
### 6. Randgevallen en invoervalidatie
- **Test 6.1:** Mint, burn, transfer, approve met negatieve aantallen (indien mogelijk, Solidity ondersteunt geen negatieve).
- **Test 6.2:** Interactie met een adres dat 0 is.
- *Verwachting:* Revert in alle functies waar 0-adres niet toegestaan is.
- **Test 6.3:** Controleer dat de totale voorraad correct wordt bijgehouden na minting en burning.
---
### 7. Beveiligings- en toegangscontrole
- **Test 7.1:** Controleer dat alleen de eigenaar of geautoriseerde minters kunnen minten.
- **Test 7.2:** Controleer dat burn en transfer niet door niet-geautoriseerde partijen kunnen worden uitgevoerd (indien van toepassing).
- **Test 7.3:** Controleer tegen dubbele goedkeuring (approve opnieuw zetten).
- **Test 7.4:** Test voor reentrancy-aanvallen (indien van toepassing).
---
## Voorbeeld van testcode in JavaScript (Hardhat / Truffle)
```javascript
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("YourToken Contract", function () {
let Token;
let token;
let owner;
let addr1;
let addr2;
beforeEach(async function () {
Token = await ethers.getContractFactory("YourToken");
[owner, addr1, addr2, ...addrs] = await ethers.getSigners();
token = await Token.deploy();
await token.deployed();
});
describe("Mint functies", function () {
it("Moet tokens minten naar een geldig adres", async function () {
await expect(token.mint(addr1.address, 100))
.to.emit(token, 'Transfer')
.withArgs(ethers.constants.AddressZero, addr1.address, 100);
expect(await token.balanceOf(addr1.address)).to.equal(100);
});
it("Niet-geautoriseerde mint poging wordt geweigerd", async function () {
await expect(
token.connect(addr1).mint(addr2.address, 50)
).to.be.revertedWith("Ownable: caller is not the owner");
});
});
describe("Burn functies", function () {
it("Tokens verbranden van eigen balans", async function () {
await token.mint(owner.address, 200);
await expect(token.burn(50))
.to.emit(token, 'Transfer')
.withArgs(owner.address, ethers.constants.AddressZero, 50);
expect(await token.balanceOf(owner.address)).to.equal(150);
});
// Meer tests voor burn...
});
describe("Transfer functies", function () {
it("Tokens correct overdragen", async function () {
await token.mint(owner.address, 100);
await expect(token.transfer(addr1.address, 40))
.to.emit(token, 'Transfer')
.withArgs(owner.address, addr1.address, 40);
expect(await token.balanceOf(owner.address)).to.equal(60);
expect(await token.balanceOf(addr1.address)).to.equal(40);
});
// Meer tests voor transfer...
});
describe("Approve en transferFrom", function () {
it("Tokens goedgekeurd en overgedragen via transferFrom", async function () {
await token.mint(owner.address, 100);
await token.approve(addr1.address, 50);
await expect(
token.connect(addr1).transferFrom(owner.address, addr2.address, 50)
)
.to.emit(token, 'Transfer')
.withArgs(owner.address, addr2.address, 50);
expect(await token.allowance(owner.address, addr1.address)).to.equal(0);
expect(await token.balanceOf(addr2.address)).to.equal(50);
});
// Meer tests...
});
});
```
---
## Samenvatting
Gebruik deze gestructureerde testgevallen om je contract grondig te testen op normaal gedrag, randgevallen, invoervalidatie en beveiligingsrisico’s. Pas de details aan op basis van de exacte implementatie en functies van jouw contract.
Mocht je specifieke hulp nodig hebben bij het schrijven van de tests voor bepaalde functies of scenario’s, vraag gerust!
provider: deepseek
model: deepseek-chat
Zeker, hier zijn uitgebreide testgevallen voor je ERC20 token contract in een gestructureerd formaat geschikt voor Truffle/Hardhat:
## Testgevallen ERC20 Token Contract
### 1. Mint Functionaliteit
**Test 1.1: Succesvol minten**
- **Beschrijving**: Eigenaar mint tokens naar een geldig adres
- **Stappen**:
1. Roep `mint(ontvanger, 1000)` aan als owner
2. Controleer of saldo ontvanger met 1000 is verhoogd
3. Controleer of totalSupply met 1000 is verhoogd
4. Controleer Mint event
**Test 1.2: Mint door niet-eigenaar**
- **Beschrijving**: Niet-eigenaar probeert te minten
- **Stappen**:
1. Roep `mint(ontvanger, 1000)` aan als niet-owner
2. Verwacht revert met "Alleen eigenaar"
3. Controleer dat saldo unchanged blijft
**Test 1.3: Mint naar nul-adres**
- **Beschrijving**: Mint tokens naar address(0)
- **Stappen**:
1. Roep `mint(address(0), 1000)` aan als owner
2. Verwacht revert met "Ongeldig adres"
**Test 1.4: Mint hoeveelheid nul**
- **Beschrijving**: Mint 0 tokens
- **Stappen**:
1. Roep `mint(ontvanger, 0)` aan als owner
2. Verwacht revert met "Hoeveelheid moet > 0 zijn"
**Test 1.5: Mint overflow bescherming**
- **Beschrijving**: Mint hoeveelheid die overflow veroorzaakt
- **Stappen**:
1. Roep `mint(ontvanger, type(uint256).max)` aan
2. Verwacht revert door overflow
### 2. Transfer Functionaliteit
**Test 2.1: Succesvolle transfer**
- **Beschrijving**: Normale token transfer
- **Stappen**:
1. Zet saldo verzender op 1000
2. Roep `transfer(ontvanger, 500)` aan
3. Controleer saldo verzender: 500
4. Controleer saldo ontvanger: 500
5. Controleer Transfer event
**Test 2.2: Transfer zonder saldo**
- **Beschrijving**: Transfer zonder voldoende saldo
- **Stappen**:
1. Zet saldo verzender op 100
2. Roep `transfer(ontvanger, 500)` aan
3. Verwacht revert met "Onvoldoende saldo"
**Test 2.3: Transfer naar nul-adres**
- **Beschrijving**: Transfer naar address(0)
- **Stappen**:
1. Zet saldo verzender op 1000
2. Roep `transfer(address(0), 500)` aan
3. Verwacht revert met "Ongeldig adres"
**Test 2.4: Transfer hoeveelheid nul**
- **Beschrijving**: Transfer van 0 tokens
- **Stappen**:
1. Roep `transfer(ontvanger, 0)` aan
2. Verwacht revert met "Hoeveelheid moet > 0 zijn"
### 3. Burn Functionaliteit
**Test 3.1: Succesvol burnen**
- **Beschrijving**: Gebruiker burnt eigen tokens
- **Stappen**:
1. Zet saldo gebruiker op 1000
2. Roep `burn(500)` aan
3. Controleer saldo gebruiker: 500
4. Controleer totalSupply: -500
5. Controleer Burn event
**Test 3.2: Burn zonder saldo**
- **Beschrijving**: Burn zonder voldoende saldo
- **Stappen**:
1. Zet saldo gebruiker op 100
2. Roep `burn(500)` aan
3. Verwacht revert met "Onvoldoende saldo"
**Test 3.3: Burn hoeveelheid nul**
- **Beschrijving**: Burn van 0 tokens
- **Stappen**:
1. Roep `burn(0)` aan
2. Verwacht revert met "Hoeveelheid moet > 0 zijn"
### 4. Approve Functionaliteit
**Test 4.1: Succesvol approve**
- **Beschrijving**: Keur spending allowance goed
- **Stappen**:
1. Roep `approve(spender, 1000)` aan
2. Controleer allowance: 1000
3. Controleer Approval event
**Test 4.2: Approve nul-adres**
- **Beschrijving**: Approve voor address(0)
- **Stappen**:
1. Roep `approve(address(0), 1000)` aan
2. Verwacht revert met "Ongeldig spender adres"
**Test 4.3: Approve overflow**
- **Beschrijving**: Approve met overflow hoeveelheid
- **Stappen**:
1. Roep `approve(spender, type(uint256).max)` aan
2. Test overflow bescherming
### 5. TransferFrom Functionaliteit
**Test 5.1: Succesvol transferFrom**
- **Beschrijving**: Spender gebruikt allowance
- **Stappen**:
1. Zet saldo eigenaar op 1000
2. Keur spender 500 goed via approve
3. Roep `transferFrom(eigenaar, ontvanger, 300)` aan als spender
4. Controleer saldos en allowance
**Test 5.2: TransferFrom zonder allowance**
- **Beschrijving**: TransferFrom zonder voldoende allowance
- **Stappen**:
1. Zet allowance op 100
2. Roep `transferFrom(eigenaar, ontvanger, 500)` aan
3. Verwacht revert met "Onvoldoende allowance"
### 6. Randgevallen en Beveiliging
**Test 6.1: Reentrancy bescherming**
- **Beschrijving**: Test op reentrancy aanvallen
- **Stappen**:
1. Implementeer malicious contract
2. Probeer reentrancy aanval tijdens transfer
3. Controleer dat contract reentrancy-safe is
**Test 6.2: Front-running bescherming**
- **Beschrijving**: Test transaction ordering dependency
- **Stappen**:
1. Simuleer multiple transacties
2. Controleer consistent gedrag
**Test 6.3: Integer overflow/underflow**
- **Beschrijving**: Test alle rekenkundige operaties
- **Stappen**:
1. Test edge cases bij mint/transfer/burn
2. Gebruik SafeMath of Solidity 0.8+ checks
**Test 6.4: Event logging compleetheid**
- **Beschrijving**: Controleer alle events worden gelogd
- **Stappen**:
1. Voer elke functie uit
2. Controleer juiste events worden geëmit
### 7. Gas Optimalisatie Tests
**Test 7.1: Gas usage meting**
- **Beschrijving**: Meet gas kosten voor elke functie
- **Stappen**:
1. Meet gas voor mint/transfer/burn/approve
2. Vergelijk met industry standards
## Test Setup Template
```solidity
// Gebruik dit template voor je testbestand
pragma solidity ^0.8.0;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/ERC20Token.sol";
contract TestERC20Token {
ERC20Token token;
address owner = address(this);
address user1 = address(0x1);
address user2 = address(0x2);
function beforeEach() public {
token = new ERC20Token();
token.mint(user1, 1000);
}
// Implementeer hierboven beschreven tests
}
```
Deze testgevallen dekken de belangrijkste functionaliteiten en beveiligingsaspecten van je ERC20 contract. Pas ze aan naar je specifieke implementatie!
error: Generation failed [deepseek] prompt_id=4362 locale=en err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=4362 locale=fr err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=4362 locale=pt err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=4362 locale=es err=DeepSeek connection/timeout