子任务完成后,使咕gr声运行任务

时间:2019-11-04 19:26:44

标签: javascript protractor gruntjs

问题

我有艰巨的任务来开始自动化测试。逻辑如下:

清理.tmp文件夹->查找.xlx格式的所需数据文件->在.tmp文件夹下以JSON格式转换文件->对转换后的文件开始测试

一切正常,直到数据文件变得很大,并在转换文件的子任务完成之前开始测试

问题

如何让咕gr声等到子任务完成,不多不少?

到目前为止我已经尝试过的

我尝试了几种方法来使convert-data-sheet任务异步进行,而没有任何运气。

1。。很明显,我尝试过的第一件事是

// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {

   let done = this.async();
   /*
    Some code here, not essential to the question
    */
    // run conversion for each sheet
    for (let i = 0; i < sheetTabs.length; i++) {
        dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
        options.sheet = (i + 1).toString();
        convertExcel(src, dst, options);
    }
    done();
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {
    let done = this.async();
    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    grunt.task.run('protractor:configFile');
    done();
});

它仍然尝试在创建数据文件之前运行量角器

2。。这是我当前的代码,仅在指定的时间段内挂起

// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {
    /*
    Some code here, not essential to the question
    */
    // run conversion for each sheet
    for (let i = 0; i < sheetTabs.length; i++) {
        dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
        options.sheet = (i + 1).toString();
        convertExcel(src, dst, options);
    }
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {

    let done = this.async();

    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    // run protractor with a delay 2000ms to let previous tasks finish
    setTimeout(function() {
        grunt.task.run('protractor:configFile');
        done();
    }, 2000);
});

但是事实证明,即使当前的代码也没有达到预期的效果。甚至在数据转换开始之前,它什么也不挂,仅挂了2秒钟。所以从日志中我看到-grunt开始->挂起2000->转换-​​>运行量角器

2 个答案:

答案 0 :(得分:3)

解决方案

// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {

   let done = this.async();
   /*
    Some code here, not essential to the question
    */
    mkdirp(path.resolve(__dirname, './protractor/.tmp_files/test_data'), function(err) {

        // run conversion for each sheet
        for (let i = 0; i < sheetTabs.length; i++) {
            dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
            options.sheet = (i + 1).toString();
            convertExcel(src, dst, options,
                (err, data) => {
                    if (i === (sheetTabs.length - 1)) {
                        done();
                    }
                }
            );
        }
    });
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {

    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    grunt.task.run('protractor:configFile');

});

这种方法有什么特别之处

我不完全了解同步执行任务的情况。

我们都知道这种情况

console.log(1)
setTimeout(function(){console.log(2)}, 1000)
console.log(3)

产生

1
3
2

因为JS只是安排setTimeout并等待1000毫秒,所以它会继续执行脚本

就我而言,您可以将convertExcel视为setTimeout。因此JS安排了转换,然后立即调用了done(),因此Grunt并没有等到实际完成该过程。

幸运的是,excel-as-json模块具有用于传递我执行的回调函数的选项。因此,我要做的就是在最后一张工作表的标签的转换实际完成后调用done()

修复后,我遇到的唯一问题是此错误Fatal error: ENOENT: no such file or directory, mkdir ...,只需将mkdir引入游戏即可解决

重要

这仍然不是理想的,因为如果我的excel文件中有10张纸,而第五张纸最大,但是我仅在等待最后一张纸,它将无法正常工作。但是只要我知道如何解决它,我就会在需要时这样做

答案 1 :(得分:1)

我建议您需要使用信号量变量

https://en.m.wikipedia.org/wiki/Semaphore_(programming)

在这种情况下,创建名为dataLoaded的全局变量并将其设置为false

在完成第一个子任务后,将其设置为true

您的第二个任务可以在启动时检查dataLoaded的值,如果未将其设置为true,请自行调用setTimeout稍等一下,然后重试。 / p>

function foo() {
  if (!dataLoaded) {
    setTimeout(foo, 50)
    return
  }

  ...
}