Я запускаю набор тестов с Jest, чтобы продемонстрировать Big O, используя два разных метода для Фибоначчи.
const fastFib = require('./../fastFib');
const slowFib = require('./../slowFib');
test('Fast way of getting Fibonacci of 44', () => {
expect(fastFib(44)).toBe(701408733);
});
test('Slow way of getting Fibonacci of 44', () => {
expect(slowFib(44)).toBe(701408733);
});
Мне интересно, есть ли способ указать максимальную длину теста? Я видел, что вы можете передать третью переменную для асинхронного тайм-аута, но, похоже, это не влияет на обычные функции:
test('Slow way of getting Fibonacci of 44', () => {
expect(slowFib(44)).toBe(701408733);
}, 5000);
Есть ли способ указать максимальное время выполнения функции с помощью Jest?
Поделюсь slowFib.js
для справки:
function fib(n) {
return (n<=1) ? n : fib(n - 1) + fib(n - 2);
}
module.exports = fib;
Я думаю, вам нужно будет реализовать свой собственный таймер (с setTimeout или с помощью Promises). Одной из альтернатив может быть использование ключевого слова async для вашей функции, чтобы она работала со встроенным параметром:
test('Slow way of getting Fibonacci of 44', async () => {
expect(slowFib(44)).toBe(701408733);
}, 5000);
спасибо, но тест все еще проходит, хотя это занимает больше 5 секунд.
поэтому ваш тест приостанавливается из-за выполнения синхронизации - нет возможности прервать это по тайм-ауту. Вам нужно «разделить исполнение». Следующая версия не работает для меня:
test('Slow way of getting Fibonacci of 44', (done) => {
expect(slowFib(44)).toBe(701408733);
setTimeout(done, 10); // smallest timeout possible to make different macrotask
}, 5000);
PS Я также считаю, что это должно быть достигнуто путем оценки теста async
, но пока не понял, как именно.
[UPD] вы действительно можете достичь своей цели, не используя тайм-аут теста:
test('Slow way of getting Fibonacci of 44', () => {
const start = new Date();
expect(slowFib(44)).toBe(701408733);
expect(new Date() - start).toBeLessThan(5000);
});
У меня до сих пор проходит. Я обновил свой вопрос содержанием slowFib.js
, может быть, это имеет значение?
мне это не удается. не уверен, как отлаживать. какой версией Jest пользуетесь?
package.json говорит «шутка»: «^ 24.8.0»
Какую версию ты используешь?
Я использую "23.6.0"
Эй, спасибо за обновление! Просто вижу это сейчас, немного хак, но работает отлично! Собираюсь сделать один тест, чтобы проверить правильный результат, и другой, чтобы убедиться, что он завершается в течение определенного времени.
рад помочь! в любом случае на самом деле понятия не имею, почему тайм-аут в it()
не работает для вас
В вашем тестовом файле вы можете установить
jest.setTimeout(5000);
который переопределяет время ожидания по умолчанию для тестового примера в шутку
Вот функции (удобные для машинописи), вдохновленные предложением @skyboyer.
(протестировано с использованием Jest 24.8.0, но должно быть актуально для любой версии)
// Takes a threshold and a callback.
// if the callback didn't run within the threshold, the returned function will evaluate to a rejected promise.
// else, the returned function will evaluate to a resolved promise with the value returned by 'cb' (T)
const resolveWithin = <T>(threshold: number, cb: () => T): () => Promise<T> => {
return () => {
const start = Date.now();
return Promise.resolve(cb()).then((t: T) => {
const elapsed = Date.now() - start;
if (elapsed > threshold) {
return Promise.reject(elapsed);
}
return Promise.resolve(t);
});
}
};
// Uses "resolveWithin" to ensure a test has run within the threshold.
const withIn = <T>(threshold: number, fn: () => T): () => Promise<T> => {
const cb = resolveWithin(threshold, fn);
// @ts-ignore
return () => {
return cb().catch((elapsed) => {
expect(elapsed).toBeLessThanOrEqual(threshold);
})
}
};
it("example", withIn(1000, () => { ... }));
it("example", withIn(1000, async () => { ... }));
Примечание относительно ответов @Khaled Osman / @HRK44.
Насколько я могу судить, использование любого из подходов не будет отражаться как сбой теста и не будет отображаться в отчетах, созданных Jest.
Я думаю, что здесь вы можете получить более подробную информацию об этом. В основном идет открытая дискуссия по этому поводу.