Всем привет!
Покрываю приложение тестами. Начать решил с хелперов, как с самых стабильных частей приложения.
Раньше тесты практически не писал, да и вообще, нет уверенности, что всё делаю правильно...).
Для тестирования используется Jest. Само приложение на TypeScript.
Написав некоторое количество тестов с определенным количеством кейсов, понял что на каждый хелпер уходит, в среднем, по 10 с., что, как мне кажется, слишком много для атомарных функций без внешних зависимостей. Кейсов в тесте, обычно около 3х. Бывает и больше, но время прохождения, всё-равно, примерно одинаковое. Рабочая машина мощная – 16 GB ОЗУ, Core i7. Оболочка – WSL.
Мне интересно, сколько времени занимают такие тесты у вас.
Пример тестаimport { nameMock } from '@app/mocks';
import { incrementName } from './increment-name.helper';
describe('increment-name.helper.ts', () => {
const nameSample: string = nameMock;
const incrementedNameSample: string = `${nameMock} (1)`;
const incrementedTwiceNameSample: string = `${nameMock} (2)`;
it('should not increment name if namespace is empty', () => {
expect(incrementName(nameSample)).toBe(nameSample);
});
it('should increment name if there is the same name in namespace', () => {
expect(incrementName(nameSample, [nameSample])).toBe(incrementedNameSample);
});
it('should increment name if there is incremented name in namespace', () => {
expect(incrementName(nameSample, [nameSample, incrementedNameSample])).toBe(incrementedTwiceNameSample);
});
});
Пример хелпераimport { isNullOrUndefined } from './is-null-or-undefined.helper';
const getCurrentIncrement: (stringToCheck: string) => number = (stringToCheck: string): number => {
const incrementedNamePattern: RegExp = new RegExp(/.*[ ][(](\d){1,}[)]$/, 'gm');
const incrementPattern: RegExp = new RegExp(/[(](\d){1,}[)]$/, 'gm');
const stringMatchesNamePattern: boolean = incrementedNamePattern.test(stringToCheck);
if (!stringMatchesNamePattern) {
return 0;
}
const bracedIncrement: string = incrementPattern.exec(stringToCheck)[0];
enum bracketIndex {
left = 1,
right = bracedIncrement.length - 1
}
const increment: number = Number(bracedIncrement.substring(bracketIndex.left, bracketIndex.right));
return !isNullOrUndefined(increment) && !isNaN(increment) ? increment : 0;
};
export const incrementName: (currentName: string, namesArray?: string[]) => string = (
currentName: string,
namesArray: string[] = []
): string => {
if (!Array.isArray(namesArray) || namesArray.length === 0) {
return currentName;
}
const matchingNames: string[] = namesArray.filter((innerName: string) => innerName.includes(currentName));
if (matchingNames.length === 0) {
return currentName;
}
const highestExistingIncrement: number = matchingNames.reduce(
(previousInnerIncrement: number, currentInnerName: string) => {
const currentInnerIncrement: number = getCurrentIncrement(currentInnerName);
return currentInnerIncrement > previousInnerIncrement ? currentInnerIncrement : previousInnerIncrement;
},
0
);
return `${currentName} (${highestExistingIncrement + 1})`;
};