182 lines
4.7 KiB
Rust
182 lines
4.7 KiB
Rust
/// 性能测试:TPS (Transactions Per Second)
|
||
///
|
||
/// 测试NAC公链的交易处理能力
|
||
|
||
use nac_integration_tests::common::*;
|
||
use std::time::Instant;
|
||
|
||
#[tokio::test]
|
||
async fn test_peak_tps() {
|
||
init_test_env();
|
||
|
||
let config = TestConfig::performance();
|
||
|
||
// 创建大量交易
|
||
let tx_count = 10000;
|
||
let mut transactions = Vec::new();
|
||
|
||
for i in 0..tx_count {
|
||
let tx = create_test_transaction(
|
||
(i % 100) as u8,
|
||
((i + 1) % 100) as u8,
|
||
100,
|
||
);
|
||
transactions.push(tx);
|
||
}
|
||
|
||
// 测量处理时间
|
||
let start = Instant::now();
|
||
|
||
// 模拟交易处理
|
||
for tx in &transactions {
|
||
assert_transaction_valid(tx);
|
||
}
|
||
|
||
let duration = start.elapsed();
|
||
|
||
// 计算TPS
|
||
let tps = perf::calculate_tps(tx_count, duration);
|
||
|
||
log::info!("Peak TPS: {:.2}", tps);
|
||
log::info!("Duration: {:?}", duration);
|
||
log::info!("Total transactions: {}", tx_count);
|
||
|
||
// 验证TPS目标
|
||
assert_tps_meets_requirement(tps, 1000.0);
|
||
|
||
log::info!("Peak TPS test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_sustained_tps() {
|
||
init_test_env();
|
||
|
||
// 持续负载测试
|
||
let duration_secs = 10;
|
||
let target_tps = 5000.0;
|
||
|
||
let start = Instant::now();
|
||
let mut total_tx = 0;
|
||
|
||
while start.elapsed().as_secs() < duration_secs {
|
||
// 每批处理1000个交易
|
||
let batch_size = 1000;
|
||
for i in 0..batch_size {
|
||
let tx = create_test_transaction(
|
||
(i % 50) as u8,
|
||
((i + 1) % 50) as u8,
|
||
100,
|
||
);
|
||
assert_transaction_valid(&tx);
|
||
total_tx += 1;
|
||
}
|
||
}
|
||
|
||
let actual_duration = start.elapsed();
|
||
let actual_tps = perf::calculate_tps(total_tx, actual_duration);
|
||
|
||
log::info!("Sustained TPS: {:.2}", actual_tps);
|
||
log::info!("Duration: {:?}", actual_duration);
|
||
log::info!("Total transactions: {}", total_tx);
|
||
|
||
assert_tps_meets_requirement(actual_tps, target_tps);
|
||
|
||
log::info!("Sustained TPS test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_tps_with_smart_contracts() {
|
||
init_test_env();
|
||
|
||
// 测试包含智能合约调用的TPS
|
||
let tx_count = 5000;
|
||
let mut transactions = Vec::new();
|
||
|
||
for i in 0..tx_count {
|
||
let caller = Address::from_index((i % 50) as u8);
|
||
let contract = Address::from_index(100);
|
||
|
||
let tx = TestTransaction::new(caller, contract, 0, i as u64);
|
||
transactions.push(tx);
|
||
}
|
||
|
||
let start = Instant::now();
|
||
|
||
for tx in &transactions {
|
||
assert_transaction_valid(tx);
|
||
}
|
||
|
||
let duration = start.elapsed();
|
||
let tps = perf::calculate_tps(tx_count, duration);
|
||
|
||
log::info!("TPS with smart contracts: {:.2}", tps);
|
||
|
||
// 智能合约调用的TPS通常较低
|
||
assert_tps_meets_requirement(tps, 500.0);
|
||
|
||
log::info!("TPS with smart contracts test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_tps_degradation_under_load() {
|
||
init_test_env();
|
||
|
||
// 测试负载增加时的TPS变化
|
||
let load_levels = vec![1000, 5000, 10000, 20000];
|
||
let mut tps_results = Vec::new();
|
||
|
||
for &tx_count in &load_levels {
|
||
let mut transactions = Vec::new();
|
||
for i in 0..tx_count {
|
||
let tx = create_test_transaction(
|
||
(i % 50) as u8,
|
||
((i + 1) % 50) as u8,
|
||
100,
|
||
);
|
||
transactions.push(tx);
|
||
}
|
||
|
||
let start = Instant::now();
|
||
for tx in &transactions {
|
||
assert_transaction_valid(tx);
|
||
}
|
||
let duration = start.elapsed();
|
||
|
||
let tps = perf::calculate_tps(tx_count, duration);
|
||
tps_results.push((tx_count, tps));
|
||
|
||
log::info!("Load: {} tx, TPS: {:.2}", tx_count, tps);
|
||
}
|
||
|
||
// 验证TPS不会严重退化
|
||
for (load, tps) in &tps_results {
|
||
assert!(tps > &500.0, "TPS too low at load {}: {}", load, tps);
|
||
}
|
||
|
||
log::info!("TPS degradation under load test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_block_production_rate() {
|
||
init_test_env();
|
||
|
||
// 测试区块生产速率
|
||
let block_count = 100;
|
||
let target_block_time_ms = 1000; // 1秒
|
||
|
||
let start = Instant::now();
|
||
|
||
let blocks = create_test_blockchain(block_count);
|
||
|
||
let duration = start.elapsed();
|
||
let avg_block_time_ms = duration.as_millis() / block_count as u128;
|
||
|
||
log::info!("Average block time: {} ms", avg_block_time_ms);
|
||
log::info!("Target block time: {} ms", target_block_time_ms);
|
||
|
||
// 验证区块时间
|
||
assert!(avg_block_time_ms < target_block_time_ms as u128 * 2);
|
||
|
||
log::info!("Block production rate test passed");
|
||
}
|