UNPKG

wechaty-puppet-service

Version:
129 lines 4.67 kB
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm "use strict"; /** * Software performance testing * https://en.wikipedia.org/wiki/Software_performance_testing#Testing_types * * 负载测试,并发测试和压力测试,这三者之前的区别和联系? * https://www.zhihu.com/question/269215477/answer/350162604 * * NodeJS: How Is Logging Enabled for the @grpc/grpc.js Package * https://stackoverflow.com/a/60935367/1123955 * GRPC_VERBOSITY=DEBUG GRPC_TRACE=all */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const tstest_1 = require("tstest"); const PUPPET = __importStar(require("wechaty-puppet")); const wechaty_puppet_mock_1 = require("wechaty-puppet-mock"); const mod_js_1 = require("../src/mod.js"); const config_js_1 = require("../src/config.js"); const idToName = (id) => { return `name of ${id}`; }; class PuppetTest extends wechaty_puppet_mock_1.PuppetMock { constructor(...args) { super(...args); } async contactRawPayload(id) { config_js_1.log.verbose('PuppetTest', 'contactRawPayload(%s)', id); const rawPayload = { avatar: '', gender: PUPPET.types.ContactGender.Male, id, name: idToName(id), phone: [], type: PUPPET.types.Contact.Individual, }; await new Promise(resolve => { process.stdout.write(','); setTimeout(() => { process.stdout.write('.'); resolve(); }, 1000); }); return rawPayload; } } tstest_1.test.skip('stress testing', async (t) => { const TOKEN = 'test_token'; const ENDPOINT = '0.0.0.0:8788'; // const DING = 'ding_data' /** * Puppet in Service */ const puppet = new PuppetTest(); const spy = tstest_1.sinon.spy(puppet, 'contactRawPayload'); /** * Puppet Server */ const serverOptions = { endpoint: ENDPOINT, puppet: puppet, token: TOKEN, }; const puppetServer = new mod_js_1.PuppetServer(serverOptions); await puppetServer.start(); /** * Puppet Service Client */ const puppetOptions = { endpoint: ENDPOINT, token: TOKEN, }; const puppetService = new mod_js_1.PuppetService(puppetOptions); await puppetService.start(); let COUNTER = 0; const dongList = []; puppetService.on('dong', payload => { dongList.push(payload.data || ''); }); const timer = setInterval(() => { puppetService.ding(`interval ${COUNTER++}`); }, 10); const CONCURRENCY = 1000; const concurrencyList = [ ...Array(CONCURRENCY).keys(), ].map(String); const resultList = await Promise.all(concurrencyList.map(id => puppetService.contactPayload(id))); console.info(); clearInterval(timer); const actualNameList = resultList.map(payload => payload.name); const EXPECTED_RESULT_LIST = concurrencyList.map(idToName); t.equal(spy.callCount, CONCURRENCY, `should be called ${CONCURRENCY} times`); t.same(actualNameList, EXPECTED_RESULT_LIST, `should get the right result with a huge concurrency ${CONCURRENCY}`); t.ok(dongList.length > 10, `dongList should receive many dong data (actual: ${dongList.length})`); t.equal(dongList[0], 'interval 0', 'dongList should get the first response from counter 0'); /** * Stop * 1. Puppet in Service * 2. Puppet Service Server * 3. Puppet Service Client * */ await puppetService.stop(); await puppetServer.stop(); }); //# sourceMappingURL=performance.spec.js.map