Остановка активного запуска Testcafe - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь добавить функцию остановки в прогон Testcafe. Я запускаю Testcafe с:

let testcafe = null;
let testcafeprom = null;

    testcafeprom = createTestCafe('localhost', 1337, 1338)
        .then(tc => {
            testcafe     = tc;
            const runner = testcafe.createRunner();
            return runner
                .src([__basedir + '/tests/temp.js'])
                .browsers(myBrowser)
                //.browsers('browserstack:Chrome')
                .screenshots(__basedir +'/allure/screenshots/', true)
                .reporter(['uistatusreporter', {name: 'allure',output: 'test/report.json'}])
                .run();
        })
        .then(failedCount => {
            testcafe.close();
            startReportGenerator();
            capcon.stopCapture(process.stdout);
            console.log("Testcafe Ende");


            if(failedCount>0){
                res.sendStatus(400);
                console.log('Tests failed: ' + failedCount);
                //res.statusCode = 400; //BadRequest 400
                /*
                res.json({
                    success: 'failed',
                    fails: failedCount
                });
                */
            }else{
                //res.statusCode = 200; //BadRequest 400
                res.sendStatus(200);
                console.log('All success');
                /*
                res.json({
                    success: 'ok',
                    fails: failedCount
                });
                */
            }
        })
        .catch(error => {
            testcafe.close();
            console.log('Tests failed: Testcafe Error');
            console.log(error);
            res.sendStatus(401);

        });

Затем я добавил функцию для остановки выполнения:

router.get('/stopit', async (req, res) => {

    testcafeprom.cancel();
    res.sendStatus(200);

});

Как я понимаю, createTestCafe будет возвращать обещание, а во всех - остановить обещаниеЯ звоню testcafeprom.cancel(); или testcafeprom.stop();

Но браузер работает и работает. Простой testcafe.close(); остановит завершение Testcafe. Но я хочу остановить это и не сбить его.

Есть ли какие-нибудь предложения, чтобы остановить его лучше?

Обновление: я также проверил способ сделать бегуна в качестве обещания:


    createTestCafe('localhost', 1337, 1338)
        .then(tc => {
            testcafe     = tc;
            const runner = testcafe.createRunner();
            testcafeprom =  runner
                .src([__basedir + '/tests/temp.js'])
                .browsers(myBrowser)
                //.browsers('browserstack:Chrome')
                .screenshots(__basedir +'/allure/screenshots/', true)
                .reporter(['uistatusreporter', {name: 'allure',output: 'test/report.json'}])
                .run();

            return testcafeprom;

        })

Добавление также

await testcafeprom.cancel();

Это будет иметь тот же результат, что и testCafe.close(), то есть все будет сбито без какого-либо ответа. Я смущен.

И наконец я попробовал:

let runner = null;
    createTestCafe('localhost', 1337, 1338, void 0, true)
        .then(testcafe => {
            runner = testcafe.createRunner();
        })
        .then(() => {
            return runner
                .src([__basedir + '/tests/temp.js'])
                .browsers(myBrowser)
                //.browsers('browserstack:Chrome')
                .screenshots(__basedir +'/allure/screenshots/', true)
                .reporter(['uistatusreporter', {name: 'allure',output: 'test/report.json'}])
                .run()
                .then(failedCount => {
                    //testcafe.close();
                    startReportGenerator();
                    capcon.stopCapture(process.stdout);
                    console.log(`Finished. Count failed tests:${failedCount}`);
                    //process.exit(failedCount);
                    res.sendStatus(200);
                });
        })
        .catch(error => {
            startReportGenerator();
            capcon.stopCapture(process.stdout);
            console.log(error);
            //process.exit(1);
            res.sendStatus(401);
        });

Но здесь то же самое. Если я вызываю await runner.stop(), похоже, что команда уничтожит весь процесс и ничего не вернется к обещанию.

Это такой секрет, как остановить работающий экземпляр TestCafe, или секрет, чтовесь процесс сбить?

1 Ответ

2 голосов
/ 08 ноября 2019

Трудно точно сказать, почему вы столкнулись с проблемой, так как я не могу отладить ваш проект. Тем не менее, вы правы, когда используете cancel, чтобы остановить выполнение теста. Метод cancel останавливает выполнение тестов и закрывает браузер, но не останавливает TestCafe. Это означает, что вы можете снова использовать метод run, и он начнет выполнение теста и снова откроет браузеры.

Я создал пример, чтобы продемонстрировать, что этот подход работает.

Тестовый код:

fixture `fixture`
    .page `http://example.com`;

for (let i = 0; i < 50; i++) {
    test(`test A ${i}`, async t => {
        await t.click('h1');
    });
}

Стартовый код Testcafe:

const createTestCafe = require('testcafe');

(async () => {
    const testCafe = await createTestCafe();

    let timeout;

    const runner = testCafe.createRunner();

    const runPromise = runner
        .src('test.js')
        .browsers('chrome')
        .run();

    const cancelPromise = new Promise(resolve => {
        timeout = setTimeout(() => {
            runPromise.cancel();

            resolve('canceled');
        }, 20000);
    });

    let value = await Promise.race([runPromise, cancelPromise]);

    if (value === 'canceled')
        console.log('test execution was canceled')

    value = await runner.run();

    console.log(`${value} failed tests`);

    await testCafe.close();
})();
...