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

182 lines
4.7 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.

/// 性能测试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");
}