Testing TestCafe无法在测试运行之外使用testController(t)(例如,作为跳过测试的条件)

Testing TestCafe无法在测试运行之外使用testController(t)(例如,作为跳过测试的条件),testing,automation,automated-tests,e2e-testing,testcafe,Testing,Automation,Automated Tests,E2e Testing,Testcafe,我试图检查我们正在哪个浏览器上运行测试,然后根据结果跳过测试/夹具(如本文所述) 从“testcafe”导入{t}; 夹具试验` .第页('https://testcafe.devexpress.com') if(t.browser.name.includes('Chrome')){ 测试('is Chrome?',异步()=>{ console.log(t.browser.name); wait t.expect(t.browser.name.includes('Chrome').ok();

我试图检查我们正在哪个浏览器上运行测试,然后根据结果跳过测试/夹具(如本文所述)

从“testcafe”导入{t};
夹具试验`
.第页('https://testcafe.devexpress.com')
if(t.browser.name.includes('Chrome')){
测试('is Chrome?',异步()=>{
console.log(t.browser.name);
wait t.expect(t.browser.name.includes('Chrome').ok();
});
}否则{
test.skip('is Chrome?')
};
结果

ERROR Cannot prepare tests due to an error.

Cannot implicitly resolve the test run in the context of which the test controller action should be executed. Use test function's 't' argument instead.

有什么方法可以在测试之外调用testObject(
t
)吗?

我没有完全解决您的问题的方法。但我认为最好稍微不同一点,这样结果会是一样的,但实现方法会有点不同。让我解释一下

在我看来,将测试用例包装在if语句中不是一个好主意。它通常会使测试文件杂乱无章,因此您不仅可以看到左侧的
test
fixture
,还可以看到使您在读取此类文件时停止的if语句。如果您只想从上到下快速扫描测试文件,则会带来更大的复杂性。

解决方案可以是向您的测试用例介绍(也可以与夹具配合使用)

测试
梅塔先生({
作者:“pavelsaman”,
创作日期:“2020年12月16日”,
浏览器:“chrome”
})
('testforchrome',异步t=>{
//测试步骤
});
然后,您只能对Chrome执行测试,如下所示:

$ testcafe --test-meta browser=chrome chrome
这与您希望通过该条件实现的功能非常相似,但代码的可读性更强

如果您想同时对chrome和firefox执行测试,可以执行更多命令:

$ testcafe --test-meta browser=chrome chrome
$ testcafe --test-meta browser=firefox firefox
或:


如果您的测试在管道中,可能需要分两步完成。

中的一条注释中提到的更好的解决方案是在运行测试时使用runner对象,而不是命令行。您可以将浏览器作为CLI参数传递给顶级脚本,而不是作为可选参数传递

然后从脚本参数或.testcaferc.json文件中读取浏览器变量

您需要使用应用于使用的浏览器标记所有测试/装置

然后使用Runner.filter方法添加一个委托,如果元数据中的浏览器等于顶级脚本中的浏览器变量,则该委托将返回true

var runner = testcafe.createRunner();
var browser = process.env.npm_package_config_browser || require("./testcaferc.json").browser;
var runner.filter((testName, fixtureName, fixturePath, testMeta, fixtureMeta) => {
    return fixtureMeta.browser === browser || testMeta.browser === browser ;
} 

非常好的建议,有很多细节。我的问题是我需要在所有浏览器上运行所有测试。TestCafe新的
多窗口
功能仅在Chrome、FireFox和Edge上受支持…因此,当在不受支持的浏览器上运行时,我想跳过使用此功能的测试。--目前无法使用元数据来记录删除与特定值匹配的测试(即
test.meta({multiWindow:'true'})
)是的,TestCafe有一些限制。也许其他人会找到一种方法。至于排除测试,可能有编程方法(),它解决了您的问题吗?我认为这就是路线(编程忽略/跳过),我需要接受。如果你想把它作为解决方案,我会接受它作为答案。
var runner = testcafe.createRunner();
var browser = process.env.npm_package_config_browser || require("./testcaferc.json").browser;
var runner.filter((testName, fixtureName, fixturePath, testMeta, fixtureMeta) => {
    return fixtureMeta.browser === browser || testMeta.browser === browser ;
}