NAC_Blockchain/nac-integration-tests/tests/performance/stress_test.rs

244 lines
6.1 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 性能测试:压力测试
///
/// 测试系统的极限承载能力
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");
}