wechaty-puppet-service
Version:
Puppet Service for Wechaty
129 lines • 4.67 kB
JavaScript
/**
* 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
;