Protractor 为什么cucumber量角器不完全忽略没有要运行的标记的功能文件?

Protractor 为什么cucumber量角器不完全忽略没有要运行的标记的功能文件?,protractor,cucumberjs,Protractor,Cucumberjs,我正在使用cucumber量角器框架来运行功能文件 在我的config.js中,我有: specs: [ "../../features/XXX1.feature", "../../features/XXX2.feature", ... "../../features/XXXn.feature", ], cucumberOpts: { tags: "@mytag", }, 在我的功能文件XXX1

我正在使用cucumber量角器框架来运行功能文件

在我的config.js中,我有:

specs: [
    "../../features/XXX1.feature",
    "../../features/XXX2.feature",
    ... 
    "../../features/XXXn.feature",                            
],

cucumberOpts: {
    tags: "@mytag",
},
在我的功能文件XXX1.feature中,我设置了这个标记“@mytag”:

  @mytag
  Scenario Outline: my Flow
    Given I am running test case one
    ....
但不在任何其他功能文件中,如XXX2.feature、XXX3.feature等

我希望量角器只运行XXX1.feature,而不运行XXX2.feature。在某种程度上,当谈到XXX2.feature时,它启动浏览器,不做任何事情,然后输出以下内容:

[14:35:53] I/testLogger - [chrome #01-2] PID: 14272
[chrome #01-2] Specs: D:\ptfbc\ui\features\XXX2.feature
[chrome #01-2]
[chrome #01-2] [14:35:44] I/hosted - Using the selenium server at http://127.0.0.1:4444/wd/hub
[chrome #01-2]
[chrome #01-2]
[chrome #01-2] 0 scenarios
[chrome #01-2] 0 steps
[chrome #01-2] 0m00.000s
但这还不够好。因为XXX2.feature中没有标记“@mytag”。它不应该跳过功能文件XXX2.feature而根本不启动浏览器吗

为每个没有“@mytag”的不合格要素文件启动浏览器也很耗时

有没有一种配置方法可以避免这种情况

编辑 功能和hook.ts

capabilities: {
    browserName: "chrome",
    shardTestFiles: true,
    maxInstances: 1,
    'chromeOptions': {
        'args': [
            'disable-infobars'//,'headless=true','disable-gpu=true',
        ],
        'prefs': {
            'credentials_enable_service': false,
            'download': {
                'prompt_for_download': false,
                'directory_upgrade': true,
            }
        }
    }
},


const { BeforeAll, After, Status } = require("cucumber");
import * as fs from "fs";
import { browser } from "protractor";
import { config } from "../config/config";  

BeforeAll({timeout: 300 * 1000}, async () => {
    await browser.get(config.baseUrl);
});

After(async function(scenario) {
        // screenShot is a base-64 encoded PNG
         const screenShot = await browser.takeScreenshot();
         this.attach(screenShot, "image/png");
});

你犯了一个小错误,把它改成以前而不是以前

并确保您有一个给定的小黄瓜,以便每个场景都能导航到主页或url

Given I am navigating to homepage

这将有您的
浏览器。导航(url)

对于量角器执行要素文件的过程,它可以分为两个阶段

量角器打开每个要素文件的浏览器实例(创建会话)作为第一阶段,然后量角器将运行任务移交给cucumber作为第二阶段

在第二阶段,cucumber将检测特征文件是否满足标记。如果没有,cucumber将不会为功能文件运行任何方案,并且您将在控制台中获得
0个方案,0个步骤

否则,cucumber将执行那些满足特征文件中标记的场景

因为量角器在打开浏览器之前不负责检测特征文件是否满足标记,因此正如您所看到的
浏览器在不进行任何操作的情况下打开和关闭

唯一的解决方案是在dragrator conf.js中提供满足标签要求的精确的
规范
。为了做到这一点,您需要根据标签过滤特征文件,然后将过滤结果分配给
规格

我做了一个规格过滤器


我有完全相同的问题,问题解决后,删除


shardTestFiles:true

启动浏览器的代码放在哪里了?如果之前的钩子中有代码,这可能就是原因。你能将钩子代码发布到你使用的
shardTestFiles:true
maxInstances:
,请在量角器配置中发布
功能
多功能
(如果你设置了)。js@yong是的,我确实使用了shardTestFiles和maxInstances,maxInstances正在1@KyleFairns嗨,凯尔,请看我的更新。beforeAll只是做一个browser.get()。但我的问题是,如果功能文件没有要运行的标记,那么应该完全跳过它,甚至在之前都不运行。您可以尝试并向我们提供反馈吗?这意味着您自己编写了“/spec.filter.js”,对吗?如果有一个内置的方式从量角器来做这件事,这将是伟大的。但是非常感谢你的解释。是的,我是为了我的项目需要而做的。据我所知,量角器不提供这样的钩子来实现这一点,在conf.js加载到运行时后,将调用exists钩子,如
beforeloanch
onPrepare
。但是在将conf.js加载到运行时之前,我们需要一个钩子来更改规范。(因为量角器没有公开任何API来在运行时修改
config
对象。)
// general config.js
exports.config = {
   specs:[
      './features/**/*.feature'
   ],

   cucubmerOpts: {
      tags: '@abc'
   }
};


// conf.js use my filter
var config = {
   specs:[
      './features/**/*.feature'
   ],

   cucubmerOpts: {
      tags: '@abc'
   }
};

exports.config = require('./spec.filter.js').filter_by_tag(config);