244 lines
6.1 KiB
Rust
244 lines
6.1 KiB
Rust
/// 性能测试:压力测试
|
||
///
|
||
/// 测试系统的极限承载能力
|
||
|
||
use nac_integration_tests::common::*;
|
||
|
||
#[tokio::test]
|
||
async fn test_maximum_load() {
|
||
init_test_env();
|
||
|
||
let config = TestConfig::stress();
|
||
|
||
// 极限负载:100,000个交易
|
||
let tx_count = 100000;
|
||
log::info!("Starting maximum load test with {} transactions", tx_count);
|
||
|
||
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);
|
||
}
|
||
|
||
log::info!("Created {} transactions", transactions.len());
|
||
|
||
// 验证所有交易
|
||
let mut valid_count = 0;
|
||
for tx in &transactions {
|
||
if tx.amount > 0 {
|
||
valid_count += 1;
|
||
}
|
||
}
|
||
|
||
log::info!("Valid transactions: {}", valid_count);
|
||
assert_eq!(valid_count, tx_count);
|
||
|
||
log::info!("Maximum load test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_memory_pressure() {
|
||
init_test_env();
|
||
|
||
// 创建大量数据对象
|
||
let account_count = 10000;
|
||
let accounts = create_test_accounts(account_count, 1000);
|
||
|
||
log::info!("Created {} accounts", accounts.len());
|
||
assert_eq!(accounts.len(), account_count);
|
||
|
||
// 创建大量区块
|
||
let block_count = 1000;
|
||
let blocks = create_test_blockchain(block_count);
|
||
|
||
log::info!("Created {} blocks", blocks.len());
|
||
assert_eq!(blocks.len(), block_count);
|
||
|
||
// 验证数据完整性
|
||
assert_blockchain_valid(&blocks);
|
||
|
||
log::info!("Memory pressure test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_rapid_block_production() {
|
||
init_test_env();
|
||
|
||
// 快速出块测试
|
||
let block_count = 1000;
|
||
let start = std::time::Instant::now();
|
||
|
||
let blocks = create_test_blockchain(block_count);
|
||
|
||
let duration = start.elapsed();
|
||
let blocks_per_sec = block_count as f64 / duration.as_secs_f64();
|
||
|
||
log::info!("Produced {} blocks in {:?}", block_count, duration);
|
||
log::info!("Blocks per second: {:.2}", blocks_per_sec);
|
||
|
||
assert_blockchain_valid(&blocks);
|
||
|
||
log::info!("Rapid block production test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_large_transaction_batch() {
|
||
init_test_env();
|
||
|
||
// 大批量交易测试
|
||
let batch_size = 50000;
|
||
let mut transactions = Vec::new();
|
||
|
||
log::info!("Creating batch of {} transactions", batch_size);
|
||
|
||
for i in 0..batch_size {
|
||
let tx = create_test_transaction(
|
||
(i % 100) as u8,
|
||
((i + 1) % 100) as u8,
|
||
100,
|
||
);
|
||
transactions.push(tx);
|
||
}
|
||
|
||
log::info!("Batch created, validating...");
|
||
|
||
let mut valid_count = 0;
|
||
for tx in &transactions {
|
||
if tx.amount > 0 {
|
||
valid_count += 1;
|
||
}
|
||
}
|
||
|
||
assert_eq!(valid_count, batch_size);
|
||
|
||
log::info!("Large transaction batch test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_sustained_high_load() {
|
||
init_test_env();
|
||
|
||
// 持续高负载测试
|
||
let duration_secs = 30;
|
||
let target_tps = 10000;
|
||
|
||
log::info!("Starting sustained high load test for {} seconds", duration_secs);
|
||
|
||
let start = std::time::Instant::now();
|
||
let mut total_tx = 0;
|
||
|
||
while start.elapsed().as_secs() < duration_secs {
|
||
// 每批处理10000个交易
|
||
for i in 0..10000 {
|
||
let tx = create_test_transaction(
|
||
(i % 100) as u8,
|
||
((i + 1) % 100) as u8,
|
||
100,
|
||
);
|
||
if tx.amount > 0 {
|
||
total_tx += 1;
|
||
}
|
||
}
|
||
|
||
// 短暂休息,避免CPU 100%
|
||
tokio::time::sleep(tokio::time::Duration::from_millis(10)).await;
|
||
}
|
||
|
||
let actual_duration = start.elapsed();
|
||
let actual_tps = perf::calculate_tps(total_tx, actual_duration);
|
||
|
||
log::info!("Sustained high load test completed");
|
||
log::info!("Total transactions: {}", total_tx);
|
||
log::info!("Duration: {:?}", actual_duration);
|
||
log::info!("Average TPS: {:.2}", actual_tps);
|
||
|
||
assert!(actual_tps > 1000.0);
|
||
|
||
log::info!("Sustained high load test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_spike_load() {
|
||
init_test_env();
|
||
|
||
// 突发负载测试
|
||
log::info!("Starting spike load test");
|
||
|
||
// 正常负载
|
||
let normal_load = 1000;
|
||
for i in 0..normal_load {
|
||
let tx = create_test_transaction(
|
||
(i % 50) as u8,
|
||
((i + 1) % 50) as u8,
|
||
100,
|
||
);
|
||
assert!(tx.amount > 0);
|
||
}
|
||
|
||
log::info!("Normal load: {} transactions", normal_load);
|
||
|
||
// 突发负载
|
||
let spike_load = 50000;
|
||
let start = std::time::Instant::now();
|
||
|
||
for i in 0..spike_load {
|
||
let tx = create_test_transaction(
|
||
(i % 100) as u8,
|
||
((i + 1) % 100) as u8,
|
||
100,
|
||
);
|
||
assert!(tx.amount > 0);
|
||
}
|
||
|
||
let spike_duration = start.elapsed();
|
||
let spike_tps = perf::calculate_tps(spike_load, spike_duration);
|
||
|
||
log::info!("Spike load: {} transactions in {:?}", spike_load, spike_duration);
|
||
log::info!("Spike TPS: {:.2}", spike_tps);
|
||
|
||
// 恢复正常负载
|
||
for i in 0..normal_load {
|
||
let tx = create_test_transaction(
|
||
(i % 50) as u8,
|
||
((i + 1) % 50) as u8,
|
||
100,
|
||
);
|
||
assert!(tx.amount > 0);
|
||
}
|
||
|
||
log::info!("Spike load test passed");
|
||
}
|
||
|
||
#[tokio::test]
|
||
async fn test_resource_exhaustion() {
|
||
init_test_env();
|
||
|
||
// 资源耗尽测试
|
||
log::info!("Starting resource exhaustion test");
|
||
|
||
// 创建大量账户
|
||
let account_count = 50000;
|
||
let accounts = create_test_accounts(account_count, 1000);
|
||
assert_eq!(accounts.len(), account_count);
|
||
|
||
// 创建大量交易
|
||
let tx_count = 50000;
|
||
let mut transactions = Vec::new();
|
||
for i in 0..tx_count {
|
||
let tx = create_test_transaction(
|
||
(i % 1000) as u8,
|
||
((i + 1) % 1000) as u8,
|
||
100,
|
||
);
|
||
transactions.push(tx);
|
||
}
|
||
|
||
assert_eq!(transactions.len(), tx_count);
|
||
|
||
log::info!("Resource exhaustion test passed");
|
||
}
|