performance.test.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * 性能测试
  3. *
  4. * 验证凭证管理器的性能要求
  5. * - NFR-001: 配置文件加载 <100ms
  6. * - NFR-002: 签名操作 <50ms
  7. */
  8. import { describe, test, expect, beforeEach, afterEach } from '@jest/globals';
  9. import { CredentialManagerFactory, Platform } from '../../src/index';
  10. import type { ICredentialManager } from '../../src/index';
  11. describe('性能测试', () => {
  12. let manager: ICredentialManager;
  13. beforeEach(async () => {
  14. const factory = new CredentialManagerFactory();
  15. manager = await factory.create({
  16. enableFileWatching: false,
  17. enableLogging: false
  18. });
  19. // 添加测试账户
  20. await manager.addAccount({
  21. id: 'perf-test-001',
  22. platform: Platform.PACIFICA,
  23. credentials: {
  24. type: 'pacifica',
  25. privateKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
  26. }
  27. });
  28. });
  29. afterEach(async () => {
  30. await manager.destroy();
  31. });
  32. describe('NFR-002: 签名性能要求', () => {
  33. test('单次签名应在50ms内完成', async () => {
  34. const message = new TextEncoder().encode('performance test message');
  35. const startTime = Date.now();
  36. const result = await manager.sign('perf-test-001', message);
  37. const executionTime = Date.now() - startTime;
  38. expect(result.success).toBe(true);
  39. expect(executionTime).toBeLessThan(50);
  40. expect(result.executionTime).toBeLessThan(50);
  41. });
  42. test('批量签名平均时间应在50ms内', async () => {
  43. const message = new TextEncoder().encode('batch performance test');
  44. const batchSize = 10;
  45. const results: number[] = [];
  46. for (let i = 0; i < batchSize; i++) {
  47. const startTime = Date.now();
  48. const result = await manager.sign('perf-test-001', message);
  49. const executionTime = Date.now() - startTime;
  50. expect(result.success).toBe(true);
  51. results.push(executionTime);
  52. }
  53. const averageTime = results.reduce((sum, time) => sum + time, 0) / batchSize;
  54. expect(averageTime).toBeLessThan(50);
  55. console.log(`批量签名统计 (${batchSize}次):`);
  56. console.log(` 平均时间: ${averageTime.toFixed(2)}ms`);
  57. console.log(` 最快: ${Math.min(...results)}ms`);
  58. console.log(` 最慢: ${Math.max(...results)}ms`);
  59. });
  60. test('并发签名性能', async () => {
  61. const message = new TextEncoder().encode('concurrent performance test');
  62. const concurrency = 5;
  63. const startTime = Date.now();
  64. const promises = Array(concurrency).fill(0).map(() =>
  65. manager.sign('perf-test-001', message)
  66. );
  67. const results = await Promise.all(promises);
  68. const totalTime = Date.now() - startTime;
  69. // 所有签名都应该成功
  70. results.forEach(result => {
  71. expect(result.success).toBe(true);
  72. expect(result.executionTime).toBeLessThan(50);
  73. });
  74. // 并发执行的平均时间应该合理
  75. const averageTime = totalTime / concurrency;
  76. expect(averageTime).toBeLessThan(100); // 并发情况下允许稍高
  77. console.log(`并发签名统计 (${concurrency}个并发):`);
  78. console.log(` 总时间: ${totalTime}ms`);
  79. console.log(` 平均时间: ${averageTime.toFixed(2)}ms`);
  80. });
  81. });
  82. describe('统计功能性能', () => {
  83. test('获取统计信息应快速响应', async () => {
  84. const startTime = Date.now();
  85. const stats = await manager.getStats();
  86. const executionTime = Date.now() - startTime;
  87. expect(stats).toBeDefined();
  88. expect(stats.totalAccounts).toBeGreaterThan(0);
  89. expect(executionTime).toBeLessThan(10); // 统计查询应该很快
  90. console.log(`统计查询时间: ${executionTime}ms`);
  91. });
  92. test('大量账户下的性能', async () => {
  93. // 添加多个测试账户
  94. const accountCount = 50;
  95. for (let i = 0; i < accountCount; i++) {
  96. await manager.addAccount({
  97. id: `perf-account-${i}`,
  98. platform: Platform.PACIFICA,
  99. credentials: {
  100. type: 'pacifica',
  101. privateKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
  102. }
  103. });
  104. }
  105. // 测试listAccounts性能
  106. const startTime = Date.now();
  107. const accounts = manager.listAccounts();
  108. const listTime = Date.now() - startTime;
  109. expect(accounts.length).toBeGreaterThanOrEqual(accountCount);
  110. expect(listTime).toBeLessThan(10);
  111. // 测试统计性能
  112. const statsStartTime = Date.now();
  113. const stats = await manager.getStats();
  114. const statsTime = Date.now() - statsStartTime;
  115. expect(stats.totalAccounts).toBeGreaterThanOrEqual(accountCount);
  116. expect(statsTime).toBeLessThan(20);
  117. console.log(`大量账户性能 (${accountCount + 1}个账户):`);
  118. console.log(` 列表查询: ${listTime}ms`);
  119. console.log(` 统计查询: ${statsTime}ms`);
  120. });
  121. });
  122. });