首页 > 解决方案 > 有没有办法根据其他测试的结果来运行特定的量角器测试?

问题描述

这种问题之前已经被问过,但是这个问题的大部分背景都非常复杂。场景很简单。假设我们正在测试我们最喜欢的 TODO 应用程序。接下来是测试用例: TC00 - '用户应该能够将 TODO 项目添加到 TODO 列表' TC01 - '用户应该能够重命名 TODO 项目' TC02 - '用户应该能够删除 TODO 项目' 我不如果 TC00 失败,想要运行 TC01 和 TC02(未添加 TODO 项,因此我没有什么可删除或重命名的)

所以我过去 3 天一直在研究这个问题,这个问题最常见的答案是: • 你的测试不应该相互依赖 • Protractor/Jasmine 没有动态打开/关闭测试的功能('它'块)我在这里问这个问题的原因是因为它看起来像一个非常普遍的案例并且仍然没有明确的建议来处理这个问题(我的意思是我找不到任何)我的javascript技能很差但我明白我需要玩,让我们说'通过'完成'或在里面添加测试......

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”块)。如果“父”测试失败,我想跳过一些测试。请注意:有一种解决方案可以在失败时跳过所有剩余的测试。这不适合我的需要

标签: javascriptjasmineprotractor

解决方案


伙计,我花了好几个星期研究这个,是的,没有明确的答案,直到我意识到量角器的详细工作原理。如果您也了解这一点,您将找到最适合您的选择。

简短的理论之后的解决方案如下

1)如果您尝试将异步函数传递给describe您会看到它会失败,因为它只接受同步函数

这对您意味着什么,无论您要传递给它的条件是什么,它都不能基于 Promise(Promise == 有时会解决,但不会立即解决)。你想要做的基本上是一个承诺(打开页面,做一些事情,然后等待看看条件是否满足你的标准)

if (conditionIsTrue) { // can't be Promise
  it('name', () => {
  })
}

这是首先要考虑的...

2)当你运行量角器时,它会获取配置中指定的规范文件并构建describe/itANDbeforeAll/afterAll块队列。重要的细节是它发生在浏览器启动之前。

看这个例子

let conditionIsTrue; // undefined
  it('name', () => {
    conditionIsTrue = true;
  })
if (conditionIsTrue) { // still undefined
  it('name', () => {
  })
}

到 Protractor 到达if()语句时, 的值conditionIsTrue仍然是undefined。当浏览器启动时,它可能会在块内部被覆盖it,但在构建队列时不会。所以它跳过它。

换句话说,量角器甚至在打开浏览器之前就知道它将运行哪些描述块,并且在执行期间不能修改此队列

可能的解决方案

1.1 在外部定义一个全局变量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

1.2 使用环境变量,可以使用相同的方法it跨不同规范跳过块。例子:

spec_1.js

describe(`Suite: 1`, () => {
  it("element is present", async () => {
    if (await element.isPresent()) {
      process.env.FLAG = true
    } else {
      process.env.FLAG = false
    }
  });
});

spec_2.js

describe(`Suite: 2`, () => {
  it("element is present", async () => {
    if (process.env.FLAG) {
      // do element specific actions
    }
  });
});
  1. 我发现但从未有机会检查的另一种可能性是使用 Grunt 任务运行器,它可以帮助您实现以下场景

    • 运行量角器以执行一个规范
    • 检查所需条件
    • 将此条件导出到环境变量
    • 出口量角器
    • 在您的 Grunt 任务中,通过再次启动量角器,实现一个条件逻辑来执行其余的条件规范

但老实说,我不明白你为什么要走这条耗时的路线,这需要大量的代码......但仅供参考


推荐阅读