这种问题以前曾被问过,但大多数问题的背景都很复杂。 场景很简单。假设我们正在测试我们最喜欢的TODO应用。 接下来是测试用例: TC00-'用户应该能够将TODO项目添加到TODO列表中' TC01-'用户应该能够重命名TODO项目' TC02-'用户应该能够删除TODO项目' 如果TC00失败,我不想运行TC01和TC02(未添加TODO项,因此我无法删除或重命名)
因此,过去三天我一直在研究这个问题,这个问题最常见的答案是: •您的测试不应相互依赖 •量角器/茉莉花不具有动态打开/关闭测试的功能(“ it”块) 之所以在这里问这个问题,是因为它看起来非常普遍,并且仍然没有明确的建议来解决这个问题(我的意思是我找不到任何东西) 我的JavaScript技能很差,但是我知道我需要玩耍,比如说“通过”(done)“完成”或在测试中添加if……
it('should add a todo' ()=> {
todoInput.sendKeys('test')
addButton.click();
let item = element(by.cssContainingText('.list-item','test')
expect(item.isPresent()).toBe(true)
}
在我的情况下,将项目添加到列表后,大约有15个测试(“ it”块)。如果“父级”测试失败,我想跳过某些测试。 请注意: 有一种解决方案可以在一个失败的情况下跳过所有剩余的测试。这不符合我的需求
答案 0 :(得分:1)
伙计,我花了好几个星期研究这个问题,是的,直到我意识到量角器如何详细工作之前,还没有明确的答案。如果您也了解这一点,就会为您找到最佳选择。
采用简短理论后的解决方案
1)如果您尝试将异步功能传递给describe
,您会发现它会失败,因为它仅接受同步功能
这对您意味着什么,无论您想传递给它的任何条件块都不能基于承诺(Promise ==可以解决问题,但不能立即解决)。您实际上想做的是一个承诺(打开页面,做点什么,然后等待条件是否满足您的条件)
if (conditionIsTrue) { // can't be Promise
it('name', () => {
})
}
那是首先要考虑的...
2)运行量角器时,它将拾取config中指定的规范文件,并建立describe/it
和beforeAll/afterAll
块的队列。重要的信息是在浏览器启动之前发生的。
看这个例子
let conditionIsTrue; // undefined
it('name', () => {
conditionIsTrue = true;
})
if (conditionIsTrue) { // still undefined
it('name', () => {
})
}
到量角器到达if()
语句时,conditionIsTrue
的值仍为undefined
。当浏览器启动时(稍后),它可能会在it
块内被覆盖,但是在构建队列时却不会被覆盖。所以它跳过了。
可能的解决方案
在describe
let conditionIsTrue; // undefined
describe("describe", () => {
it('name1', async () => {
conditionIsTrue = await element.isPresent(); // NOW IT'S TRUE if element is present
})
it('name2', async () => {
if (conditionIsTrue) {
//do whatever you want if the element is present
} else {
console.log("Skipping 'name2' test")
}
})
})
因此,您不会跳过it
块本身,但是可以跳过it
内的任何内容
我发现但从未有过检查机会的另一种可能性是使用Grunt任务运行程序,这可能有助于您实现以下方案
但是说实话,我不明白您为什么要走这条耗时的路线,这需要很多代码...但是就像仅供参考
答案 1 :(得分:0)
量角器提供了一种可以实现您想要实现的目标的方法。 在量角器配置文件中,您可以具有onPrepare函数。实际上,它是一个在量角器准备就绪且可用时以及在执行规范之前调用的回调函数。如果要运行多个功能,则每个功能将运行一次。
现在,据我了解,您需要执行一个测试,或者可以说执行一个父函数,然后根据其输出,您想要运行一些测试,而又不想运行其他测试。
量角器配置文件中的onPrepare函数将如下所示:
onPrepare: async () => {
await browser.manage().window().maximize();
await browser.driver.get('url')
// continue your parent test steps for adding an item and at the last of function you can assign a global variable say global.itemAdded = true/false based on the result of above test steps. Note that you need to use 'global.' here to make it a global variable which will then be available in all specs
}
现在在规格文件中,您可以基于global.itemAdded变量值运行测试(it())
if(global.itemAdded === true) {
it('This test should be running' () => {
})
}
if(global.itemAdded === false) {
it('This test should not be running' () => {
})
}