首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止活动的Testcafe运行

停止活动的Testcafe运行
EN

Stack Overflow用户
提问于 2019-11-07 03:16:34
回答 1查看 1.1K关注 0票数 2

我尝试在Testcafe运行中添加一个stop函数。我用以下命令开始Testcafe:

代码语言:javascript
复制
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);

        });

然后我添加了一个函数来停止运行:

代码语言:javascript
复制
router.get('/stopit', async (req, res) => {

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

});

据我所知,createTestCafe将返回一个promise,并停止我称为testcafeprom.cancel();testcafeprom.stop();的promise

但是浏览器正在运行。一个简单的testcafe.close();就可以停止Testcafe complete。但我想阻止它,而不是击落它。

有没有更好的方法来阻止它?

更新:我还测试了让runner成为promise的方法:

代码语言:javascript
复制
    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;

        })

同时添加

代码语言:javascript
复制
await testcafeprom.cancel();

这将得到与testCafe.close()完全相同的结果,这意味着所有东西都被击落,没有任何响应。我很困惑。

最后我试了一下:

代码语言:javascript
复制
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实例的秘密,还是整个过程被击落的秘密?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 23:24:38

因为我不能调试你的项目,所以很难说你为什么会遇到这样的问题。但是,当您使用cancel停止测试执行时,您是正确的。cancel方法停止测试执行并关闭浏览器,但它不会停止TestCafe。这意味着您可以再次使用run方法,它将启动测试执行并再次打开浏览器。

我创建了一个示例来演示此方法的工作原理。

测试代码:

代码语言:javascript
复制
fixture `fixture`
    .page `http://example.com`;

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

Testcafe开始代码:

代码语言:javascript
复制
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();
})();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58737108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档