318 lines
6.3 KiB
Markdown
318 lines
6.3 KiB
Markdown
|
|
# Testing Guide
|
||
|
|
|
||
|
|
**Last Updated**: 2025-01-27
|
||
|
|
**Status**: Active
|
||
|
|
|
||
|
|
This guide explains the testing infrastructure and how to run tests for the DeFi Oracle Meta Mainnet project.
|
||
|
|
|
||
|
|
## Table of Contents
|
||
|
|
|
||
|
|
- [Overview](#overview)
|
||
|
|
- [Test Structure](#test-structure)
|
||
|
|
- [Running Tests](#running-tests)
|
||
|
|
- [Writing Tests](#writing-tests)
|
||
|
|
- [Test Types](#test-types)
|
||
|
|
- [CI/CD Integration](#cicd-integration)
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The project includes a comprehensive testing infrastructure with multiple layers:
|
||
|
|
|
||
|
|
- **Unit Tests** - Contract-level tests using Foundry
|
||
|
|
- **Integration Tests** - Cross-contract and service integration tests
|
||
|
|
- **End-to-End Tests** - Full system tests
|
||
|
|
- **Load Tests** - Performance and stress tests
|
||
|
|
- **Security Tests** - Vulnerability scanning
|
||
|
|
|
||
|
|
## Test Structure
|
||
|
|
|
||
|
|
### Contract Tests
|
||
|
|
|
||
|
|
Located in `test/` directory:
|
||
|
|
|
||
|
|
```
|
||
|
|
test/
|
||
|
|
├── Aggregator.t.sol # Oracle aggregator tests
|
||
|
|
├── AggregatorFuzz.t.sol # Fuzz tests for aggregator
|
||
|
|
├── WETH.t.sol # WETH9 tests
|
||
|
|
├── WETH10.t.sol # WETH10 tests
|
||
|
|
├── Multicall.t.sol # Multicall tests
|
||
|
|
├── CCIPWETH9Bridge.t.sol # CCIP WETH9 bridge tests
|
||
|
|
├── CCIPWETH10Bridge.t.sol # CCIP WETH10 bridge tests
|
||
|
|
├── TwoWayBridge.t.sol # Two-way bridge tests
|
||
|
|
├── ccip/ # CCIP integration tests
|
||
|
|
└── e2e/ # End-to-end tests
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Tests
|
||
|
|
|
||
|
|
Located in `tests/` directory:
|
||
|
|
|
||
|
|
```
|
||
|
|
tests/
|
||
|
|
├── e2e/ # End-to-end test suites
|
||
|
|
├── health-check.sh # Health check script
|
||
|
|
├── load-test.sh # General load test
|
||
|
|
├── load-test-rpc.sh # RPC load test
|
||
|
|
├── load-test-oracle.sh # Oracle load test
|
||
|
|
├── load-test-ccip.sh # CCIP load test
|
||
|
|
├── load-test-production.sh # Production load test
|
||
|
|
├── metamask-integration.test.ts # MetaMask integration tests
|
||
|
|
└── playwright.config.ts # Playwright configuration
|
||
|
|
```
|
||
|
|
|
||
|
|
## Running Tests
|
||
|
|
|
||
|
|
### Contract Tests (Foundry)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run all contract tests
|
||
|
|
forge test
|
||
|
|
|
||
|
|
# Run specific test file
|
||
|
|
forge test --match-path test/WETH.t.sol
|
||
|
|
|
||
|
|
# Run with verbosity
|
||
|
|
forge test -vvv
|
||
|
|
|
||
|
|
# Run with gas reporting
|
||
|
|
forge test --gas-report
|
||
|
|
|
||
|
|
# Run fuzz tests
|
||
|
|
forge test --match-contract Fuzz
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run health check
|
||
|
|
./tests/health-check.sh
|
||
|
|
|
||
|
|
# Run load tests
|
||
|
|
./tests/load-test.sh
|
||
|
|
|
||
|
|
# Run RPC load test
|
||
|
|
./tests/load-test-rpc.sh
|
||
|
|
|
||
|
|
# Run oracle load test
|
||
|
|
./tests/load-test-oracle.sh
|
||
|
|
|
||
|
|
# Run CCIP load test
|
||
|
|
./tests/load-test-ccip.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
### End-to-End Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run E2E tests
|
||
|
|
cd tests/e2e
|
||
|
|
npm test
|
||
|
|
|
||
|
|
# Run with Playwright
|
||
|
|
npx playwright test
|
||
|
|
```
|
||
|
|
|
||
|
|
### All Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run all tests using Makefile
|
||
|
|
make test
|
||
|
|
|
||
|
|
# Or run tests in parallel
|
||
|
|
make test-parallel
|
||
|
|
```
|
||
|
|
|
||
|
|
## Writing Tests
|
||
|
|
|
||
|
|
### Foundry Test Structure
|
||
|
|
|
||
|
|
```solidity
|
||
|
|
// SPDX-License-Identifier: MIT
|
||
|
|
pragma solidity ^0.8.19;
|
||
|
|
|
||
|
|
import {Test, console} from "forge-std/Test.sol";
|
||
|
|
import {MyContract} from "../contracts/MyContract.sol";
|
||
|
|
|
||
|
|
contract MyContractTest is Test {
|
||
|
|
MyContract public contract;
|
||
|
|
address public deployer;
|
||
|
|
|
||
|
|
function setUp() public {
|
||
|
|
deployer = address(this);
|
||
|
|
contract = new MyContract();
|
||
|
|
}
|
||
|
|
|
||
|
|
function testFunction() public {
|
||
|
|
// Arrange
|
||
|
|
uint256 expected = 100;
|
||
|
|
|
||
|
|
// Act
|
||
|
|
uint256 result = contract.function();
|
||
|
|
|
||
|
|
// Assert
|
||
|
|
assertEq(result, expected);
|
||
|
|
}
|
||
|
|
|
||
|
|
function testFuzz(uint256 input) public {
|
||
|
|
// Fuzz test
|
||
|
|
uint256 result = contract.function(input);
|
||
|
|
assertTrue(result >= 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Test Structure
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
# Integration test example
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Setup
|
||
|
|
RPC_URL="${RPC_URL:-http://localhost:8545}"
|
||
|
|
|
||
|
|
# Test
|
||
|
|
echo "Testing RPC endpoint..."
|
||
|
|
response=$(curl -X POST "$RPC_URL" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}')
|
||
|
|
|
||
|
|
# Verify
|
||
|
|
if echo "$response" | grep -q "result"; then
|
||
|
|
echo "✅ Test passed"
|
||
|
|
exit 0
|
||
|
|
else
|
||
|
|
echo "❌ Test failed"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
```
|
||
|
|
|
||
|
|
## Test Types
|
||
|
|
|
||
|
|
### Unit Tests
|
||
|
|
|
||
|
|
**Purpose**: Test individual contract functions
|
||
|
|
|
||
|
|
**Location**: `test/*.t.sol`
|
||
|
|
|
||
|
|
**Example**:
|
||
|
|
```solidity
|
||
|
|
function testDeposit() public {
|
||
|
|
weth.deposit{value: 1 ether}();
|
||
|
|
assertEq(weth.balanceOf(address(this)), 1 ether);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Tests
|
||
|
|
|
||
|
|
**Purpose**: Test interactions between contracts
|
||
|
|
|
||
|
|
**Location**: `test/ccip/`, `test/e2e/`
|
||
|
|
|
||
|
|
**Example**:
|
||
|
|
```solidity
|
||
|
|
function testCCIPBridge() public {
|
||
|
|
// Deploy bridge
|
||
|
|
// Send message
|
||
|
|
// Verify on destination
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### End-to-End Tests
|
||
|
|
|
||
|
|
**Purpose**: Test full system workflows
|
||
|
|
|
||
|
|
**Location**: `tests/e2e/`
|
||
|
|
|
||
|
|
**Example**:
|
||
|
|
- Deploy contracts
|
||
|
|
- Configure oracle
|
||
|
|
- Send transactions
|
||
|
|
- Verify results
|
||
|
|
|
||
|
|
### Load Tests
|
||
|
|
|
||
|
|
**Purpose**: Test system under load
|
||
|
|
|
||
|
|
**Location**: `tests/load-test*.sh`
|
||
|
|
|
||
|
|
**Example**:
|
||
|
|
```bash
|
||
|
|
# Test RPC under load
|
||
|
|
./tests/load-test-rpc.sh --requests 1000 --concurrent 10
|
||
|
|
```
|
||
|
|
|
||
|
|
### Fuzz Tests
|
||
|
|
|
||
|
|
**Purpose**: Find edge cases through random input
|
||
|
|
|
||
|
|
**Location**: `test/*Fuzz.t.sol`
|
||
|
|
|
||
|
|
**Example**:
|
||
|
|
```solidity
|
||
|
|
function testFuzzTransfer(uint256 amount) public {
|
||
|
|
amount = bound(amount, 1, type(uint256).max);
|
||
|
|
// Test with random amounts
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## CI/CD Integration
|
||
|
|
|
||
|
|
### GitHub Actions Example
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
name: Tests
|
||
|
|
|
||
|
|
on: [push, pull_request]
|
||
|
|
|
||
|
|
jobs:
|
||
|
|
test:
|
||
|
|
runs-on: ubuntu-latest
|
||
|
|
steps:
|
||
|
|
- uses: actions/checkout@v3
|
||
|
|
- name: Install Foundry
|
||
|
|
uses: foundry-rs/foundry-toolchain@v1
|
||
|
|
- name: Run tests
|
||
|
|
run: forge test
|
||
|
|
- name: Run integration tests
|
||
|
|
run: ./tests/health-check.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
## Test Best Practices
|
||
|
|
|
||
|
|
1. **Test Coverage**
|
||
|
|
- Aim for >80% coverage
|
||
|
|
- Test happy paths
|
||
|
|
- Test error cases
|
||
|
|
- Test edge cases
|
||
|
|
|
||
|
|
2. **Test Organization**
|
||
|
|
- One test file per contract
|
||
|
|
- Group related tests
|
||
|
|
- Use descriptive names
|
||
|
|
- Document complex tests
|
||
|
|
|
||
|
|
3. **Test Data**
|
||
|
|
- Use fixtures for complex data
|
||
|
|
- Use fuzzing for edge cases
|
||
|
|
- Test with realistic data
|
||
|
|
- Test boundary conditions
|
||
|
|
|
||
|
|
4. **Test Maintenance**
|
||
|
|
- Keep tests up to date
|
||
|
|
- Fix flaky tests
|
||
|
|
- Remove obsolete tests
|
||
|
|
- Review test failures
|
||
|
|
|
||
|
|
## Related Documentation
|
||
|
|
|
||
|
|
- [E2E Testing Report](../E2E_TESTING_REPORT.md)
|
||
|
|
- [Security Scanning Guide](../security/SECURITY_SCANNING_GUIDE.md)
|
||
|
|
- [Deployment Guide](../deployment/DEPLOYMENT.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated**: 2025-01-27
|
||
|
|
|