Skip to content

Commit b067643

Browse files
committed
add watch mode, add new reporters
1 parent 94d178f commit b067643

File tree

5 files changed

+46
-34
lines changed

5 files changed

+46
-34
lines changed

__tests__/simple.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
test(`Simple test`, () => {
2-
expect(1).toBe(2)
2+
expect(1).toBe(1)
33
})

cli/easytest.js

+5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ const argv = yargs(hideBin(process.argv))
2222
type: 'boolean',
2323
description: 'Run in observation mode'
2424
})
25+
.option('parallel', {
26+
alias: 'p',
27+
type: 'boolean',
28+
description: 'Run in parallel mode'
29+
})
2530
.option('include', {
2631
alias: 'i',
2732
type: 'string',

src/core/parallel-runner.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Worker } from 'worker_threads';
22
import path from 'path';
33
import { fileURLToPath } from 'url';
44

5-
// Получаем правильный путь к worker.js относительно текущего модуля
5+
// Отримуємо правильний шлях до worker.js відносно поточного модуля
66
const __dirname = path.dirname(fileURLToPath(import.meta.url));
77
const workerPath = path.join(__dirname, '..', 'workers', 'worker.js');
88

@@ -12,12 +12,12 @@ export async function parallel(testQueue, maxWorkers = 4) {
1212
let failedTests = 0;
1313
let coverage = [];
1414

15-
// Разделяем файлы на группы для параллельного запуска
15+
// Розділяємо файли на групи для паралельного запуску
1616
for (let i = 0; i < files.length; i += maxWorkers) {
1717
chunks.push(files.slice(i, i + maxWorkers));
1818
}
1919

20-
// Выполняем тесты для каждого чанка
20+
// Виконуємо тести для кожного чанка
2121
for (const chunk of chunks) {
2222
const workerPromises = chunk.map(file => {
2323
return new Promise((resolve, reject) => {
@@ -54,12 +54,12 @@ export async function parallel(testQueue, maxWorkers = 4) {
5454
});
5555
});
5656

57-
// Ждем завершения всех тестов в текущем чанке
57+
// Чекаємо завершення всіх тестів у поточному чанку
5858
const results = await Promise.all(workerPromises);
5959
failedTests += results.reduce((sum, val) => sum + val, 0);
6060
}
6161

62-
// Возвращаем количество проваленных тестов и данные о покрытии
62+
// Повертаємо кількість провалених тестів та дані про покриття
6363
return {
6464
failedTests,
6565
coverage

src/core/runner.js

+16-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const setupAndTeardown = async (funcs, type) => {
2525

2626
export const runner = async (queue, options) => {
2727
const startTime = process.hrtime()
28-
const {verbose, test: spec, skip} = options
28+
const {verbose, test: spec, skip, parallel} = options
2929

3030
let passedTests = 0
3131
let failedTests = 0
@@ -39,7 +39,7 @@ export const runner = async (queue, options) => {
3939
}
4040
totalTestCount += q[1].tests.length;
4141
}
42-
if (!verbose) {
42+
if (!verbose && !parallel) {
4343
log(`\n`)
4444
progressBar = new ProgressBar(totalTestCount);
4545
}
@@ -134,7 +134,9 @@ export const runner = async (queue, options) => {
134134
if (verbose) {
135135
logExpect(test.name, expect, testDuration)
136136
} else {
137-
progressBar && progressBar.increment();
137+
if (!parallel) {
138+
progressBar && progressBar.increment();
139+
}
138140
}
139141
}
140142

@@ -197,7 +199,9 @@ export const runner = async (queue, options) => {
197199
if (verbose) {
198200
logExpect(test.name, expect)
199201
} else {
200-
progressBar && progressBar.increment();
202+
if (!parallel) {
203+
progressBar && progressBar.increment();
204+
}
201205
}
202206
}
203207
}
@@ -209,16 +213,19 @@ export const runner = async (queue, options) => {
209213
const [seconds, nanoseconds] = process.hrtime(startTime);
210214
const duration = (seconds * 1e9 + nanoseconds) / 1e6;
211215

212-
log(`\n`)
216+
if (!parallel) { log(`\n`) }
217+
213218
for (const [file, result] of Object.entries(global.testResults)) {
214219
const fileStatus = result.completed ? chalk.green('🟢') : chalk.red('🔴')
215220
log(`${fileStatus} ${file}...${result.completed ? chalk.green("OK") : chalk.red("FAIL")} 🕑 ${chalk.whiteBright(`${result.duration} ms`)}`)
216221
}
217222

218-
log(chalk.gray(`------------------------------------------------`))
219-
log(`${chalk.gray("Tests completed in")} ${chalk.whiteBright.bold(duration)} ms`)
220-
log(`${chalk.gray("Total")}: ${chalk.blue.bold(totalTests)}, ${chalk.gray("Passed")}: ${chalk.green.bold(passedTests)}, ${chalk.gray("Failed")}: ${chalk.red.bold(failedTests)}`)
221-
log(`\n`)
223+
if (!parallel) {
224+
log(chalk.gray(`------------------------------------------------`))
225+
log(`${chalk.gray("Tests completed in")} ${chalk.whiteBright.bold(duration)} ms`)
226+
log(`${chalk.gray("Total")}: ${chalk.blue.bold(totalTests)}, ${chalk.gray("Passed")}: ${chalk.green.bold(passedTests)}, ${chalk.gray("Failed")}: ${chalk.red.bold(failedTests)}`)
227+
log(`\n`)
228+
}
222229

223230
return failedTests
224231
}

src/workers/worker.js

+19-19
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@ import { hooksRegistry } from '../core/hooks.js';
1010
import { registerGlobals } from '../core/registry.js';
1111
import { coverageFilter } from '../core/coverage.js';
1212

13-
// Получаем данные о файле теста из основного потока
13+
// Отримуємо дані про файл тесту з основного потоку
1414
const { file, config: workerConfig } = workerData;
1515

16-
// Асинхронное выполнение тестов в отдельном потоке
16+
// Асинхронне виконання тестів в окремому потоці
1717
async function runTest() {
18-
// Инициализация глобальных объектов
18+
// Ініціалізація глобальних об'єктів
1919
global.config = workerConfig;
2020
global.passed = {};
2121

22-
// Регистрируем глобальные функции и переменные
22+
// Реєструємо глобальні функції та змінні
2323
registerGlobals();
2424

25-
// Настройка DOM если требуется
26-
if (config.dom) {
25+
// Налаштування DOM якщо потрібно
26+
if (global.config.dom) {
2727
await DOM.setup();
2828
}
2929

30-
// Инициализация сессии для измерения покрытия кода
30+
// Ініціалізація сесії для вимірювання покриття коду
3131
let session;
32-
let coverage = null;
32+
let coverage = null;
3333
session = new inspector.Session();
3434
session.connect();
3535

@@ -39,40 +39,40 @@ async function runTest() {
3939
detailed: true
4040
});
4141

42-
// Подготавливаем очередь для тестируемого файла
42+
// Підготовка черги для тестованого файлу
4343
testQueue.setCurrentFile(file);
4444
hooksRegistry.clearFileLevelHooks();
4545

46-
// Импортируем тестовый файл
46+
// Імпорт тестового файлу
4747
const fileUrl = pathToFileURL(realpathSync(file)).href;
4848
await import(fileUrl);
4949

50-
// Создаем временную очередь только для этого файла
50+
// Створюємо тимчасову чергу тільки для цього файлу
5151
const fileQueue = new Map();
5252
fileQueue.set(file, testQueue.getQueue().get(file));
5353

54-
// Запускаем тесты для этого файла
55-
const result = await runner(fileQueue);
54+
// Запускаємо тести для цього файлу
55+
const result = await runner(fileQueue, config);
5656

57-
// Собираем информацию о покрытии кода
57+
// Збираємо інформацію про покриття коду
5858
const coverageData = await session.post('Profiler.takePreciseCoverage');
5959
await session.post('Profiler.stopPreciseCoverage');
6060
coverage = coverageFilter(coverageData);
6161

62-
// Очищаем DOM, если он был инициализирован
63-
if (config.dom) {
62+
// Очищення DOM, якщо він був ініціалізований
63+
if (global.config.dom) {
6464
await DOM.bye();
6565
}
6666

67-
// Отправляем результат обратно в основной поток
67+
// Відправляємо результат назад в основний потік
6868
parentPort.postMessage({
6969
file,
7070
result,
7171
coverage
7272
});
7373
}
7474

75-
// Обработка ошибок
75+
// Обробка помилок
7676
process.on('unhandledRejection', (reason) => {
7777
parentPort.postMessage({
7878
file,
@@ -85,7 +85,7 @@ process.on('unhandledRejection', (reason) => {
8585
process.exit(1);
8686
});
8787

88-
// Запускаем выполнение тестов
88+
// Запускаємо виконання тестів
8989
runTest().catch(error => {
9090
parentPort.postMessage({
9191
file,

0 commit comments

Comments
 (0)